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)
示例版本输出:
|
|
复现步骤
环境准备
|
|
启动FTP服务器
|
|
执行漏洞利用
|
|
跟踪输出示例
|
|
相关代码分析
|
|
影响分析
安全影响
- 路径遍历(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)
- 为编码遍历案例和混合排列添加单元测试