curl文件协议路径遍历漏洞技术分析:利用file://访问任意文件

本文详细分析了一个在curl 8.13.0 Windows版本中发现的路径遍历漏洞。攻击者通过file://协议处理程序,可利用目录遍历序列(../)绕过安全限制,未经授权访问系统任意文件。文章包含漏洞代码位置、复现步骤及潜在影响。

curl file:// 协议处理程序中的路径遍历漏洞允许未经授权的文件访问

报告时间:2026年1月3日 UTC 18:59 报告者:7hackerstar 报告 ID:#3485930 披露时间:2026年1月4日 UTC 10:34 严重性:高危 (7 ~ 8.9) 漏洞类型:路径遍历 CVE ID:CVE-2021-22901

摘要

在对curl源代码中文件路径处理逻辑进行手动审查时,我注意到缺乏对目录遍历序列的适当验证,随后通过实际测试进行了验证。我发现,当使用目录遍历序列(../)时,curl允许通过file://协议处理程序未经授权访问任意文件。

受影响版本

  • curl 8.13.0_8(官方Windows构建版)
  • 平台:Windows 10

curl版本输出信息:

1
2
3
4
curl 8.13.0 (x86_64-pc-win32) libcurl/8.13.0 OpenSSL/3.0.16 (Schannel) zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.7 libpsl/0.21.5 (+libidn2/2.3.7) libssh2/1.11.1 nghttp2/1.64.0 ngtcp2/1.12.0 nghttp3/1.8.0
Release-Date: 2025-04-02
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTP3 HTTPS-proxy IDN IPv6 Kerberos Largefile libz MultiSSL NTLM PSL SPNEGO SSL SSPI TLS-SRP UnixSockets zstd

漏洞代码位置

漏洞存在于 lib/file.c 的第229-262行,在打开文件之前没有对文件路径进行适当验证:

1
2
3
4
5
6
7
/* 第229行:缺少对 "../" 序列的验证 */
fd = curlx_open(actual_path, O_RDONLY | CURL_O_BINARY);

/* 第253、258、262行存在类似问题 */
fd = curlx_open(real_path + 1, O_RDONLY);  // 第253行
fd = curlx_open(real_path, O_RDONLY);     // 第258行
fd = curlx_open(real_path, O_RDONLY);     // 第262行

这段代码在打开文件之前未能检查目录遍历序列。当我审查这些代码行时,注意到没有验证机制来防止包含 ../ 的路径访问预期目录结构之外的文件。

复现步骤

  1. 从以下地址下载官方curl Windows构建版:https://curl.se/windows/dl-8.13.0_8/curl-8.13.0_8-win64-mingw.zip
  2. 解压存档并导航到 bin 目录。
  3. C:\test\poc_test.txt 创建一个测试文件,内容如下: This is a test file for Path Traversal vulnerability
  4. 在与 curl.exe 相同的目录下执行以下命令:
    1
    
    curl "file://../../../../test/poc_test.txt"
    

在我的测试过程中,我观察到文件内容被成功显示,这证明了可以未经授权访问预期目录之外的文件。

支持材料/参考资料

  • 显示成功访问文件的截图(Capture.PNG)——在我于Windows 10上的实际测试中捕获。
  • 证明漏洞的分步概念验证脚本(final_poc.bat)。
  • 复现过程中使用的测试文件(poc_test.txt),包含我测试时使用的确切内容。
  • 类似漏洞参考:CVE-2021-22901(表明此类模式此前已发生过)。

影响

此漏洞允许攻击者在处理恶意的 file:// URL 时读取系统中的任意文件。影响包括:

  • 敏感数据泄露:可以访问系统文件(hosts文件、密码数据库)、用户文档和私钥。在我的测试中,我能够读取来自完全不同目录的文件,这表明了问题的严重性。
  • 信息披露:可以枚举系统配置、已安装软件详情和网络设置。这可能为攻击者提供目标系统的详细信息。
  • 链式攻击:可与其他漏洞结合以实现完全系统入侵。例如,读取配置文件可能会泄露其他服务的凭据。
  • 远程利用:处理用户提供的URL的应用程序(如网络爬虫、API客户端、下载管理器)可能会被远程利用。许多开发人员没有意识到 file:// URL 可能是危险的。

严重性为高危的原因

  • 利用无需认证——任何攻击者都可以制作恶意URL。
  • 影响敏感系统数据的机密性——核心安全边界被破坏。
  • 存在于最新的官方发布版本中——影响当前版本的所有Windows用户。
  • 利用简单,所需技术门槛低——我仅用几条简单命令即可复现。

这不仅仅是一个理论问题。我在Windows 10上的实际操作测试中,成功地访问了预期目录结构之外的文件,证明了其现实世界的可利用性。此漏洞尤其令人担忧,因为curl在全球无数的应用程序和系统中被使用。

时间线与讨论

  • 8天前:7hackerstar 向 curl 提交了报告。
  • 8天前:7hackerstar 发表评论:Welcome! I hope my report is clear, taking into account my limited English.
  • 8天前:bagder (curl 工作人员) 发表评论:I don‘t understand the claim. What is the vulnerability?
  • 7天前:bagder (curl 工作人员) 关闭报告并将状态更改为 Not Applicable。更新说明:
    • curl 默认会移除点序列(dotdot sequences)。
    • curl 已经可以通过 file:// 访问整个本地磁盘,这是设计使然。
  • 7天前:bagder (curl 工作人员) 请求披露此报告:Per project policy for transparency, we want all reports disclosed and made public.
  • 7天前:bagder (curl 工作人员) 披露了此报告。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计