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
复现步骤
-
使用
--with-libssh2构建cURL -
在目标服务器上执行:
1 2 3 4echo 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。
另一个示例:
|
|
结果:/tmp/example\被修改为具有777权限,而不是预期的/tmp/example file。
修复建议
调整lib/vssh/libssh2.c中的sftp_quote和lib/vssh/libssh.c中的myssh_in_SFTP_QUOTE的引号解析器,如果给命令提供了多余参数(表明调用方错误地尝试给出带空格但未正确引用的路径),则报错。
修复文档,不再声称支持shell风格引用。
安全影响
在错误对象上执行操作,带来相关的安全影响(非预期的信息泄露、数据丢失)。
讨论记录
bagder (curl工作人员) 表示:“我认为将其称为安全问题有些牵强。这个参数的引用规则确实文档记录不足,但我认为用户仅凭文档说’shell风格引用’就盲目假设可以使用任何shell的任何引用风格而不进行验证,这有点过分了。”
nyymi 同意这不是漏洞,但认为参数解析器应该按照描述的方式在出现多余参数时报错。
后续进展
bagder已开始在GitHub上澄清文档:https://github.com/curl/curl/pull/19025
报告状态:已披露(Not Applicable) 报告时间:2025年10月10日 披露时间:2025年10月12日 弱点分类:输入语法正确性验证不当 CVE ID:无 赏金:无