给 Rust 生态重写一个 tar 解析器:快一倍,还要消灭解析差异
来源:astral.sh — 2026-10-27
📋 概述
uv 从 0.13 起改用自研的 tar-codec 解析源码分发包,速度约为旧的 astral-tokio-tar 两倍,同时大幅缩小解析差异和其他安全风险敞口。文章先花了很长篇幅讲 tar 这个格式的历史包袱:它是 512 字节定长块的磁带格式,V7、UStar/pax、GNU tar 三支演化出各自的长度与文件名限制,而块内空洞填什么格式毫不过问。正是这种松弛让攻击者能构造出「同一个包,PyPI 看到的是安全的,uv 解出来是危险的」解析差异。最终团队判断 tokio-tar 家族天生过于宽松,决定从零重写。
🔑 核心要点
- 动机是安全不是性能:同一份 tarball 让索引和安装器看到不同内容的解析差异,是这次重写的起点
- 差异分两档:追加式差异能给特定受害者加文件或改内容,完全差异能让不同解析器解出完全不同的内容
- tar 是块格式,所有块恒为 512 字节,头部块声明后续成员的大小与路径,没有文件级头部
- 格式对空洞没有立场:填充区原本应是 NUL,但填未初始化内存甚至动画台词也行,这就是差异的温床
- 空间效率也差:513 字节的文件最少占 1536 字节,1000 个一字节文件至少 1025 KiB
- 结论是无法在旧代码上补约束:对既有非 Astral 使用者来说,改造比重写更容易出错
💡 金句
tar-codec grew directly out of that effort: we ultimately came to the conclusion that the tokio-tar family was too lenient by design.
👍 0
👎 0
← 返回 Lobsters 首页