跳到主要内容

10. 安全考虑

UTF-8 的实现者需要考虑处理非法 UTF-8 序列时的安全方面. 可以设想, 在某些情况下, 攻击者能够通过发送 UTF-8 语法不允许的八位组序列, 利用不够谨慎的 UTF-8 解析器.

过长编码攻击

这种攻击有一种特别隐蔽的形式, 可用于针对这样的解析器: 它会对输入的 UTF-8 编码形式执行安全关键的有效性检查, 但又把某些非法八位组序列解释为字符.

示例 1: NUL 字符

例如, 解析器可能禁止编码为单八位组序列 00 的 NUL 字符, 但错误地允许非法的双八位组序列 C0 80, 并将其解释为 NUL 字符.

示例 2: 路径遍历

另一个例子是, 解析器可能禁止八位组序列 2F 2E 2E 2F ("/../"), 却允许非法的八位组序列 2F C0 AE 2E 2F.

现实影响

后一种利用方式实际上曾出现在 2001 年一种广泛传播的攻击 Web 服务器的病毒中. 因此, 这种安全威胁非常现实.

缓冲区溢出风险

另一个安全问题出现在编码为 UTF-8 时: ISO/IEC 10646 对 UTF-8 的描述允许对最高到 U+7FFFFFFF 的字符编号进行编码, 从而产生最长 6 字节的序列.

因此, 如果出现以下情况, 就存在缓冲区溢出的风险:

  • 字符编号范围没有被明确限制为 U+10FFFF
  • 缓冲区大小计算没有考虑 5 字节和 6 字节序列的可能性

规范等价问题

安全性还可能受到包括 UTF-8 在内的若干字符编码的一项特性影响: 从用户角度看是"同一事物"的内容, 可以由几个不同的字符序列表示.

示例: 带重音的字符

例如, 带锐音符的 e 可以表示为:

  • 预组合的 U+00E9 E ACUTE 字符
  • 与其规范等价的序列 U+0065 U+0301 (E + COMBINING ACUTE)

安全影响

即使 UTF-8 为每个字符序列提供唯一的字节序列, "同一事物"存在多个字符序列这一事实, 在涉及以下操作时仍可能产生安全后果:

  • 字符串匹配
  • 索引
  • 搜索
  • 排序
  • 正则表达式匹配
  • 选择操作

示例攻击场景

一个例子是, 对凭据中出现的标识符和访问控制列表条目中的标识符进行字符串匹配.

Unicode 规范化

这个问题可以通过基于 Unicode Normalization Forms 的方案来解决, 见 [UAX15].

Normalization Forms 提供规范表示, 以确保等价字符在比较时被视为相等.


相关链接