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
复现步骤
-
构建curl时使用
--with-libssh2(或--with-libssh,但测试使用--with-libssh2) -
在目标服务器上执行:
|
|
结果:/tmp/example被修改为具有777权限,而不是预期的/tmp/example file。
- 另一个示例:
|
|
结果:/tmp/example\被修改为具有777权限,而不是预期的/tmp/example file。
修复方案
调整lib/vssh/libssh2.c中的sftp_quote和lib/vssh/libssh.c中的myssh_in_SFTP_QUOTE的引号解析器,如果命令给出了多余参数(表明调用方错误地尝试给出带空格但未正确引用的路径),则报错。
修复文档,不再声称支持shell风格引用。
安全影响
- 在错误对象上执行操作,带来相关的安全影响(非预期的信息泄露、数据丢失)
- 需要应用程序使用不支持的方法来引用空格(如
\),或应用程序使用shell全局规则理解进行引号命令验证,导致验证时认为"正常"但实际上执行结果不同的情况
讨论记录
bagder (curl工作人员) 认为这很难被称为安全问题,文档中的参数引用规则确实记录不足,但用户不应仅凭文档中说"shell风格引用"就盲目假设可以使用任何shell的任何引用样式。
nyymi 同意这不是漏洞,但认为参数解析器应该按照描述在多余参数时报错。
状态更新
- 报告状态:不适用(Not Applicable)
- 严重程度:无评级
- 弱点分类:输入语法正确性验证不当
- 报告已公开披露
- 文档澄清工作已在GitHub拉取请求#19025中开始