CRLF 注入 / libcurl 协议走私漏洞报告
报告 ID: #3479984
漏洞标题: CRLF Injection / Protocol Smuggling in libcurl via CURLOPT_USERNAME (IMAP)
报告者: efrsxcv 提交时间: 3 天前
摘要
我在libcurl的IMAP协议实现中发现了一个CRLF注入漏洞。该漏洞存在于lib/imap.c文件的imap_atom函数中,该函数在处理CURLOPT_USERNAME选项时,未能正确清理或转义回车(\r)和换行(\n)字符。攻击者可以在用户名字段中插入\r\n序列,从而注入任意IMAP命令。当这些字符被发送到服务器时,它们会终止当前命令,并使后续数据被解释为一个新的、独立的命令(协议走私)。
受影响版本: 我已在curl的最新master分支上成功复现此问题。
复现步骤
要复现此问题,我们需要绕过CLI参数解析,直接通过C程序使用libcurl。同时需要一个手动的netcat监听器来观察原始协议数据。
1. 设置一个假的IMAP服务器:
打开一个终端,使用netcat监听143端口(或任何可用端口):
sudo nc -lvp 143
2. 编译概念验证(PoC)代码:
将以下代码保存为poc_imap.c,并针对libcurl进行编译(例如:gcc poc_imap.c -o poc_imap -lcurl):
|
|
3. 运行PoC:
执行编译后的二进制文件:./poc_imap
4. 触发注入(手动握手):
在运行netcat的终端(步骤1)中,你会看到一个连接。你必须手动模拟IMAP服务器的问候语,以便libcurl继续发送数据。
- 输入:
* OK IMAP server ready并按回车。 - 等待curl发送
A001 CAPABILITY。 - 输入:
A001 OK Capability completed并按回车。
5. 观察注入:
握手之后,立即在netcat终端中观察输出。
结果:
服务器接收到:A002 LOGIN hacker LOGOUT password123
预期行为:
用户名应该被引号包裹(例如,"hacker\r\nLOGOUT")或者客户端应该在发送前拒绝CRLF字符。
支持材料/参考资料:
- 易受攻击组件:
lib/imap.c,特别是处理相关操作的imap_atom函数。 - 影响:这允许协议走私,使攻击者能够在经过身份验证的会话上下文中执行任意IMAP命令(如DELETE、SELECT、CREATE)。
影响
摘要:
该漏洞通过libcurl API(CURLOPT_USERNAME)触发,而非通过本地配置文件。这意味着它引入了一个远程攻击向量。
例如,一个使用libcurl对IMAP/SMTP服务器进行用户身份验证的Web应用程序,如果直接将未经净化的Web表单用户输入传递给curl_easy_setopt,就会受到协议注入/走私攻击。该库在通过网络发送之前,未能本地转义CRLF字符,破坏了协议的完整性。我已在本地使用提供的PoC确认了此行为。
漏洞变种分析
1. POP3协议同样存在漏洞
我确认POP3协议(lib/pop3.c)也存在相同的CRLF注入问题。
PoC(POP3):
- 目标:模仿POP3服务器的本地netcat监听器。
- 负载:
admin\r\nDELE 1(在CURLOPT_USERNAME中)。 - 观察到的输出:
1 2USER admin DELE 1DELE 1命令成功以新行注入,如果应用程序将未经净化的输入传递给用户名选项,攻击者即可删除消息或执行其他POP3命令。
这证实了在旧协议处理器(imap.c, pop3.c)中普遍缺乏对控制字符的输入净化。
2. FTP协议也确认存在漏洞
我成功地在FTP协议处理器(lib/ftp.c)中复现了CRLF注入。
PoC详情:
- 目标:
ftp_state_user函数。 - 负载:传递给
CURLOPT_USERNAME的anonymous\r\nSITE EXEC calc。 - 观察到的输出(Netcat):
1 2USER anonymous SITE EXEC calc
3. 第四个协议确认:RTSP头注入
我检查了RTSP实现(lib/rtsp.c),确认它也可以通过CURLOPT_RTSP_STREAM_URI受到CRLF注入攻击。
PoC输出(Netcat):
|
|
分析:注入流URI的\r\n字符破坏了RTSP请求行,迫使X-Hacked: YouArePwned被解释为一个新的头部。
易受攻击协议总结
- IMAP(认证/用户)
- POP3(认证/用户)
- FTP(认证/用户)
- RTSP(请求行/流URI)
这证实了在将输入写入套接字之前,库在处理基于文本的协议时普遍存在输入净化失败的问题。我强烈建议采用集中修复方式,而不是单独修补每个文件。
项目方回应与处理
bagder (curl 团队成员) 评论:
这是有文档记录和警告的。不被视为安全问题。
报告者进一步交流: 感谢快速分类,Badger。 我理解“净化是应用程序的责任”这一立场。我尊重libcurl旨在精确传输所提供内容的目标。 然而,考虑到以下因素:
- 许多依赖libcurl的现代包装器或应用程序默认假设库能处理基本的协议封装安全(例如防止头注入)。
- 开发人员忽略此警告会导致严重的协议注入漏洞(IMAP/SMTP/RTSP走私)。
未来是否有可能考虑一个“加固”补丁,明确拒绝在特定选项(如CURLOPT_USERNAME/CURLOPT_RTSP_STREAM_URI)中出现CRLF?或者,也许可以为这些特定选项在文档中做出更醒目的警告?
项目方最终处理:
bagder 随后评论称此前已有约37次类似报告。并说明该论坛不适合讨论此类改进。随后,报告状态被更改为 Not Applicable(不适用),并指出不被视为安全问题。
根据项目的透明度政策,该报告随后被公开披露。
报告状态:
- 状态:已披露(Disclosed)
- 严重性:严重(9 ~ 10)
- 弱点:CRLF注入
- CVE ID:无
- 赏金:无