看起来一样,实际不同 - 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 栏中域名是否正确的习惯。