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

受影响版本

cURL 8.16.0

复现步骤

  1. 使用--with-libssh2构建cURL

  2. 在目标服务器上执行:

    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
on target server: 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风格引用。

安全影响

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

讨论记录

bagder (curl工作人员) 表示:“我认为将其称为安全问题有些牵强。这个参数的引用规则确实文档记录不足,但我认为用户仅凭文档说’shell风格引用’就盲目假设可以使用任何shell的任何引用风格而不进行验证,这有点过分了。”

nyymi 同意这不是漏洞,但认为参数解析器应该按照描述的方式在出现多余参数时报错。

后续进展

bagder已开始在GitHub上澄清文档:https://github.com/curl/curl/pull/19025

报告状态:已披露(Not Applicable) 报告时间:2025年10月10日 披露时间:2025年10月12日 弱点分类:输入语法正确性验证不当 CVE ID:无 赏金:无

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