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) -
在目标服务器上执行:
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风格引用。
影响总结
在错误对象上执行操作,带来相关的安全影响(非预期的信息泄露、数据丢失)
时间线
- 12天前:nyymi向curl提交报告
- 12天前:bagder(curl工作人员)回复确认收到报告
- 11天前:双方讨论后认为这不是安全漏洞,但建议改进参数解析器
- 11天前:报告被披露,文档修复已开始
技术细节
该问题可能被利用的场景需要满足以下条件之一的应用程序:
- 生成引用命令参数时调用使用不支持的方法引用空格(
\)的函数 - 应用程序使用对shell通配规则的理解进行引用命令验证,从而导致验证时"正常"但实际上执行时不会产生相同结果的情况
虽然这不是严重的安全漏洞,但代码应该改进以检查多余参数。