CVE-2026-34380OpenEXR是电影行业广泛使用的图像存储格式规范及参考实现。在3.2.0至3.2.7、3.3.9和3.4.9之前的版本中,src/lib/OpenEXRCore/internal_pxr24.c文件的undo_pxr24_impl()函数存在安全漏洞。该漏洞源于表达式(uint64_t)(w * 3)在计算时,先将w作为32位有符号整数进行乘法运算,导致大数溢出时发生补码回绕。攻击者可利用此特性构造特殊的宽高比参数,使边界检查被错误绕过,进而导致解码循环向输出缓冲区写入超出预定范围的数据,引发缓冲区溢出。
该漏洞的根本原因在于C语言中的整数类型提升与溢出行为。在undo_pxr24_impl()函数的第377行,代码使用(uint64_t)(w * 3)来计算所需的空间或偏移量。由于w是32位整数,w * 3的操作首先在32位有符号整数域内完成。当w的值足够大时,w * 3的结果会超过32位有符号整数的最大值(INT_MAX)。在大多数未启用整数溢出保护(如 sanitizers)的编译器构建中,这种溢出会表现为“补码回绕”,即结果变为一个很小的正整数或负数。随后,这个回绕后的值被转换为uint64_t。由于转换发生在溢出之后,uint64_t得到的也是一个较小的值。程序随后使用这个较小的值进行边界检查,导致检查通过。然而,后续的解码循环可能直接使用了原始的、巨大的w值作为迭代次数,导致程序向dout指针写入的数据量远超实际分配的缓冲区大小,从而造成堆内存破坏。