libcurl FTP路径规范化漏洞解析:编码%2e%2e导致目录穿越攻击

本文详细分析了libcurl在处理FTP路径时存在的安全漏洞,该漏洞允许攻击者通过编码的%2e%2e序列实现目录穿越,可能导致敏感文件泄露和系统安全被破坏。

libcurl FTP路径规范化漏洞分析

漏洞概述

报告ID: #3418861
漏洞类型: 路径遍历(CWE-22)
提交者: ahn0x
提交时间: 1天前

技术细节

漏洞原理

lib/ftp.c中的ftp_parse_url_path函数在处理FTP路径时存在安全缺陷:

  • 首先对FTP路径段进行URL解码(如将%2e%2e解码为..)
  • 然后使用特定的循环将解码后的路径分割为组件,跳过由//产生的空组件
  • 代码未执行规范的路径规范化(没有基于堆栈的.或..处理)

影响结果

编码的遍历序列(如%2e%2e)解码为..后,可能成为正常的路径组件,导致libcurl向远程FTP服务器发出CWD ..命令。这使得在攻击者能够向使用libcurl的应用程序提供FTP URL的环境中,可以实现客户端驱动的目录遍历。

受影响版本

测试环境:基于Debian的VM,pyftpdlib测试FTP服务器(测试中使用pyftpdlib 2.1.0)

示例版本输出:

1
curl 8.4.0 (x86_64-pc-linux-gnu) libcurl/8.4.0 OpenSSL/1.1.1k zlib/1.2.11

复现步骤

环境准备

1
2
3
4
mkdir -p ~/curl-test/dir ~/curl-test/testdir
echo "INSIDE" > ~/curl-test/dir/inside.txt
echo "OUTSIDE" > ~/curl-test/testdir/outside.txt
cd ~/curl-test

启动FTP服务器

1
2
python3 -m pip install pyftpdlib
python3 -m pyftpdlib -w

执行漏洞利用

1
curl --trace-ascii curl_trace.txt -v "ftp://127.0.0.1:2121/dir//%2e%2e/testdir" 2>&1 | tee curl_stdout.txt

跟踪输出示例

1
2
3
4
CWD dir
< 250 "/dir" is the current directory.
CWD ..
< 250 "/" is the current directory.

相关代码分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/* URL解码FTP路径以供进一步评估 */
result = Curl_urldecode(ftp->path, 0, &ftpc->rawpath, &pathLen, REJECT_CTRL);

/* 将URL路径解析为单独的路径组件 */
while(dirAlloc--) {
    const char *spos = strchr(curPos, '/');
    size_t clen = spos - curPos;
    if(!clen && (ftpc->dirdepth == 0))
        ++clen;
    /* 跳过空路径组件,如"x//y" ... */
    if(clen) {
        ftpc->dirs[ftpc->dirdepth].start = (int)(curPos - rawPath);
        ftpc->dirs[ftpc->dirdepth].len = (int)clen;
        ftpc->dirdepth++;
    }
    curPos = spos + 1;
}

/* 后续用于发送CWD命令 */
result = Curl_pp_sendf(data, &ftpc->pp, "CWD %s", ftpc->entrypath);

影响分析

安全影响

  • 路径遍历(CWE-22) - 输入验证不当(CWE-20)
  • 远程文件泄露(机密性):攻击者可构造导致libcurl遍历到父目录并尝试在预期目录之外进行RETR操作的URL
  • 客户端过滤器绕过(完整性/授权):执行简单清理(如仅搜索字面..)的应用程序可能被编码等效项(%2e%2e)绕过
  • 供应链和自动化滥用:自动处理FTP URL的软件可能被诱骗获取或覆盖允许区域之外的文件

可利用性前提

  • 攻击者必须能够提供由使用libcurl的应用程序处理的FTP URL
  • 核心逻辑中无需特殊身份验证

严重程度评估

建议严重性:高
CVSS示例向量:AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N → CVSS ~7.x

官方回应

curl团队评论

bagder (curl工作人员) 1天前: “感谢您的报告!我们将花时间调查您的报告,并尽快向您提供详细信息和可能的后续问题!很可能在接下来的24小时内。”

bagder (curl工作人员) 1天前: “您使用的是旧版curl。此问题在curl 8.13.0或更高版本中不存在。允许攻击者控制URL是一场必输的战斗。由于FTP客户端完全可以按要求更改目录到’..’,适当的目录保护必须在服务器端实现。它不能依赖客户端保护。

附带说明,使用–path-as-is可以要求curl允许此操作。”

报告状态

最终状态:不适用
处理结果:不被视为安全问题
披露时间:15小时前(根据项目透明政策)

技术意义

这不是简单的格式化错误,而是解析/规范化逻辑漏洞,可通过编码输入可靠触发。许多应用程序隐式信任libcurl进行正确的路径处理;如果libcurl基于精心构造的URL发出意外的CWD/RETR命令,可能会泄露机密文件或滥用自动化工作流。

建议修复措施

  • 在URL解码后、分割路径组件之前执行规范路径规范化(基于堆栈的./..处理,折叠//)
  • 拒绝尝试遍历允许根目录之上的路径(返回错误而不是发送CWD)
  • 为编码遍历案例和混合排列添加单元测试
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计