漏洞总结:png_set_PLTE, png_set_tRNS, png_set_hIST 中的 Use-after-free 漏洞概述 在 库中,当使用 、 或 等 getter 函数返回的指针直接调用对应的 setter 函数(如 )时,会发生 Use-after-free (UAF) 漏洞。 根本原因: Getter 函数直接返回内部缓冲区指针(例如 )。而 Setter 函数在复制数据前会先释放现有的内部存储( )。如果调用者传递的是 getter 返回的内部指针,Setter 在释放该内存后,再尝试从该指针复制数据,导致访问已释放的内存。 影响范围 受影响的函数: , , 。 触发场景: 典型的 "get, inspect, set back" 模式,或者包装层直接转发 libpng 内部指针的场景。 后果: Heap use-after-read (堆后读)。 在启用 AddressSanitizer (ASan) 的构建中会导致进程崩溃。 在非 ASan 构建中表现为未定义行为(Undefined Behavior)。 可能导致程序崩溃、非确定性行为或堆数据泄露。 POC 代码 (Reproduction) 以下是页面中提供的复现代码,展示了如何通过 获取指针并再次传入 来触发漏洞: 修复方案 建议的修复措施包括: 1. 检测别名: 在释放内存之前,检测传入的指针是否与内部缓冲区别名(aliasing)。 2. 先复制后释放: 在释放旧的内部存储之前,先将调用者传入的指针数据复制到临时缓冲区中。 3. 回归测试**: 添加测试用例,确保 返回的指针再次传入 时不会导致 UAF。