Libsixel 堆溢出 CVE-2026-44636 允许攻击者触发 RCE
CVE-2026-44636 (CVSS 7.8): 在 libsixel 1.8.7-r1 及更早版本中存在一个有符号整数溢出,允许攻击者通过精心制作的 SIXEL 图像触发堆缓冲区溢出,从而可能...

执行摘要
libsixel,一个广泛使用的SIXEL图像编码器/解码器库,存在一个签名整数溢出漏洞,跟踪编号为CVE-2026-44636,CVSS评分为7.8,可以被利用来触发堆缓冲区溢出。这个缺陷影响所有版本直到包括1.8.7-r1的libsixel。攻击者如果向使用该库的应用程序提供特别制作的SIXEL图像,可以在易受攻击进程的上下文中实现远程代码执行(RCE)。截至本文撰写时,尚未发布官方补丁,尽管维护者已通过GitHub安全通告(GHSA-hx93-w8p2-ffh5)承认了这个问题。
技术分析
漏洞位于libsixel编码流程中的sixel_encode_highcolor函数。根据在项目GitHub仓库上发布的通告,该函数通过将width和height参数作为普通签名int值相乘来计算分配大小。公共sixel_encode入口点仅验证两个维度都大于零,没有对它们的大小设置上限。
当width和height足够大时,它们的乘积溢出一个签名的32位整数,回绕到一个小的或负的值。这个截断的值随后被传递给内存分配例程,分配的缓冲区远小于所需的大小。编码函数中的后续写操作随后溢出这个过小的堆缓冲区,破坏相邻的内存。
通告指出,溢出是在分配大小计算期间触发的,特别是在以下行中:
size_t alloc_size = width * height * sizeof(uint32_t);
由于width和height是int类型,乘法发生在签名整数算术中,然后被转换为size_t。控制两个维度的攻击者可以导致width * height溢出,产生一个小的正数或负数结果。一个负值,在隐式转换为size_t(一个无符号类型)时,变成一个非常大的正数,导致分配失败或意外地分配一个非常大的缓冲区,但随后的逻辑期望一个缓冲区大小适合原始维度。通告澄清说,实际可利用的条件是跟随过小分配的堆缓冲区溢出。
没有公开发布概念验证漏洞利用代码,但通告指出,该问题可以通过任何调用sixel_encode并带有攻击者提供的宽度和高度值的应用程序来达到。使用libsixel进行图像转换、终端图形渲染或缩略图生成的库和工具可能受到影响。
缓解措施与建议
截至2026年5月15日,尚未发布libsixel的修补版本。项目维护者尚未指明修复的时间表。防御者应采取以下步骤:
- 在任何使用libsixel并接受不受信任图像输入的应用程序中禁用SIXEL处理。这是在补丁可用之前最有效的缓解措施。
- 在应用层应用输入验证:在将图像传递给libsixel之前,拒绝宽度或高度值超过安全阈值的图像(例如,16,384像素)。
- 监控libsixel GitHub仓库,等待发布1.8.7-r2或更高版本,预计该版本将包括对乘法的界限检查。
- 考虑在安全关键的上下文中使用内存安全的替代品进行SIXEL编码/解码,例如使用检查算术的实现或用内存安全语言编写的实现。
订阅更新
将最新的网络安全资讯直接发送到您的邮箱。

