看起来一样,实际不同 - Unicode 的视觉攻击

apple.comаpple.com 在你看来一样吗?它们实际上是不同的。第二个 URL 中的第一个"а"不是拉丁字母"a",而是西里尔字母"а" (U+0430)。人眼无法区分,但对计算机来说它们是完全不同的字符,因此是不同的域名。

Unicode 是一个能够统一处理世界各地字符的革命性系统,但其丰富的字符集也带来了安全威胁。

同形异义词攻击 - 如何创建假域名

同形异义词攻击 (IDN 同形异义词攻击) 使用看起来相同 (或非常相似) 的不同字符创建假域名。

  • 拉丁字母"a" (U+0061) 和西里尔字母"а" (U+0430)
  • 拉丁字母"o" (U+006F) 和西里尔字母"о" (U+043E)
  • 拉丁字母"p" (U+0070) 和西里尔字母"р" (U+0440)
  • 拉丁字母"e" (U+0065) 和西里尔字母"е" (U+0435)

组合这些字符,你可以创建 аррle.com (全部西里尔字符),一个在视觉上与 apple.com 无法区分的域名。用作钓鱼网站 URL,即使是谨慎的用户也可能被欺骗。

浏览器对策

主流浏览器通过将混合脚本 (多种书写系统) 的域名显示为 Punycode 表示法来对抗同形异义词攻击。例如,西里尔字母的 аррle.com 会显示为 xn--pple-43d0151b.com,使欺骗立即显而易见。

然而,当整个域名由单一脚本组成 (例如全部西里尔字母) 时,某些浏览器可能会原样显示而不转换为 Punycode。

不可见字符 - 零宽字符的威胁

Unicode 包含几个不在屏幕上显示的"零宽字符"。

  • U+200B:零宽空格
  • U+200C:零宽非连接符
  • U+200D:零宽连接符
  • U+FEFF:零宽不换行空格 (BOM)

这些字符不可见但会影响字符串比较和哈希计算。

  • 水印:在机密文档中嵌入零宽字符以识别泄漏者的技术。通过为每个接收者插入不同模式的零宽字符,可以从泄漏文档中的模式识别泄漏者
  • 密码问题:复制粘贴密码时,如果包含零宽字符,就会出现"正确的密码无法登录"的情况
  • 代码篡改:在源代码中插入零宽字符,创建看起来相同但行为不同的代码 (Trojan Source 攻击)

方向控制字符 - 操纵文本流向

Unicode 包含控制文本显示方向的字符。由于阿拉伯语和希伯来语是从右到左书写的,这些控制字符有合法用途,但也可以被利用进行攻击。

  • U+202E:从右到左覆盖。强制所有后续文本从右到左显示

例如,文件名 document_‮fdp.exe 在屏幕上显示为 document_exe.pdf。用户以为是 PDF 文件并双击,但实际上是 .exe 文件 (可执行文件)。

开发者应注意什么

  • 接受用户输入时,清理 (删除) 零宽字符和方向控制字符
  • 验证域名时,转换为 Punycode 后再比较
  • 显示文件名时,删除或转义方向控制字符
  • 代码审查时,使用工具检测零宽字符注入 (例如 grep -P '[\x{200B}-\x{200F}\x{202A}-\x{202E}]')

总结

Unicode 是一个能够统一处理世界各地字符的卓越系统,但其丰富性也带来了安全威胁。同形异义词攻击、零宽字符、方向控制字符,了解这些威胁可以提高你对钓鱼网站 URL 和可疑文件名的警惕性。访问 IP 确认时,养成验证 URL 栏中域名是否正确的习惯。

相关术语

钓鱼 使用同形异义词攻击创建假域名来冒充合法网站的技术。 DNS 国际化域名 (IDN) 被转换为 Punycode 并通过 DNS 解析。 HTTPS 即使是假域名也可以获得 TLS 证书,因此仅有 HTTPS 不能保证安全。 IP 地址 不同的域名指向不同的 IP 地址。同形异义词攻击的假域名指向不同的 IP。