CVE-2026-33021libsixel是源自kmiya的sixel的SIXEL编码/解码实现。在1.8.7及更早版本中,sixel_encoder_encode_bytes()函数存在释放后重用漏洞。漏洞成因是sixel_frame_init()直接存储了调用者拥有的像素缓冲区指针,当触发调整大小操作时,sixel_frame_convert_to_rgb888()无条件释放了该缓冲区,导致调用者持有的指针变为悬垂指针。攻击者可利用此漏洞造成可靠崩溃或潜在的代码执行。
该漏洞主要源于 libsixel 对像素缓冲区指针的生命周期管理不当。在初始化阶段,sixel_frame_init() 函数直接保存了调用者传入的像素缓冲区指针到 frame->pixels 中,而未进行防御性的内存拷贝。当后续逻辑触发 resize 操作时,sixel_frame_convert_to_rgb888() 函数会无条件释放该调用者拥有的缓冲区,并用新的内部分配替换它。此时,原始调用者仍持有指向已释放内存的悬垂指针。任何后续对该缓冲区的访问都会构成释放后重用(UAF)。攻击者若能控制输入帧数据,即可反复且可预测地触发此 Bug,导致程序崩溃,且在特定条件下存在潜在的代码执行风险。