浏览器接受斜体/粗体 Unicode 作为垃圾邮件 URL 的一部分

信息安全 网络钓鱼 垃圾邮件 网址 统一码
2021-08-14 08:45:35

这真是太疯狂了。我收到了一封垃圾邮件,其中有一个由明显的 Unicode 字符制作的 URL,这些字符令人惊讶地存在于斜体/粗体字母中,当我使用 Thunderbird 的“报告垃圾邮件电子邮件”功能向 Google 的垃圾邮件收集器报告它时,它已经被转换为 ASCII 字母,因此该 URL 未正确报告。

这是 Unicode 版本:<base href="http://𝙪𝙯𝙣𝙙𝙧𝙚𝙨𝙨.COM">

注意!这些字符是粗体/斜体不是因为我选择这样做,而是因为 Unicode 奇怪地包含粗体/斜体字母。

在此处查看十六进制值:

0011660   e   >   <   /   t   i   t   l   e   >   <   b   a   s   e  sp
       3e65    2f3c    6974    6c74    3e65    623c    7361    2065
      e   >   <   /   t   i   t   l   e   >   <   b   a   s   e    
0011700   h   r   e   f   =   "   h   t   t   p   :   /   /   p  gs  em
       7268    6665    223d    7468    7074    2f3a    f02f    999d
      h   r   e   f   =   "   h   t   t   p   :   /   / 360 235 231
0011720   *   p  gs  em   /   p  gs  em   #   p  gs  em  em   p  gs  em
       f0aa    999d    f0af    999d    f0a3    999d    f099    999d
    252 360 235 231 257 360 235 231 243 360 235 231 231 360 235 231
0011740   '   p  gs  em sub   p  gs  em   (   p  gs  em   (   .   C   O
       f0a7    999d    f09a    999d    f0a8    999d    2ea8    4f43
    247 360 235 231 232 360 235 231 250 360 235 231 250   .   C   O

URL 是否可以实际包含这些 Unicode 字符,或者所有浏览器都会将它们转换为 ASCII?

无论是 ASCII 还是 Unicode,ping 都会将此解析为 185.86.76.164。

为什么这些 Unicode 字符首先存在?谁要求粗体/斜体字母?

3个回答

以前的答案都在这里讲述了故事的一部分,但有几个不同的方面需要理解。

首先,为什么这些代码点存在?Unicode 有志于取代所有以前的文本编码方式,这意味着它包含许多不同类型的脚本和符号。其中有一些看起来像字母(因为它们是)但被数学家视为符号的东西。例如,U+211D DOUBLE-STRUCK CAPITAL R 是“ℝ”符号,用于表示“所有实数的集合”。

垃圾邮件中使用的代码点来自称为数学字母数字符号的代码块

其次,为什么在某些情况下它们会被视为“正常”字母?Unicode 定义了一组“规范化形式”,因为某些自然字符可以用 Unicode 代码点以多种方式表示。例如,“â”是代码点 U+00E2,但也可以用“a”(U+0061)+修饰符 U+0302 COMBINING CIRCUMFLEX ACCENT 来表示。“NFC”是一种将字符转换为可能的“组合”形式的映射(例如,[U+0061, U+0302] 变为 U+00E2);“NFD”在可能的情况下将它们转换为“分解”形式(例如,U+00E2 变为 [U+0061, U+0302])。

在这种情况下,“NFD”和“NFC”之间的表示没有区别,但是有一个称为“NFKC”的额外规范化,它使用“兼容性”映射。这些是单向映射,可以选择在用法上等效的更常见的代码点,例如“ffi”(U+0066、U+0066、U+0069)作为组合连字“ffi”(U+FB03 ) - 或者在当前情况下,标准拉丁语“u”(U+0075)代表数学符号“𝙪”(U+1D66A)。

这与 URL 有什么关系?处理域名中 Unicode 的标准称为“IDNA”,是一个相当复杂的标准。我能找到的相关部分是:

  • RFC 5890指定所有字符串在用于域之前都应根据NFC进行规范化。这与某些 URL 相关,但与我们在这里查看的代码点无关。
  • RFC 5892将许多代码点列为“禁止”:包含这些代码点的域名根本不允许存在该列表包括我们正在查看的代码点(“1D552..1D6A5; DISALLOWED”)。
  • RFC 5894阐明了不允许的代码点是那些如果根据NFKC规范化就会改变的代码点。因此,它建议用户代理(例如浏览器)可能希望在将用户输入视为域名之前对用户输入应用 NFKC 映射。

所以,据我所知:

  • “𝙪𝙯𝙣𝙙𝙧𝙚𝙨𝙨.COM”不是有效的域名
  • 遇到它的浏览器可以将其转换为“uzndress.com”而不是显示错误(就像它将“COM”转换为小写的“com”一样)

最后一点,您没有问,但值得讨论:如果垃圾邮件无效,为什么要使用此域?原因是如果垃圾邮件过滤器只查看邮件文本,而不应用诸如 NFKC 之类的映射,则同一域的不同“拼写”可能不会使过滤器失效。因此,使用这些代码点与编写“uZnDreSs.cOm”并希望垃圾邮件过滤器不应用大小写折叠相同。

请注意,这是与 IDN 同形异义词攻击不同的问题,IDN 同形异义词攻击可以在有效域名中使用视觉上相似的代码点,例如“еbаy.com”,它看起来像“ebay.com”,但实际上是不同的域,混合拉丁文和西里尔文字母。(NFKC 不会西里尔文转换为拉丁文,因为它们是不同的字母,恰好有一些视觉上相似的字母。)

您在这里拥有的是数学符号,请参阅unicode 文本分析器的输出

浏览器 代码点 名称 # 字体 脚本
𝙪 U+1D66A 数学无衬线粗斜体小 U 12 常见的
𝙯 U+1D66F 数学无衬线粗斜体小 Z 12 常见的
𝙣 U+1D663 数学无衬线粗体斜体小 N 12 常见的
𝙙 U+1D659 数学无衬线粗体斜体小 D 12 常见的
𝙧 U+1D667 数学无衬线粗体斜体小 R 12 常见的
𝙚 U+1D65A 数学无衬线粗斜体小 E 12 常见的
𝙨 U+1D668 数学无衬线粗体斜体小 S 12 常见的
𝙨 U+1D668 数学无衬线粗体斜体小 S 12 常见的

这些符号在 Unicode 方面被认为等同于相应的“普通”字符,即 u、z、n、...。在处理包含 Unicode 的 URL 时,客户端将首先执行这样的 Unicode 规范化步骤,如果之后仍然包含非 ASCII 字符(这里不是这种情况),它将把它转换为Punycode

...它已被转换为 ASCII 字母,因此未正确报告 URL

由于它已正确规范化,因此它是浏览器访问它时的实际相关 URL。因此,它得到了适当的报道。

但是,它比这个相当简单的解释还要复杂。有关详细信息,请参阅IMSoP 的答案

Unicode 包含各种原因的集合,例如unicode italic r

 𝙧 1D667 数学无衬线粗体斜体小写 R 小写字母

所以在这种情况下,它是用于数学用例的。

这些将不会被解析为它的 ASCII 值,而是可以使用RFC: 5890 IDNA或仅使用 irl 编码来解析。

它不会被翻译成最近的 ASCII 码点。

至于为什么,你可以阅读 unicode consortium 会议上关于那里接受的记录。