curl配置文件包含漏洞分析:任意文件读取与写入风险

本文详细分析了curl工具中存在的任意配置文件包含漏洞,攻击者可通过--config选项控制配置文件路径,实现本地文件读取和任意文件写入,对系统安全构成严重威胁。

任意配置文件包含漏洞:通过外部控制文件名或路径

漏洞概述

在curl工具中发现了任意配置文件包含(ACFI)漏洞,该漏洞通过--config <file>选项存在。这一缺陷属于外部控制文件名或路径(CWE-73)类型,由于对用户提供的配置文件路径缺乏充分验证而导致。

攻击者可利用此漏洞:

  • 诱使用户执行curl时使用位于任意路径的恶意配置文件(如/tmp/malicious.curlrc
  • 显著控制curl的行为,包括设置危险选项,如url = "file:///"output = "..."

该漏洞影响严重,可能允许攻击者读取敏感文件(如/etc/passwd)并在受害者系统上的任意位置进行任意文件写入。

受影响版本

  • curl/libcurl版本:8.15.0
  • 平台:x86_64-pc-linux-gnu

复现步骤

  1. 创建恶意配置文件:

    1
    2
    
    echo 'url = "file:///etc/passwd"' > /tmp/malicious.curlrc
    echo 'output = "/tmp/stolen_passwd.txt"' >> /tmp/malicious.curlrc
    
  2. 运行curl并使用创建的配置文件:

    1
    
    curl --config /tmp/malicious.curlrc
    
  3. 检查是否成功创建文件并包含/etc/passwd的内容:

    1
    
    cat /tmp/stolen_passwd.txt
    

技术分析

漏洞根源

此漏洞源于curl解析配置文件时缺乏充分的路径验证。

源代码文件/curl/src/

漏洞代码

1
file = curlx_fopen(filename, FOPEN_READTEXT);

curlx_fopen函数使用通过--config参数直接由用户控制的文件名调用。

执行点:配置文件的每一行随后由getparameter函数处理,该函数执行恶意指令,如url和output。

代码

1
res = getparameter(option, param, &usedarg, config, max_recursive);

影响分析

敏感信息泄露

攻击者可读取用户可访问的任何文件,包括但不限于:

  • 用户凭证:私有SSH密钥(~/.ssh/id_rsa)、shell历史文件(~/.bash_history)、API令牌或存储在~/.aws/credentials中的云凭证
  • 应用程序密钥:包含数据库密码、API密钥或其他敏感数据的配置文件
  • 系统数据:如/etc/passwd或系统日志等文件,可用于用户枚举和系统映射

文件修改和潜在代码执行

通过在配置文件中使用输出参数,攻击者可在允许的位置写入或覆盖文件。攻击场景包括:

  • 实现持久代码执行:覆盖启动shell文件,如~/.bashrc~/.profile,插入在用户每次登录时执行的恶意命令
  • 植入Web Shell:如果curl由Web服务器运行,攻击者可将PHP文件或其他脚本写入Web目录(/var/www/html/shell.php),从而获得远程shell访问权限
  • 破坏系统完整性:覆盖可能导致拒绝服务(DoS)的重要文件

SSRF攻击

攻击者可强制服务器向外部无法访问的内部资源发出网络请求。通过设置url = "http://169.254.169.254/latest/meta-data/"(在AWS环境中)或url = "http://localhost:8080/admin",攻击者可扫描内部网络并从内部服务窃取数据。

总体而言,此漏洞破坏了安全性的三大支柱:系统的机密性、完整性和潜在的可用性。

项目方回应

curl项目工作人员将报告状态更改为"不适用",并指出:“这是curl配置文件按预期和文档记录工作的方式。诱使用户运行命令行可以做比这更糟糕的事情。这不是curl的安全问题。”

根据项目透明度政策,该报告已被公开披露。

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