Rust 的 zip crate 被披露一个很有意思的漏洞,CVE-2026-115905,CVSS 10,被称为 Zip Cloaking。
漏洞本质是解析差异
ZIP 格式里文件名存了两份:一份在中央目录(Central Directory),一份在每个条目自己的本地文件头(Local File Header)。规范上这两份应该一致,但实际文件里可以不一致。zip crate 的 ZipArchive 在读目录信息时信任中央目录里的文件名,而 ZipStreamReader 在流式解压时用的是本地文件头里的文件名,两者从来不做对账。
攻击怎么构造
构造一个压缩包,中央目录里写的是无害的文件名比如 report.txt,本地头里写的是 ../../.ssh/authorized_keys 或者某个会被执行的脚本路径。安全扫描器看到的是 report.txt,判定通过;实际解压时写到了完全不同的位置。这就是「Zip Cloaking」这个名字的由来。
谁受影响
所有接受用户上传 ZIP 的应用,尤其是那些「先扫描再解压」的流程。CI/CD 管道里解压构建产物的环节同样危险,因为一次写入就可能污染后续构建。漏洞影响 zip crate 到 9.0.4。
修复与加固
升级 crate。除此之外,解压这类不可信压缩包时建议自己再做一层防护:解压前遍历所有条目,校验中央目录与本地头的文件名是否一致、路径规范化后是否仍在目标目录内、有没有软链接条目、解压后的大小是否与声明一致。这几条检查加起来不到一百行代码,能挡住绝大多数压缩包路径穿越的变种。
更普遍的启示
凡是「校验」和「使用」由两段不同代码完成的地方,都存在这类差异攻击的空间。同一个文件、同一个 URL、同一个域名,不同解析器看到不同结果。安全设计的核心原则之一是校验和使用必须建立在同一份解析结果上。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。