SFTP引用语法验证缺失导致操作错误对象的安全分析

本文详细分析了curl工具中SFTP引用命令语法验证缺失的安全问题,该问题可能导致文件操作作用于错误对象,涉及版本8.16.0,包含复现步骤和修复建议。

报告 #3379102 - SFTP引用语法验证缺失可能导致操作错误对象

摘要

curl支持-Q--quote(以及libcurl的CURLOPT_QUOTE)来为FTP和SFTP连接指定要执行的"命令"。SFTP支持对文件系统对象执行操作的命令。当对象路径包含文件名时,调用方应该引用参数(例如:-Q 'chmod 777 "/tmp/example file"')。然而,由于libcurl引用命令解析器忽略额外参数,省略引号(或尝试使用shell引用)将让命令执行,并且操作将尝试作用于非预期对象。

curl手册提到"文件名可以用shell风格引用以嵌入空格或特殊字符"。这一陈述具有误导性,因为shell允许更多引用空格的方式,例如使用\,但curl不支持。这可能导致应用程序开发者认为shell引用规则适用。如果某些软件信任文档并假设shell引用适用而生成引用命令,则可能导致操作在非预期对象上执行。

本报告的研究和生成未使用AI。

受影响版本

curl 8.16.0

复现步骤

在目标服务器上:

1
2
3
4
echo 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

另一个例子:

在目标服务器上:

1
2
3
4
echo 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

修复方案

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

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

影响

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

时间线

  • 2025年10月10日,下午5:40 UTC - nyymi向curl提交报告
  • 2025年10月10日,下午5:52 UTC - bagder(curl工作人员)回复确认收到报告
  • 15天前 - nyymi补充说明可利用场景
  • 14天前 - bagder认为这不太算安全问题
  • 14天前 - nyymi关闭报告并将状态改为"不适用"
  • 14天前 - nyymi请求披露此报告
  • 13天前 - bagder同意披露报告
  • 13天前 - bagder开始通过PR #19025澄清文档

报告详情

  • 报告ID: #3379102
  • 严重程度: 无评级(—)
  • 披露时间: 2025年10月12日上午8:38 UTC
  • 弱点: 输入语法正确性验证不当
  • CVE ID: 无
  • 赏金: 无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计