zlib 1.3.1 相比 1.3 修复了哪些问题?
更新时间
zlib 1.3.1 相对 1.3 的更新集中在安全加固和缺陷修复上,主要包括:minizip 拒绝 zip 头字段溢出、修复 inflateSync() 处理位缓冲区数据时的错误、为 ERR_MSG() 宏增加边界检查、中和 miniunz 的 zip 路径遍历攻击,以及修正 minizip 中 Zip64 结束记录是否输出的判断、修复 ZLIB_DEBUG 编译下 check_match() 的缺陷,并新增 LIT_MEM 编译选项以用更多内存换取少量 deflate 速度提升。这些内容来自 zlib 官网的版本更新说明。
各项修复的具体含义
minizip:拒绝 zip 头字段溢出
minizip 在读取 zip 头字段时,如果字段值超出可表示范围,旧版本可能接受并继续处理。1.3.1 改为直接拒绝这类溢出输入,避免后续计算基于错误数值展开。对使用 minizip 解析外部 zip 文件的程序,这一条直接降低了解析异常文件时的风险。
修复 inflateSync() 对位缓冲区数据的处理
inflateSync() 用于在解压流中跳过损坏数据、寻找下一个同步点。当待处理数据位于位缓冲区(bit buffer)中时,1.3 存在判断错误。1.3.1 修正了该场景,使同步恢复在数据未按字节对齐时也能正确工作。
为 ERR_MSG() 宏增加边界检查
ERR_MSG() 是 zError() 使用的内部宏。1.3.1 为其增加边界检查,防止错误码越界访问消息表。这类问题通常只在异常错误码路径上触发,属于防御性修复。
中和 miniunz 的 zip 路径遍历攻击
miniunz 是 minizip 附带的解压示例工具。旧版本在解压时可能受构造的路径名影响,把文件写到目标目录之外(路径遍历)。1.3.1 对路径做了中和处理。若你在脚本或服务中调用 miniunz 解压不可信 zip,应升级到 1.3.1 或更高版本。
其他修复与改动
- 修正 minizip 中是否输出 Zip64 结束记录的判断逻辑。
- 修复
ZLIB_DEBUG编译模式下check_match()的缺陷。 - 新增
LIT_MEM编译定义:用更多内存换取小幅 deflate 速度提升,属于可选权衡,默认不启用。
升级判断
| 你的使用场景 | 建议 |
|---|---|
| 用 minizip 解析或解压外部来源的 zip | 升级,涉及溢出拒绝与路径遍历修复 |
调用 inflateSync() 从损坏流中恢复 |
升级,位缓冲区场景已修正 |
| 仅使用核心 deflate/inflate 且输入可信 | 修复相关但风险较低,可随常规版本更新升级 |
| 追求 deflate 速度且能接受更多内存 | 可评估启用 LIT_MEM |
需要注意,1.3.1 之后官网已发布 1.3.2(2026 年 2 月 17 日),其中包含针对 7ASecurity 审计结果的修复,例如 crc32_combine 系列的负长度检查、inflateCopy 仅复制已初始化窗口内容等。新项目直接采用 1.3.2 更合适;若你正停留在 1.3,至少应升到 1.3.1 以覆盖上述问题。