“Astral-tokio-tar”/“uv” 任意写入路径遍历漏洞
漏洞概述
“astral-tokio-tar"是一个Rust库,被流行工具"uv"使用。该漏洞允许在解压tar文件时实现任意文件写入。在"uv"中,此漏洞允许Python源码分发包在提取过程中写入任意位置。
受影响版本
受影响版本:<= 0.5.3 已修复版本:> 0.8.22
漏洞详情
根本原因
父目录记忆机制
“astral-tokio-tar"中的Entry.unpack_in_raw()方法在v0.5.0版本中添加,允许传入记忆化集合以提高文件系统操作性能。
在"uv"中,uv-extract中的untar_in()方法创建记忆化集合并在使用Entry.unpack_in_raw()提取tar文件中的每个条目时使用相同的集合。
记忆化集合在EntryFields.unpack_in()中使用以下逻辑:
|
|
在此上下文中,parent是当前正在提取条目的父目录。因此,如果file_dst是"path/to/file.txt”,那么parent将是"path/to”。
仅当parent尚未在memo中时,才会调用self.validate_inside_dst(dst, parent)。
符号链接检查绕过
“astral-tokio-tar"有一个由allow_external_symlinks标志保护的检查,试图确保符号链接不指向目标目录dst之外。但是,此检查也可以通过按顺序创建以下两个符号链接来绕过:
-
"ptr" -> "noop/noop/noop/noop/noop/noop/noop/noop/noop/../../../../../../../../../tmp"- 此路径通过符号链接检查,因为它评估为"tmp”,位于目标目录下
-
"noop" -> "."- 此路径也通过符号链接检查,因为它评估为目标目录
创建两者后,“ptr"现在有效地指向”./../../../../../../../../../tmp",这很可能在目标目录之外。
漏洞组合利用
以下tar条目现在可用于任意写入:
-
目录"decoy"
- 创建目录"{dst}/decoy"
-
符号链接"ptr" -> “decoy”
- 创建符号链接"{dst}/ptr"
-
空文件"ptr/dummy"
- 提取文件"{dst}/ptr/dummy"(即"{dst}/decoy/dummy")
- 此写入还导致"{dst}/ptr"被插入到
memo中
-
符号链接"ptr" -> “noop/noop/noop/noop/noop/noop/noop/noop/noop/../../../../../../../../../tmp”
- 替换符号链接"{dst}/ptr"
-
符号链接"noop" -> “.”
- 创建符号链接"{dst}/noop"
- “ptr"现在指向”{dst}/./../../../../../../../../../tmp"
-
恶意负载文件"ptr/payload"
- 提取文件"{dst}/ptr/payload"(即"/tmp/payload")
- 对"{dst}/ptr"的验证被跳过,因为它已被添加到
memo中
时间线
- 报告日期:2025年8月11日
- 修复日期:2025年9月23日
- 披露日期:2025年11月17日
严重程度
中等 - 由于可能实现任意代码执行。
CVE ID
CVE-2025-59825