SFTP语法验证漏洞解析:curl文件操作风险与修复方案

本文详细分析了curl工具中SFTP引号语法验证缺失的安全问题,该漏洞可能导致文件操作执行在错误的对象上。报告包含受影响版本、复现步骤、修复建议及安全影响评估,涉及libcurl库的SFTP命令解析机制。

curl SFTP引号语法验证缺失导致错误文件操作

漏洞概述

curl支持使用-Q--quote参数(以及libcurl的CURLOPT_QUOTE选项)为FTP和SFTP连接指定要执行的命令。SFTP支持对文件系统对象执行操作的命令。当对象路径包含文件名时,调用方应该对参数进行引号包装(例如:-Q 'chmod 777 "/tmp/example file"')。然而,由于libcurl引号命令解析器会忽略额外参数,省略引号(或尝试使用shell引号)将导致命令执行,并且操作将在非预期对象上尝试。

文档误导问题

curl手册页提到"文件名可以用shell风格引号来嵌入空格或特殊字符"。这一陈述具有误导性,因为shell允许更多引用空格的方式,例如使用\,而curl并不支持。这可能导致应用程序开发者认为shell引用规则适用。如果某些软件信任文档并假设shell引用规则适用而生成引号命令,则可能导致操作在非预期对象上执行的情况。

受影响版本

  • curl 8.16.0

复现步骤

  1. 构建curl时使用--with-libssh2(或--with-libssh,但测试使用--with-libssh2

  2. 在目标服务器上执行:

1
2
3
4
echo 1 > /tmp/example
echo 2 > /tmp/"example file"
echo > t
curl -Q 'chmod 777 /tmp/example file' -T t sftp://user@server/tmp/t

结果:/tmp/example被修改为具有777权限,而不是预期的/tmp/example file

  1. 另一个示例:
1
2
3
4
echo 1 > /tmp/example\\
echo 2 > /tmp/"example file"
echo > t
curl -Q 'chmod 777 /tmp/example\ file' -T t sftp://user@server/tmp/t

结果:/tmp/example\被修改为具有777权限,而不是预期的/tmp/example file

修复方案

调整lib/vssh/libssh2.c中的sftp_quotelib/vssh/libssh.c中的myssh_in_SFTP_QUOTE的引号解析器,如果命令给出了多余参数(表明调用方错误地尝试给出带空格但未正确引用的路径),则报错。

修复文档,不再声称支持shell风格引用。

安全影响

  • 在错误对象上执行操作,带来相关的安全影响(非预期的信息泄露、数据丢失)
  • 需要应用程序使用不支持的方法来引用空格(如\),或应用程序使用shell全局规则理解进行引号命令验证,导致验证时认为"正常"但实际上执行结果不同的情况

讨论记录

bagder (curl工作人员) 认为这很难被称为安全问题,文档中的参数引用规则确实记录不足,但用户不应仅凭文档中说"shell风格引用"就盲目假设可以使用任何shell的任何引用样式。

nyymi 同意这不是漏洞,但认为参数解析器应该按照描述在多余参数时报错。

状态更新

  • 报告状态:不适用(Not Applicable)
  • 严重程度:无评级
  • 弱点分类:输入语法正确性验证不当
  • 报告已公开披露
  • 文档澄清工作已在GitHub拉取请求#19025中开始
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计