libcurl AWS SigV4签名泄露漏洞分析

本文详细分析了libcurl中存在的AWS SigV4签名泄露漏洞。当启用详细日志记录时,libcurl会将字符串到签名和最终HMAC签名打印到日志中,导致AWS凭证泄露,攻击者可利用这些签名重放AWS API调用。

AWS SigV4签名通过libcurl详细日志记录泄露

漏洞概述

当libcurl构建了AWS SigV4支持时,启用详细日志记录(CURLOPT_VERBOSE或–verbose)会导致库将字符串到签名和最终HMAC签名打印到日志中。

由于签名在几分钟内保持有效并且直接源自AWS凭证,此行为会将敏感材料泄露到日志文件或控制台中。任何操作员、日志聚合系统或具有这些日志读取权限的低权限帐户都可以重放经过身份验证的AWS API调用或恢复签名请求的详细信息。

这是libcurl的http_aws_sigv4.c中的凭证泄露漏洞。

受影响组件

  • 文件:lib/http_aws_sigv4.c
  • 函数:aws_sigv4_add(),该函数使用infof()调用字符串到签名和计算出的签名
  • 影响:启用了AWS SigV4签名的最新libcurl(在8.x上测试)

复现步骤

环境设置

  1. 构建启用了AWS SigV4的libcurl(自7.75.0起默认启用)
  2. 导出有效的AWS凭证(AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY)
  3. 启用详细模式(–verbose或CURLOPT_VERBOSE)

运行签名请求

运行简单的签名AWS请求,例如列出S3存储桶:

1
2
3
4
5
AWS_ACCESS_KEY_ID=AWS_ACCESS_KEY... \
AWS_SECRET_ACCESS_KEY=SECRET... \
curl --aws-sigv4 "aws:amz:us-east-1:s3" \
     --verbose \
     https://s3.amazonaws.com/

观察日志

在控制台(或重定向的日志)中,libcurl会打印敏感信息:

1
2
* string-to-sign: AWS4-HMAC-SHA256 20250929T124500Z ...
* signature: 7a5d1c84e2c3d8f9...

重放请求

访问这些日志的攻击者可以立即在几分钟内重放请求:

1
2
curl -H "Authorization: AWS4-HMAC-SHA256 Credential=..., SignedHeaders=..., Signature=7a5d1c84e2c3d8f9..." \
     https://s3.amazonaws.com/

只要签名在有效窗口内(通常为5分钟),重放就会成功。

影响

  • 机密性:AWS API凭证/签名泄露到日志中
  • 完整性:攻击者可以重放AWS API调用(例如,列出存储桶、上传/下载对象)
  • 可用性:重放可能被滥用以使用有效的签名请求淹没服务

现实场景:任何使用–verbose进行故障排除的团队,或将libcurl输出记录到中央日志收集器的团队,都会无意中将AWS秘密泄露给不太受信任的操作员。

官方回应

dfandrich (curl工作人员) 评论: curl不保证秘密不会被记录。除了此来源之外,还有许多其他秘密来源也被记录;例如参见最近的PR https://github.com/curl/curl/pull/18535。CURLOPT_VERBOSE文档中还有一个警告,即"这可能会显示来自标头和数据的敏感内容"。

jimfuller2024 (curl工作人员) 评论: 同意@dfandrich - 正如他提到的,我们在CURLOPT_VERBOSE中记录了这一点,这也显示在手册页(–version)中…这不是一个安全问题,我们说过"请不要这样做"。包含安全信息的日志访问应始终在curl运行环境的上下文/约束中进行适当管理。

bagder (curl工作人员) 关闭了报告并将状态更改为"不适用": 认为不是安全问题。

bagder (curl工作人员) 请求披露此报告: 根据项目的透明度政策,我们希望所有报告都被披露并公开。

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