curl SFTP引用语法验证缺陷分析
漏洞概述
curl支持通过-Q或--quote参数(以及libcurl的CURLOPT_QUOTE)为FTP和SFTP连接指定要执行的命令。在SFTP协议中,这些命令可对文件系统对象执行操作。当对象路径包含文件名时,调用方应当使用引号包裹参数(例如:-Q 'chmod 777 "/tmp/example file"')。然而,由于libcurl引用命令解析器会忽略额外参数,省略引号(或尝试使用shell引用)将导致命令执行,并可能对非预期对象进行操作。
受影响版本
curl 8.16.0
问题根源
curl手册中提到"文件名可以使用shell风格引用以嵌入空格或特殊字符",这一陈述存在误导性。因为shell支持更多引用空格的方式(例如使用\),而curl并不支持这些方式。这可能导致应用程序开发者误认为shell引用规则适用。
复现步骤
-
在目标服务器上创建测试文件:
1 2echo 1 > /tmp/example echo 2 > /tmp/"example file" -
执行以下curl命令:
1 2echo > t curl -Q 'chmod 777 /tmp/example file' -T t sftp://user@server/tmp/t
结果:权限修改操作实际作用于/tmp/example,而非预期的/tmp/example file。
另一个示例:
|
|
结果:操作作用于/tmp/example\文件。
修复建议
- 调整
lib/vssh/libssh2.c中的sftp_quote和lib/vssh/libssh.c中的myssh_in_SFTP_QUOTE引用解析器,在命令接收到多余参数时报错 - 修复文档,不再声称支持shell风格引用
安全影响
- 操作针对错误对象执行
- 可能导致非预期的信息泄露或数据丢失
- 虽然不被认定为严重漏洞,但仍需代码改进
讨论总结
开发团队认为这更多是文档澄清问题而非安全漏洞,已通过GitHub PR #19025更新文档说明。报告者同意这不是漏洞,但建议解析器应增加对多余参数的检查。