curl SFTP引用语法漏洞解析:错误对象操作风险

本文详细分析了curl在SFTP连接中-Q参数引用语法验证不足的安全问题,该缺陷可能导致文件操作针对错误对象执行,涉及权限修改等敏感操作的风险评估和修复方案探讨。

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. 在目标服务器上创建测试文件:

    1
    2
    
    echo 1 > /tmp/example
    echo 2 > /tmp/"example file"
    
  2. 执行以下curl命令:

    1
    2
    
    echo > t
    curl -Q 'chmod 777 /tmp/example file' -T t sftp://user@server/tmp/t
    

结果:权限修改操作实际作用于/tmp/example,而非预期的/tmp/example file

另一个示例:

1
curl -Q 'chmod 777 /tmp/example\ file' -T t sftp://user@server/tmp/t

结果:操作作用于/tmp/example\文件。

修复建议

  1. 调整lib/vssh/libssh2.c中的sftp_quotelib/vssh/libssh.c中的myssh_in_SFTP_QUOTE引用解析器,在命令接收到多余参数时报错
  2. 修复文档,不再声称支持shell风格引用

安全影响

  • 操作针对错误对象执行
  • 可能导致非预期的信息泄露或数据丢失
  • 虽然不被认定为严重漏洞,但仍需代码改进

讨论总结

开发团队认为这更多是文档澄清问题而非安全漏洞,已通过GitHub PR #19025更新文档说明。报告者同意这不是漏洞,但建议解析器应增加对多余参数的检查。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计