🔴 严重 | CVE-2026-46428 — lettre is a a mailer library for Rust. Starting in...
🔴 【深度分析】严重安全漏洞:CVE-2026-46428
CVSS 评分: 严重(9.1)🔴 状态: Deferred 发布时间: 2026-07-20
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-46428 |
| CVSS 评分 | 9.1 🔴 |
| 严重程度 | 严重 |
| CVSS 向量 | CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X |
| CWE 分类 | CWE-295 |
| 发布时间 | 2026-07-20 |
| 最后更新 | 2026-07-23 |
| 状态 | Deferred |
| 数据来源 | security-advisories@github.com |
CVSS 4.0 评分:9.1(严重)
CVSS 向量: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:N/SC:L/SI:L/SA:N
CWE: CWE-295(证书验证不当)
影响组件: lettre(Rust 邮件库)boring-tls 功能分支
漏洞概述
lettre 是一个用 Rust 编写的邮件发送库,广泛用于需要 SMTP 支持的应用程序。该漏洞(CVE-2026-46428)存在于 lettre 与 boring-tls(基于 BoringSSL 的 TLS 前端)的集成中。由于一个反向布尔逻辑错误,默认的严格 TLS 配置下,主机名验证被静默禁用。这意味着攻击者只要拥有任意域名的合法证书(链验证通过),就可以执行中间人攻击,拦截 SMTP 传输中的 PLAIN/LOGIN 凭据以及邮件内容。
该漏洞影响 lettre 版本 0.10.1 至 0.11.21(含)。其他 TLS 后端(native-tls、rustls)不受影响。补丁版本 0.11.22 已修复此问题。
受影响组件与版本
| 组件 | 受影响版本范围 |
|---|---|
| lettre crate(Rust 包) | >= 0.10.1, < 0.11.22 |
启用 boring-tls 特性 |
所有使用该特性的构建均受影响 |
| 其他 TLS 后端 | native-tls 和 rustls 不受影响 |
注意: 即使开发者在代码中显式使用了严格模式(要求证书链与主机名均校验),由于反向布尔错误,主机名校验实际上被跳过。
漏洞原理分析
1. 技术背景
lettre 支持多种 TLS 后端,其中 boring-tls 基于 Google 的 BoringSSL 库。在 TLS 连接建立时,通常需要执行两个证书验证步骤:
- 证书链验证:确保证书由受信任的 CA 签发且未过期。
- 主机名验证:确保证书中的 CN/SAN 与目标服务器的主机名匹配。
lettre 的默认配置(TlsParameters::new() 或 TlsParameters::builder().build())会同时启用链验证和主机名验证,属于“严格模式”。
2. 漏洞成因
根据 NVD 描述,漏洞源于 boring-tls 集成中的一个反向布尔错误(inverted-boolean bug)。具体来说,在设置 TLS 验证选项时,代码可能错误地将“启用主机名验证”的条件取反,导致本应生效的主机名验证被静默关闭。例如:
// 伪代码示意(非实际代码)
if should_verify_hostname {
// 正确:设置主机名验证
ssl_ctx.set_verify_hostname(true);
} else {
// 错误分支
}
若逻辑误写为 if !should_verify_hostname,则当 should_verify_hostname 为 true(严格模式)时,实际执行的是 else 分支,即 不设置主机名验证,且不会产生任何警告或错误。
由于攻击者仅需提供任意一个由受信任 CA 签发的证书(例如为其控制下的域名申请的合法证书),即可通过链验证,但主机名验证被绕过,因此攻击者可以用自己的证书冒充任何 SMTP 服务器。
3. 攻击向量
- 攻击前提(AT:P): 攻击者需要处于客户端与 SMTP 服务器之间的网络路径上(例如同一 Wi-Fi 网络、上游 ISP 或路由节点)。
- 利用复杂度(AC:L): 攻击者只需持有任意合法证书(可通过 Let's Encrypt 等免费 CA 轻易获取),并拦截 SMTP 连接(标准端口 587/465)。
- 无需权限(PR:N)且无需用户交互(UI:N): 客户端自动发起 SMTP 连接,攻击者可透明地执行 TLS 降级或证书替换。
影响评估
攻击难度
| 指标 | 分析 |
|---|---|
| 网络访问(AV:N) | 攻击者可从远程网络发起,不要求本地访问 |
| 攻击前提(AT:P) | 需要处于中间人位置(如同一子网或控制路由) |
| 攻击复杂度(AC:L) | 利用方式简单,证书可自行签发 |
| 权限要求(PR:N) | 无需在目标系统上拥有任何权限 |
| 用户交互(UI:N) | 无需用户点击或确认 |
潜在后果
- 机密性丧失(VC:H): 攻击者可截获 SMTP 登录凭据(PLAIN/LOGIN 明文)以及邮件正文。
- 完整性丧失(VI:H): 攻击者可篡改或伪造邮件内容,甚至重放身份认证。
- 可用性无影响(VA:N): 攻击不直接导致服务不可用。
- 后续影响(SC:L/SI:L): 若凭据被窃取,可能导致邮件服务器被滥用(低影响)。
受影响场景
- 使用
boring-tls特性的 Rust 应用程序(如邮件发送后端、监控告警系统、自动化通知服务)。 - 在不可信网络中运行(如公共 Wi-Fi、云服务提供商内部网络)。
- 依赖于 PLAIN/LOGIN 认证的 SMTP 配置(虽然建议使用 OAUTH2,但许多遗留系统仍使用明文认证)。
修复建议
1. 立即升级
将 lettre 升级至 0.11.22 或更高版本。Cargo.toml 中:
[dependencies]
lettre = "0.11.22"
如果锁定版本,请运行 cargo update -p lettre。
2. 临时缓解措施(若无法升级)
- 更换 TLS 后端: 将
features中的boring-tls替换为native-tls或rustls。例如:# Cargo.toml [dependencies.lettre] version = "0.11.21" # 临时保留 default-features = false features = ["rustls-tls"] # 或 "native-tls" - 网络层加固: 使用 VPN、TLS 隧道或 IP 白名单限制 SMTP 服务器连接至可信网络。
- 强制证书固定(Certificate Pinning): 在应用层额外验证服务器证书的指纹(但需注意与默认 TLS 机制的兼容性)。
3. 验证修复
升级后,可使用 Wireshark 或 tcpdump 抓包确认是否仍存在主机名验证被绕过的行为(例如尝试连接到一个 SNI 与实际域名不匹配的服务器,应被拒绝)。
参考资料
- CVE 详情(NVD): https://nvd.nist.gov/vuln/detail/CVE-2026-46428
- GitHub Advisory: https://github.com/lettre/lettre/security/advisories/GHSA-xxxx (暂缺具体链接,建议关注官方 repo)
- lettre 仓库: https://github.com/lettre/lettre
- CWE-295(Improper Certificate Validation): https://cwe.mitre.org/data/definitions/295.html
- CVSS 4.0 计算器: https://www.first.org/cvss/calculator/4.0
免责声明: 本分析基于公开 NVD 数据及常见补丁模式进行合理推断,具体代码细节请参考 lettre 官方补丁提交。若需进一步取证,建议审查 lettre 与 boring-tls 集成的 Cargo.toml 及 src/transport/smtp/tls.rs 相关变更。