curl SFTP语法验证漏洞分析报告
漏洞概述
curl支持使用-Q或--quote参数(以及libcurl的CURLOPT_QUOTE)为FTP和SFTP连接指定要执行的"命令"。在SFTP协议中,这些命令可对文件系统对象执行操作。当对象路径包含文件名时,调用方应当对参数进行引用(例如:-Q 'chmod 777 "/tmp/example file"')。然而,由于libcurl的quote命令解析器会忽略额外参数,省略引号(或尝试使用shell引用)将导致命令执行,并可能对非预期对象进行操作。
受影响版本
curl 8.16.0
技术细节
问题根源
curl手册中提到"文件名可以使用shell风格引用来嵌入空格或特殊字符",这一陈述具有误导性,因为shell允许更多引用空格的方式(例如使用\),而curl并不支持这些方式。这可能导致应用程序开发者误认为shell引用规则适用。
复现步骤
环境配置:
curl需使用--with-libssh2或--with-libssh编译
测试案例1:
|
|
结果:权限777被错误地应用到/tmp/example,而非预期的/tmp/example file。
测试案例2:
|
|
结果:权限777被错误地应用到/tmp/example\,而非预期的/tmp/example file。
修复建议
代码修复
调整lib/vssh/libssh2.c中的sftp_quote和lib/vssh/libssh.c中的myssh_in_SFTP_QUOTE的quote解析器,当命令给出多余参数时(表明调用方错误地尝试给出带空格的路径而未正确引用)应报错。
文档修正
修复文档,不再声称支持shell风格引用。
安全影响
风险总结
- 操作在错误对象上执行
- 相关的安全影响:非预期的信息泄露、数据丢失
可利用场景
- 应用程序生成quote命令参数时,使用不受支持的方法来引用空格(如
\) - 应用程序使用shell通配规则进行quote命令验证,导致验证时显示"正常",但实际执行时产生不同结果
项目方回应
curl开发团队认为这并非安全漏洞,但承认参数引用规则确实文档不足。团队已开始澄清文档(参见PR #19025),并建议改进参数解析器在遇到多余参数时报错。
时间线
- 2025年10月10日:漏洞报告提交
- 2025年10月12日:报告公开披露
- 状态最终定为"不适用"(Not Applicable),不被认定为漏洞