libcurl FTP路径规范化漏洞解析:编码%2e%2e导致目录逃逸

本文详细分析了libcurl在处理FTP路径时存在的安全漏洞,该漏洞允许攻击者通过编码的%2e%2e序列实现目录遍历,可能导致敏感文件泄露和系统安全风险。文章包含技术细节、复现步骤和影响评估。

libcurl FTP路径规范化漏洞允许解码%2e%2e → CWD ..和目录逃逸(路径遍历,CWE-22)

漏洞概述

libcurl的FTP路径处理存在安全缺陷,ftp_parse_url_path函数在URL解码FTP路径段(如%2e%2e)后,使用临时循环将解码后的路径分割为组件,跳过由//产生的空组件。代码未执行规范的路径规范化(无基于堆栈的.或..处理)。因此,编码的遍历序列如%2e%2e解码为..,并可能成为正常路径组件,导致libcurl向远程FTP服务器发出CWD ..命令。在攻击者可以向使用libcurl的应用程序提供FTP URL的情况下,这实现了客户端驱动的目录遍历。

受影响版本

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

测试环境:基于Debian的VM(本地构建或系统curl),pyftpdlib测试FTP服务器(测试中使用pyftpdlib 2.1.0)。

复现步骤

  1. 准备本地测试目录和文件:
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
  1. 在目录中启动简单的本地FTP服务器:
1
2
python3 -m pip install pyftpdlib
python3 -m pyftpdlib -w
  1. 使用包含编码遍历和重复斜杠的URL运行curl并启用跟踪:
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. 检查curl_trace.txt中的CWD命令,示例如下:
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。在自动下载器、更新获取器、备份/恢复脚本或接受外部FTP URL的内容导入器中,这可能暴露敏感配置文件、凭据或私有数据。

  • 绕过客户端过滤器(完整性/授权):执行简单清理(例如仅搜索字面..)的应用程序可能被发送编码等效项(%2e%2e)绕过,因为解码发生在规范化之前。

  • 供应链和自动化滥用:自动处理FTP URL的软件(如CI/CD、同步工具)可能被诱骗获取或覆盖允许区域外的文件,导致更广泛的系统破坏或损坏。

可利用性/前提条件:

  • 攻击者必须能够提供由使用libcurl的应用程序处理的FTP URL(这在自动化工作流或用户提供的URL功能中常见)。
  • 核心逻辑中无需特殊认证:如果客户端未经认证且服务器允许目录更改,则可能未经认证即可利用;否则,影响受认证和服务器配置限制。

严重性和CVSS指导(估计):

建议严重性:高 CVSS示例向量(估计远程可读性,无特权,无用户交互): AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N → CVSS ~7.x

修复建议摘要

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

时间线

  • ahn0x 提交报告给curl — 2天前
  • bagder curl工作人员 发布评论 — 1天前
  • bagder curl工作人员 关闭报告并将状态更改为"不适用" — 17小时前
  • bagder curl工作人员 披露此报告 — 17小时前

项目回应

curl团队确认该问题在curl 8.13.0或更高版本中不存在,并指出允许攻击者控制URL本身已经是一个失败的前提,FTP客户端完全可以按需更改目录到"..",适当的目录保护必须在服务器端实现,不能依赖客户端保护。

报告最终被标记为"不适用"并公开披露。

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