SFTP语法验证漏洞导致文件操作风险分析

本文详细分析了curl在SFTP连接中-Q参数处理时的语法验证缺陷,该漏洞可能导致文件操作针对错误对象执行,涉及权限修改等安全风险,并提供了复现步骤和修复建议。

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

1
2
3
4
5
6
7
# 在目标服务器上:
echo 1 > /tmp/example
echo 2 > /tmp/"example file"

# 执行curl命令:
echo > t
curl -Q 'chmod 777 /tmp/example file' -T t sftp://user@server/tmp/t

结果:权限777被错误地应用到/tmp/example,而非预期的/tmp/example file

测试案例2

1
2
3
4
5
6
7
# 在目标服务器上:
echo 1 > /tmp/example\\
echo 2 > /tmp/"example file"

# 执行curl命令:
echo > t
curl -Q 'chmod 777 /tmp/example\ file' -T t sftp://user@server/tmp/t

结果:权限777被错误地应用到/tmp/example\,而非预期的/tmp/example file

修复建议

代码修复

调整lib/vssh/libssh2.c中的sftp_quotelib/vssh/libssh.c中的myssh_in_SFTP_QUOTE的quote解析器,当命令给出多余参数时(表明调用方错误地尝试给出带空格的路径而未正确引用)应报错。

文档修正

修复文档,不再声称支持shell风格引用。

安全影响

风险总结

  • 操作在错误对象上执行
  • 相关的安全影响:非预期的信息泄露、数据丢失

可利用场景

  1. 应用程序生成quote命令参数时,使用不受支持的方法来引用空格(如\
  2. 应用程序使用shell通配规则进行quote命令验证,导致验证时显示"正常",但实际执行时产生不同结果

项目方回应

curl开发团队认为这并非安全漏洞,但承认参数引用规则确实文档不足。团队已开始澄清文档(参见PR #19025),并建议改进参数解析器在遇到多余参数时报错。

时间线

  • 2025年10月10日:漏洞报告提交
  • 2025年10月12日:报告公开披露
  • 状态最终定为"不适用"(Not Applicable),不被认定为漏洞
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计