同形异义词,进攻!

2025-05-25

同形异义词,进攻!

我们从 20 世纪 90 年代就已知道同形异义词攻击的存在——所以你可能想知道为什么我在 2018 年才写这篇文章。别担心,我会讲到的。在这篇文章中,我们将探讨同形异义词攻击的历史,以及为什么像互联网上许多源于路径依赖的问题一样,它们似乎永远不会消失。

我的兴趣起源

几个月前,我在 Kickstarter 的Hackerone项目上处理申请单时,第一次对同形异义词攻击产生了兴趣。HackerOne 是一个“漏洞赏金计划”,或者说,它邀请黑客和安全研究人员在我们的网站上寻找漏洞,并支付一定的报酬。

当我浏览这些工单时,其中一个引起了我的注意。这并非什么高风险漏洞,但工单上有很多单词我都看不懂,所以我当然很感兴趣。这个黑客关注的是 Kickstarter 的个人资料页面。(我们经常收到关于我们个人资料和项目页面的报告。)

Kickstarter 个人资料页面示例

个人资料页面通常会给网站带来漏洞。每当你在你的网站上“托管”某人时,你都必须考虑他们会如何滥用你赋予他们的合法性。我们的黑客特别关注一个允许我们的用户在其个人资料中添加用户网址或“网站”的字段。

Kickstarter 个人资料页面网站示例

他们认为这部分内容可以用来进行同形异义词攻击。我当时就想,同形异义词攻击到底是什么?这个问题让我陷入了国际互联网治理的泥潭,查阅了大量的 RFC 文件,以及数十年来关于互联网全球性本质的争论。

互联网名称与数字地址分配机构 (ICANN)

我们必须从 ICANN 开始说起,它是本篇报道中负责管理的主要国际互联网机构。ICANN 制定了关于域名的所有规则(同时还负责 DNS 根区域注册管理机构的技术维护以及互联网命名空间的维护)。

例如,假设你去 Namecheap 注册“loganisthemostawesome.com”。Namecheap 使用“可扩展配置协议”向 Verisign 验证你的域名。Verisign 是管理“.com”通用顶级域名注册局的机构。Versign 会根据你的注册尝试,检查 ICANN 的规章制度,并将结果告知 Namecheap,然后 Namecheap 会告诉我是否可以注册“loganisthemostawesome.com”。剧透:我可以!

这很棒。但我主要说英语,而且我所有优秀的互联网业务都使用 ASCII 码。那些无法用兼容 ASCII 码的文字表达的其他语言怎么办?

国际化域名版本 1

ICANN 在 90 年代末提出并实施 IDN作为域名标准协议时,试图回答这个问题。他们希望互联网更加全球化,因此将域名开放给各种以 Unicode 表示的文字。

什么是文字?文字是用于单一系统的字母/符号的集合。例如,拉丁文是一种支持多种语言的文字,而汉字等文字则是支持日语的文字之一。文字可以支持多种语言,而语言也可以由多种文字组成。ICANN 维护着与任何给定文字关联的所有 Unicode 字符的表格。

现在更棒了!通过国际化域名 (IDN),ICANN 使我们能够跨多种文字表达互联网社群。然而,有一个重要的要求:ICANN 的域名系统 (Domain Name System)提供查找服务,将用户友好的名称转换为用于定位互联网资源的网络地址,但实际上只能使用 ASCII 字符。

Punycode

因此,ICANN 转向了 Punycode。Punycode 就是 puny unicode。Bootstring 是一种算法,用于将以语言原生脚本(unicode)编写的名称转换为与域名系统(punycode)兼容的 ASCII 文本表示。

例如,以这个虚构的域名为例(因为我们仍然不能在 gTLD 中使用表情符号😭):

hi👋friends💖🗣.com

如果您将其放入浏览器中,则针对域名系统的实际查找必须使用 punycode 等效项:

xn--hifriends-mq85h1xad5j.com

所以,问题解决了。我们有办法使用Unicode字符集的域名,这些字符集代表了互联网的全球覆盖范围,并且可以开始分配IDN了。太棒了!还有什么问题呢?

同形异义词

嗯,事情并不总是像表面看起来的那样。这就是同形异义词和同形字的由来。

同形异义词指的是多个看起来相同但含义不同的事物。英语中有很多这样的词,例如“lighter”可以指打火机,也可以指比较级形容词。

IDN 的问题在于,同形异义词也存在于不同文字之间,许多拉丁字母在其他文字(如希腊文或西里尔文)中都有副本。

来自 homoglyphs.net 的类似示例:

Homoglyphs.net 同形异义词示例图片

让我们看一个域名的例子。

华盛顿邮报

对比

washingtonpost.com

你能看出区别吗?好吧,让我们把这两个字符都翻译成纯 ASCII 码:

华盛顿邮报

对比

xn--wshingtonpost-w1k.com

哦,这肯定不一样。不过,为了让 punycode 更方便用户使用,用户代理会让它们在浏览器中显示相同。但实际上,假冒的华盛顿邮报中的第一个“a”实际上是一个西里尔字母。翻译成 punycode 后,我们可以看到剩下的 ASCII 字符“wshingtonpost”,以及表示西里尔字母 a 的键“w1k”。

