CVE-2026-33023libsixel是一个SIXEL图像编码/解码器实现。在1.8.7及更早版本中,如果使用--with-gdk-pixbuf2选项构建,loader.c文件中的load_with_gdkpixbuf()函数存在释放后重用漏洞。问题在于清理路径手动释放了sixel_frame_t对象及其内部缓冲区,未遵循引用计数机制,导致回调持有的指针变为悬空指针。攻击者可利用特制图像触发此漏洞,可能造成信息泄露、内存破坏甚至代码执行。
该漏洞的根本原因在于代码库中清理策略的不一致性。sixel_frame_t对象是通过引用计数构造函数sixel_frame_new()创建的,并暴露给公共回调。在正常的清理路径(如load_with_builtin())中,系统使用sixel_frame_unref()来管理生命周期。但在load_with_gdkpixbuf()函数中,清理代码绕过了引用计数机制,直接手动调用free()释放了sixel_frame_t对象及其内部缓冲区。当公共回调调用sixel_frame_ref(frame)试图保留逻辑上有效的引用时,由于主函数load_with_gdkpixbuf()返回后内存已被释放,回调将持有一个悬空指针。任何后续对该帧或其字段的访问都会触发释放后重用(UAF)条件,攻击者可通过特制的图像文件利用此漏洞进行内存破坏,进而可能实现任意代码执行。AddressSanitizer能够确认此内存错误。