CRLF注入在libcurl的SMTP客户端中通过–mail-from和–mail-rcpt允许SMTP命令走私
摘要
libcurl的SMTP客户端易受通过–mail-from和–mail-rcpt参数的CRLF注入攻击。攻击者可以注入换行符来走私SMTP命令(如VRFY),可能启用用户枚举或协议滥用。虽然curl在注入后可能失败,但注入的命令由SMTP服务器执行,确认了漏洞存在。
受影响版本
在Ubuntu 24.04.2上测试了以下版本:
- curl 8.5.0(系统)
- curl 8.15.0-DEV(本地构建)
- PycURL/7.45.6 with libcurl/8.12.1-DEV
完整系统curl版本:
|
|
完整本地构建版本:
|
|
复现步骤
- 运行测试SMTP服务器;我使用的服务器名为smtp_server,以./smtp_server运行并在localhost:1025监听。
- 发送带有正常电子邮件地址的邮件,例如:
curl -vf --url "smtp://localhost:1025/" --mail-from "attacker@example.com" --mail-rcpt "recipient@example.com" --upload-file mail.txt
,其中mail.txt是文本文件——curl正常完成。 - 现在发送带有注入CRLF的邮件,例如在"from"字段中:
curl -vf --url "smtp://localhost:1025/" --mail-from "$(printf 'user@example.com\r\nVRFY d@example.com\r\n')" --mail-rcpt "recipient@example.com" --upload-file mail.txt
——curl失败,显示DATA failed: 250,因为服务器向注入的VRFY命令发送了250 OK而不是预期的354;这证明了CRLF注入发生。
我认为问题源于smtp.c中的smtp_perform_mail函数中的"MAIL FROM:%s%s%s%s%s%s"在连接邮件字段时未进行清理(且smtp_parse_address也未清理"\r\n")。
支持材料/参考
正常邮件发送:
|
|
在"from"字段中发送带有CRLF的邮件:
|
|
在"rcpt"字段中发送带有CRLF的邮件:
|
|
使用pycURL发送带有CRLF的邮件:
|
|
服务器日志(用于说明):
|
|
smtp_server脚本:
|
|
send-with-pycurl脚本:
|
|
影响
此漏洞允许攻击者通过精心构造恶意电子邮件地址注入任意SMTP命令(如VRFY)。它可能导致用户枚举、绕过客户端限制或中断SMTP会话,尤其是在自动化或基于代理的电子邮件工作流程中。
时间线
- skrcprst 向curl提交报告(15天前)
- bagder(curl员工)发表评论(15天前):感谢报告,将调查。
- icing(curl员工)发表评论(15天前):询问AI发现漏洞的成功率。
- bagder(curl员工)发表评论(15天前):认为这不是合法漏洞,因为攻击者无法随机访问和修改curl命令行。
- skrcprst 发表评论(15天前):同意关闭报告。
- jimfuller2024(curl员工)发表评论(15天前):指出报告中的错误假设。
- skrcprst 关闭报告并将状态更改为Not Applicable(15天前)
- bagder(curl员工)请求披露此报告(15天前)
- skrcprst 同意披露报告(14天前)
- 报告已披露(14天前)
报告详情
- 报告ID:#3235428
- 严重性:中等(4 ~ 6.9)
- 披露时间:2025年7月3日 22:57 UTC
- 弱点:CRLF注入
- CVE ID:无
- 赏金:隐藏