这给 ICANN 带来了一个大麻烦。您可以清楚地看到,当用户代理将两个“华盛顿邮报”都解读为同形异义词,使它们看起来完全一样时,它们可能会被用于网络钓鱼攻击。那么 ICANN 该怎么办呢?

国际化域名版本 2 和 3

到2005年,ICANN找到了解决方案。他们告知通用顶级域名(gTLD)注册商,必须限制混合文字。每个注册域名都必须有一个“标签”,以表明该域名将使用哪种纯文字来支持其语言。如今,如果您尝试在 上注册我们模仿《华盛顿邮报》的网站xn--wshingtonpost-w1k.com,就会出现错误。注意:不过,对于需要混合文字的语言,例如日语,有一些例外。

问题解决了吧?嗯,虽然不允许使用混合文字,但根据 ICANN 的指导方针,纯文字仍然完全没问题。因此,我们仍然有一个问题。那么,如果使用西里尔字母或希腊字母,并且看起来像拉丁字母,那该怎么办呢?这样的文字会有多少呢?

概念验证

POC 的 Gif

嗯,当我和朋友@frewsxcv讨论同形异义词攻击时,他突然想到一个好主意:写一个脚本来查找易受攻击的 URL。于是,我编写了一个同形异义词攻击检测器,它可以:

  • 访问排名前 100 万的网站
  • 对于每个域,检查每个域中的字母是否与拉丁字母或十进制字母混淆
  • 检查该域名的 punycode url 是否已通过 WHOIS 查询注册
  • 返回我们可以注册的所有可用域名

很多 URL 看起来与西里尔字母有点不符(排名前 100 万的网站中也有很多是色情网站),但我们发现了一些有趣的网站,您可以注册。

例如,这是我个人最喜欢的。在FirefoxChrome中,访问:

https://раураӏ.com/

以下是它们在这些浏览器中的样子。

火狐浏览器:

Firefox IDN 显示算法

铬合金:

Chrome IDN 显示算法

太酷了!在 Firefox 中,地址栏里的 PayPal 看起来完全像官方的!然而,在 Chrome 中,它解析成了 punycode。这是为什么呢?🤔

用户代理及其国际化域名显示算法

这是因为 Chrome 和 Mozilla 使用不同的国际化域名显示算法。Chrome的算法比 Mozilla 的算法更严格、更复杂,并且包含特殊的逻辑来防止同形异义词攻击。Chrome 会检查域名是否位于 gTLD 上,并且所有字母是否都是易混淆的西里尔字母,如果是,则会在浏览器中显示 punycode 而不是 unicode 字符。Chrome 最近才改变了这一设置,因为Xudong Zheng 在 2017 年的报告中使用了www.xn--80ak6aa92e.com这一概念验证 (POC)。

另一方面,Firefox 仍然会以预期脚本显示完整的 URL,即使它容易与拉丁字符混淆。我想指出的是,Firefox 允许您更改设置以始终在浏览器中显示 Punycode,但如果您经常访问非 ASCII 域名的网站,这可能会非常难以访问。

那么,下一步是什么?

那么,如果我们认为有人可能会利用我们的网站使用同形异义词进行网络钓鱼,那么作为应用程序开发人员和维护人员,我们的责任是什么呢?我认为有几种可行的方法:

  1. 提倡 Mozilla 和其他用户代理确保改变其算法以保护用户。
  2. 主张 ICANN 改变有关注册带有拉丁易混淆字符的域名的规则。
  3. 实现我们自己的显示算法。这就是我们最终在 Kickstarter 上做的事情。我们使用了 Google 的开源算法,如果页面上显示的 URL 可能与其他 URL 同形异义词,则会显示警告。
  4. 最后,我们可以像@frewsxcv和我一样,注册这些域名来防止它们被恶意使用。如果我们所在的组织拥有一个易受攻击的域名,那么我们应该直接注册。

总而言之,这是一个难题!这就是为什么它已经存在了二十年。从根本上来说,这次攻击暴露的问题让我感到非常有趣。我个人认为 ICANN 允许使用各种文字的国际化域名 (IDN) 是正确的。互联网应该更加普及。

不过,我喜欢 Chrome 支持其显示算法的声明,它很好地总结了游戏的权衡:

我们希望避免混淆,同时确保跨语言用户在 Chrome 中拥有良好的体验。在过多的网址上显示 Punycode 或可见的安全警告会损害全球用户的网络可用性。

互联网上充斥着这种围绕可访问性和安全性的权衡。作为这个美好世界的使用者和维护者,我发现这样的对话是共同构建我们世界最美好的部分之一。

现在,我们只需要获得一些表情符号支持。

感谢阅读!🌍💖🎉🙌🌏

资源

背景

浏览器策略

工具

ICANN CFP 和指南

ICANN、Verisign 和域名注册流程

与域名相关的其他安全

同形异义词主要网站模仿示例

文章来源:https://dev.to/logan/homographs-attack--5a1p
PREV
通过集群优化 Node.js 性能
NEXT
为大规模 Vue.js 应用程序构建 Vuex 存储