漏洞总结 漏洞概述 该漏洞存在于 libpng 库中,涉及 PLTE, tRNS, 和 sBIT 这三个数据块的 getter 和 setter API 使用模式。当用户将 getter(如 )返回的指针直接传递给对应的 setter(如 )时,会导致 setter 尝试读取一个“过期指针”(stale pointer)。这是因为 setter 在写入数据前可能会释放旧的内部存储,而 getter 返回的指针恰好指向这块即将被释放的内存。 影响范围 受影响组件: libpng 库。 受影响功能: PLTE (Palette), tRNS (Transparency), sBIT (Significant Bits) 的获取与设置 API。 触发条件: 调用者将 getter 返回的指针直接作为参数传递给 setter。 修复方案 在 setter 释放旧的内部存储之前,先将调用者提供的数据复制到一个栈本地缓冲区(stack-local buffer)中。这样可以确保 setter 在读取数据时,数据是安全的,不会因为内部存储的释放而变成悬空指针。 相关代码 (POC/测试代码)** 截图中包含的 文件展示了触发该逻辑的测试用例(Roundtrip tests),用于验证修复是否有效。以下是关键代码块: