Astral-tokio-tar和uv工具中的任意文件写入路径遍历漏洞分析

本文详细分析了astral-tokio-tar Rust库及其在uv工具中使用的路径遍历漏洞,攻击者可通过特制tar文件实现任意文件写入,漏洞涉及符号链接验证绕过和父目录记忆机制缺陷。

“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()中使用以下逻辑:

1
2
3
4
5
6
7
8
// Validate the parent, if we haven't seen it yet.
if !memo.contains(parent) {
    self.ensure_dir_created(dst, parent).await.map_err(|e| {
        TarError::new(format!("failed to create `{}`", parent.display()), e)
    })?;
    self.validate_inside_dst(dst, parent).await?;
    memo.insert(parent.to_path_buf());
}

在此上下文中,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之外。但是,此检查也可以通过按顺序创建以下两个符号链接来绕过:

  1. "ptr" -> "noop/noop/noop/noop/noop/noop/noop/noop/noop/../../../../../../../../../tmp"

    • 此路径通过符号链接检查,因为它评估为"tmp”,位于目标目录下
  2. "noop" -> "."

    • 此路径也通过符号链接检查,因为它评估为目标目录

创建两者后,“ptr"现在有效地指向”./../../../../../../../../../tmp",这很可能在目标目录之外。

漏洞组合利用

以下tar条目现在可用于任意写入:

  1. 目录"decoy"

    • 创建目录"{dst}/decoy"
  2. 符号链接"ptr" -> “decoy”

    • 创建符号链接"{dst}/ptr"
  3. 空文件"ptr/dummy"

    • 提取文件"{dst}/ptr/dummy"(即"{dst}/decoy/dummy")
    • 此写入还导致"{dst}/ptr"被插入到memo
  4. 符号链接"ptr" -> “noop/noop/noop/noop/noop/noop/noop/noop/noop/../../../../../../../../../tmp”

    • 替换符号链接"{dst}/ptr"
  5. 符号链接"noop" -> “.”

    • 创建符号链接"{dst}/noop"
    • “ptr"现在指向”{dst}/./../../../../../../../../../tmp"
  6. 恶意负载文件"ptr/payload"

    • 提取文件"{dst}/ptr/payload"(即"/tmp/payload")
    • 对"{dst}/ptr"的验证被跳过,因为它已被添加到memo

时间线

  • 报告日期:2025年8月11日
  • 修复日期:2025年9月23日
  • 披露日期:2025年11月17日

严重程度

中等 - 由于可能实现任意代码执行。

CVE ID

CVE-2025-59825

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计