如何防御同形异义词攻击?

信息安全 网址 统一码
2021-08-19 01:19:06

参考这个 Wikipedia同形异义词攻击示例, Wikipedia 的 URL 将拉丁字符 A 和 E 替换为类似的西里尔文副本 ( wikipediа.org)。这些字符看起来如此相似,如何区分它们?

3个回答

浏览器供应商已经尝试通过强制执行 IDN(国际化域名)应如何在 URL 栏中显示的策略来保护您免受同形异义词攻击。

他们的措施包括将可能容易混淆的符号(例如,“亚美尼亚连字符”U+058A)列入黑名单,并在某些条件下֊将带有非拉丁字母字符的 URL 显示为Punycode 。所以,如果你访问

https://wikipedia.org

该 URL 将在您的 URL 栏中显示为

https://xn--wikipedi-86g.org/

遵循 Punycode 转换规则,您可以轻松区分wikipedia.org.

如果您对浏览器用于显示 IDN 的特定算法感兴趣,请参阅:

然而,在保持可用性的同时转换错误的 IDN(例如,您仍想向ä德国的某人显示文字)已被证明有些难以捉摸,这就是为什么即使在 2018 年也出现了新的攻击。

如果您不信任浏览器的内置保护,还有一个可用的浏览器扩展程序会向您发出有关 IDN 域的警告(正如@defalt 指出的那样)。或者您可以选择手动检测方式,正如@wchargin 在他的回答中所描述的那样。

Arminius 的回答提到了浏览器呈现 punycode 而不是实际的 Unicode 字形的条件。根据我的经验,这些条件是不够的:例如,URL https://аррӏе.com/(链接是安全的,但可能是网络钓鱼站点!)被 Chrome 呈现为 punycode 而不是 Firefox:

展示同形异义词攻击的 Firefox URL 栏截图

这是我个人使用的解决方案。这可能是矫枉过正,但它可以防止这种攻击。

此解决方案的先决条件是,当您将任何凭据输入任何网站时,您始终在输入任何数据之前阅读地址栏。* 无论如何你都应该这样做!——但它实际上对于接下来的内容是必要的。

我的程序很简单。在输入凭据之前,我复制地址栏中的文本,然后启动hexob我定义如下的程序(在文件中~/bin/hexob):

#!/bin/sh
xsel -ob | xxd | xmessage -file -

该程序在消息框中显示剪贴板的 UTF-8 编码的代码单元,如下所示:

<code>hexob</code> 结果的屏幕截图:一个 <code>xmessage</code> 框,其中包含合法登录 URL 的十六进制转储

我可以通过读取主机快速验证这是一个有效的登录 URL:因为主机正确显示在右侧,主机的所有代码点都是 ASCII。

另一方面,如果有人将我链接到https://аррӏе.com/,这是同形异义词攻击的例子,那么消息框将如下所示:

欺骗性 URL 的 <code>hexob</code> 结果截图

在这里,我看到了 UTF-8 编码的代码单元,这与 UTF-8 编码https://аррӏе.com/有很大不同https://apple.com/.大多数代码点不是 ASCII,因此它们的 UTF-8 代码单元具有 MSB 集,因此它们仅在右侧显示为一些s。如果我.在 URL 的主机部分的右侧看到 s,我会停止并且不输入任何凭据。

我打字C-l C-c Super-p hexob RET完成整个过程,只需要几秒钟。(我的Super-p可能是你的Alt-F2或类似的。)

* 请注意,每次您要输入数据时都必须这样做。例如,如果您登录 Google 并输入密码,然后 Google 显示“密码不正确”,您必须再次执行此过程。这是因为 Google 的登录页面有一个开放的重定向:我可以创建一个页面,将您定向到 Google 的实际登录系统,并且在您登录后,自动将您重定向到我的钓鱼页面,该页面看起来与 Google 的登录系统完全一样,但由我。

其他答案中未提及的另一件事:除了其他好处外,密码管理器还可以帮助您防止这些攻击:您为 www.google.com 保存的凭据不会在 www.googIe.com 上自动填写(第二个- to-last 字符是一个大写的 I),暗示某事已关闭。您需要手动并明确地复制并粘贴密码才能登录该站点。