任意配置文件包含漏洞:通过外部控制文件名或路径
漏洞概述
在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 2echo 'url = "file:///etc/passwd"' > /tmp/malicious.curlrc echo 'output = "/tmp/stolen_passwd.txt"' >> /tmp/malicious.curlrc -
运行curl并使用创建的配置文件:
1curl --config /tmp/malicious.curlrc -
检查是否成功创建文件并包含
/etc/passwd的内容:1cat /tmp/stolen_passwd.txt
技术分析
漏洞根源
此漏洞源于curl解析配置文件时缺乏充分的路径验证。
源代码文件:/curl/src/
漏洞代码:
|
|
curlx_fopen函数使用通过--config参数直接由用户控制的文件名调用。
执行点:配置文件的每一行随后由getparameter函数处理,该函数执行恶意指令,如url和output。
代码:
|
|
影响分析
敏感信息泄露
攻击者可读取用户可访问的任何文件,包括但不限于:
- 用户凭证:私有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的安全问题。”
根据项目透明度政策,该报告已被公开披露。