跳到主要内容

5. 安全考虑

在终端或终端仿真器上显示消息时必须谨慎. 功能强大的终端可能会对转义序列以及 US-ASCII 控制字符的其他组合执行动作, 并产生多种后果. 它们可以重新映射键盘, 或允许对终端进行其他修改, 从而导致 denial of service (DoS, 拒绝服务) 甚至数据损坏. 它们可以触发 (有时可编程的) answerback 消息, 从而允许以收件人的名义发送消息. 它们还可能影响连接到终端的其他设备 (例如打印机) 的运行.

消息查看器可能希望在显示消息之前从消息中移除潜在危险的终端转义序列. 但是, 其他转义序列会为有用目的出现在消息中 (见 ISO 2022, RFC 2045, RFC 2046, RFC 2047, RFC 2049, RFC 4288, RFC 4289), 因而不应不加区分地移除.

主要安全问题

1. 终端转义序列攻击

威胁: 恶意转义序列可以控制终端行为

风险:

  • 键盘重新映射
  • 终端设置修改
  • 自动命令执行
  • 影响连接设备 (例如打印机)

缓解措施:

  • 显示前过滤危险转义序列
  • 保留合法转义序列 (例如 ISO 2022, MIME 编码)
  • 使用沙箱化或受限显示环境
危险示例:
ESC]0;Malicious TitleBEL → 修改终端标题
ESC[2J → 清屏
Specific control sequences → 键盘重新映射

2. 非文本对象传输

在消息中传输非文本对象会引入额外安全问题. 这些问题在 RFC 2045, RFC 2046, RFC 2047, RFC 2049, RFC 4288 和 RFC 4289 中讨论.

MIME 相关风险:

  • 可执行附件
  • 脚本注入
  • 缓冲区溢出
  • 恶意内容类型

3. Bcc 字段信息泄露

许多实现使用第 3.6.3 节描述的 "Bcc:" (blind carbon copy, 密送) 字段, 以便向收件人发送消息, 同时不向其他收件人透露一个或多个收件人的地址. 如果错误处理 "Bcc:" 的这种用法, 可能会泄露机密信息; 即便只是知道某个特定电子邮件地址存在, 也可能引发安全问题.

场景 1: 移除 Bcc 行

如果使用第 3.6.3 节描述的第一种方法, 即从消息中移除 "Bcc:" 行, 则密送收件人除了其地址未出现在消息头部区这一事实外, 没有明确指示表明自己收到的是密送副本. 因此, 某个密送收件人可能会向所有显示出来的收件人发送回复, 从而意外暴露该消息曾发送给此密送收件人.

问题:
原始消息:
To: [email protected]
Bcc: [email protected] (this line removed)

[email protected] 收到:
To: [email protected]
(不知道自己是 Bcc)

风险:
[email protected] 点击 "Reply All":
To: [email protected] ← 暴露 [email protected]

场景 2: 保留 Bcc 字段

当使用第 3.6.3 节的第二种方法时, 即在消息的独立副本中使密送收件人的地址出现在 "Bcc:" 字段中:

  • 如果已发送的 "Bcc:" 字段包含所有密送收件人, 每个 "Bcc:" 收件人都会看到所有 "Bcc:" 收件人
  • 即便向每个 "Bcc:" 收件人发送只包含该个人地址的独立消息, 实现仍需谨慎处理对该消息的回复, 以避免意外向其他收件人暴露密送收件人
问题场景:
发送给每个 Bcc 收件人的消息:
To: [email protected]
Bcc: [email protected]

发送给另一个 Bcc 收件人的消息:
To: [email protected]
Bcc: [email protected]

风险:
如果回复处理不当, 可能暴露其他 Bcc 收件人

安全最佳实践

面向消息查看器

实践描述
过滤控制字符移除或转义潜在危险的控制字符
白名单转义序列仅允许已知安全的转义序列
沙箱渲染在受限环境中渲染消息内容
警告用户提醒用户注意潜在危险内容

面向电子邮件客户端

实践描述
Bcc 处理正确实现 Bcc 字段隐私保护
回复处理防止意外暴露 Bcc 收件人
附件扫描扫描附件中的恶意内容
内容验证验证 MIME 内容类型和编码

面向电子邮件服务器

实践描述
内容过滤过滤已知恶意模式
大小限制限制消息和附件大小
速率限制防止 spam 和 DoS 攻击
认证实现 SPF, DKIM, DMARC

威胁场景摘要

高风险威胁

  1. 终端控制攻击

    • 影响: 系统控制
    • 缓解措施: 过滤转义序列
  2. Bcc 信息泄露

    • 影响: 隐私泄露
    • 缓解措施: 正确实现 Bcc
  3. 恶意附件

    • 影响: 代码执行
    • 缓解措施: 扫描和隔离

中风险威胁

  1. 社会工程

    • 影响: 欺骗用户
    • 缓解措施: 用户教育, 发件人验证
  2. Spam

    • 影响: 资源消耗
    • 缓解措施: 过滤和速率限制

安全实现检查清单

消息显示

  • 过滤或转义控制字符
  • 验证并限制转义序列
  • 在沙箱环境中渲染 HTML
  • 对可疑内容发出警告
  • 限制自动下载

Bcc 处理

  • 正确移除或隔离 Bcc 字段
  • 防止回复时暴露 Bcc
  • 为 Bcc 收件人创建独立副本
  • 测试各种 Bcc 场景

MIME 处理

  • 验证 Content-Type
  • 检查 Content-Transfer-Encoding
  • 扫描附件
  • 限制嵌套层级
  • 强制大小限制

相关安全标准

  • RFC 2045-2049: MIME 安全考虑
  • RFC 5321: SMTP 安全考虑
  • RFC 6376: DKIM (DomainKeys Identified Mail)
  • RFC 7208: SPF (Sender Policy Framework)
  • RFC 7489: DMARC (Domain-based Message Authentication, Reporting, and Conformance)

摘要

实现 RFC 5322 时的安全考虑主要集中在三个方面:

  1. 显示安全: 防止终端转义序列攻击
  2. 隐私保护: 正确处理 Bcc 字段
  3. 内容安全: 安全处理 MIME 和附件

所有实现都应采用 defense-in-depth (纵深防御) 策略, 在多层实施安全控制, 并持续警惕新威胁.


下一节: 6. IANA 考虑

上一节: 4. 过时语法