内容提要
uv发布安全公告CVE-2025-54368,影响v0.8.5及之前版本,建议升级至v0.8.6。漏洞源于uv异步ZIP解析器与其他解析器存在两处分歧:悬空本地文件条目和中央目录偏移量解释不同,攻击者可构造ZIP使不同安装器解压结果不同且摘要不变。经排查PyPI未被利用,已加检查。uv已修复并主动拒绝多种畸形ZIP。
延伸解读
漏洞影响范围与修复版本
该漏洞影响uv v0.8.5及之前版本,攻击者可构造特殊ZIP文件,使uv与其他ZIP解析器(如pip)解压结果不同,且保持ZIP的加密摘要不变。这可能导致恶意载荷在目标安装器上被解压,而其他工具或扫描器看到无害内容。uv已在v0.8.6中修复,建议用户尽快升级。
实际风险与PyPI防护
经与Python安全响应团队和PyPI维护者排查,未发现该漏洞在PyPI上被利用。PyPI已增加上传检查,防止未来上传可能利用此差异的发行版。对于大多数用户,风险较低,但使用第三方包索引的用户应评估其非PyPI源,检查是否存在差异ZIP。
升级注意事项与兼容性
升级到uv v0.8.6通常不会引入破坏性变更。对PyPI前15,000个包的审查仅发现三个发行版存在ZIP编码错误,且均为无害的归档错误。若遇到破坏性变更,可设置环境变量UV_INSECURE_NO_ZIP_VALIDATION=1恢复旧行为,并向上游报告畸形发行版。
ZIP解析差异的根源与生态影响
漏洞源于ZIP格式的模糊性:本地文件条目与中央目录可能不一致,且中央目录偏移量是绝对还是相对未明确定义。uv的异步流式解析器与其他解析器处理方式不同,导致解压差异。该问题不仅限于uv,其他ZIP消费者也可能受影响,需生态协同解决。
Q&A
uv 安全公告 CVE-2025-54368 影响了哪些版本?如何修复?
该漏洞影响 uv v0.8.5 及之前的所有版本。用户应升级到 v0.8.6 或更高版本以修复漏洞。
CVE-2025-54368 漏洞的具体成因是什么?
漏洞源于 uv 的异步 ZIP 解析器与其他 ZIP 解析器之间存在两处分歧:一是对悬空本地文件条目的处理不同,二是对中央目录偏移量的解释不同(绝对 vs 相对)。攻击者可构造 ZIP 文件,使其在不同安装器(如 uv 和 pip)中解压结果不同,同时保持整体加密摘要不变。
这个 ZIP 解析差异漏洞是否已被利用?PyPI 采取了什么措施?
经 Python 安全响应团队和 PyPI 维护者排查,确认在漏洞存在期间未被通过 PyPI 利用。PyPI 维护者已增加额外检查,防止未来上传可能利用这些差异的发行版。
升级到 uv v0.8.6 会导致现有包无法安装吗?
对大多数用户而言,升级到 uv v0.8.6 不会造成破坏性变更。审查 PyPI 前 15,000 个包仅发现三个发行版存在无害的 ZIP 编码错误,uv 允许这类无害错误,但会拒绝可能被利用的差异。若遇到破坏性变更,可设置环境变量 UV_INSECURE_NO_ZIP_VALIDATION=1 恢复旧行为,并向上游报告问题。
uv 在 v0.8.6 中做了哪些修复和加固?
uv 现在会核对本地文件条目与中央目录文件头,拒绝任何不一致的 ZIP;在流式解析时完全消费中央目录(包括 EOCDR),确保没有尾部数据被解释为第二个 ZIP。此外还主动拒绝多种畸形 ZIP,包括大小不匹配、CRC32 校验错误、EOCDR 注释字段包含 ZIP 控制结构等。
为什么 ZIP 格式容易产生解析差异?其他安装器需要担心吗?
ZIP 格式规范存在多处歧义(如偏移量是相对还是绝对不明确),且其“头在后”的设计鼓励不同的解析策略(前向流式解析 vs 后向扫描),导致解析差异。该漏洞不仅影响 uv,也影响整个 Python 生态及其他使用 ZIP 的打包生态。其他安装器和 ZIP 消费者应考虑类似的加固措施。