CVE-2026-22801libpng是一个用于读取、创建和操作PNG(便携式网络图形)光栅图像文件的参考库。该漏洞存在于libpng 1.6.26至1.6.53版本中的png_write_image_16bit和png_write_image_8bit函数中。由于这些函数存在整数截断问题,当调用者提供负的行跨度(用于自底向上的图像布局)或超过65535字节的跨度时,会导致堆缓冲区越界读取(heap buffer over-read)。该漏洞于2016年10月在libpng 1.6.26版本中引入,最初是为了消除16位系统上的编译器警告而添加的类型转换。攻击者可通过诱使受害者处理特制的PNG图像文件来触发此漏洞,读取堆内存中的敏感信息。由于该漏洞的可用性影响为高( Confidentiality: Low, Integrity: None, Availability: High),可能导致程序崩溃或信息泄露。
该漏洞的根本原因在于libpng 1.6.26版本中为解决16位系统编译器警告而添加的类型转换。在png_write_image_16bit和png_write_image_8bit函数中,行跨度参数(row_stride)被转换为uint32_t类型,但实际分配缓冲区时使用的是size_t类型。当传入负数(被解释为非常大的正数)或超过65535的值时,会导致分配的缓冲区大小与实际访问的内存大小不匹配。具体来说:1) png_write_image_8bit函数在处理行跨度时,将32位整数截断为16位或更小的值;2) 当row_stride超过PNG_SIGNATURE_SIZE(8字节)但转换后被截断时,后续的内存访问操作可能超出分配的堆缓冲区边界;3) 攻击者可构造包含特定元数据的PNG文件,强制libpng以异常的行跨度参数调用写入函数,从而触发越界读取。成功利用此漏洞可导致敏感堆内存信息泄露或应用程序崩溃。