Punycode 与同形字:当假域名看起来和真的一样
看看这两个网址:paypal.com 和 pаypal.com。一样吗?在我们眼里,是的。对电脑来说,完全不是:第二个网址里的第二个“а”是西里尔字母,不是拉丁字母“a”。这是两个不同的域名,可以属于两个不同的人。这就是同形字攻击的原理。要理解它,得先绕个小弯,看看互联网是怎么书写名字的。
Unicode、ASCII 和 Punycode:三个词,一个简单的想法
最初,域名只接受一个很小的字母表,叫作 ASCII:不带重音的字母 a 到 z、数字和连字符。没有“é”,没有“ü”,更别说阿拉伯文、中文或西里尔字母了。
可世界上有几十种文字。Unicode 是一个大目录,给每种文字的每个字符编了号:拉丁字母“a”的编号是 U+0061,西里尔字母“а”的编号是 U+0430。字形相同,编号不同。
为了在不改造整个网络的前提下支持各种语言的域名,人们发明了一个翻译官:Punycode。它把用 Unicode 写成的名字转换成只使用 ASCII 字母的名字,并加上前缀 xn-- 作为标记。浏览器显示好看的版本;网络只看到翻译后的版本。
“xn--”域名是怎么回事
举一个完全正当的例子:法国域名 société.fr(“公司”)。网络读不懂“é”。Punycode 先把特殊字母放到一边,保留普通字母,再在末尾加一小段代码,说明重音字母该放回哪里:
société.fr → xn--socit-esab.fr
我们能看到“socit”(普通字母),然后是“esab”,这段代码说明要插入哪些字符、插在哪里。前缀 xn-- 只是提醒:“注意,这个名字经过了翻译。”数以百万计的正当域名都是这样工作的,德文、阿拉伯文、俄文,还有中文,都是如此。所以 xn-- 本身并不可疑。只有当它模仿知名品牌时,才变得可疑。
同形字攻击:假双胞胎
同形字是指与另一个字符长得几乎一模一样的字符。Unicode 里这样的字符很多:西里尔字母“а”“е”“о”“р”“с”,就是拉丁字母 a、e、o、p、c 的完美替身。希腊字母“ο”则冒充“o”。
骗子注册一个把一个或多个字母换成替身的域名。2017 年,一位研究人员做了一次令人震惊的演示:他注册了 xn--80ak6aa92e.com,写出来是全部由西里尔字母组成的 аррӏе.com,而当时好几款主流浏览器的地址栏里直接显示“apple.com”。此后,浏览器修复了这种情况。
为什么网址看起来可能是正当的
现代浏览器会采用一些谨慎规则:当一个名字以可疑的方式混用不同文字,或者与知名域名过于相似时,它们会显示 xn-- 形式,而不是好看的版本。这是一道不错的防护,但有其局限:
- 在地址栏之外,这些规则并不总是适用:在邮件正文、短信、PDF 或即时通讯软件里,“伪装”的版本会原样显示;
- 这些规则因浏览器、版本和应用而各不相同;
- 在小屏幕上匆匆一瞥,根本分不清两个一模一样的字符。而且并不总需要 Unicode:
rn冒充m,1冒充l,正如指南网络钓鱼:诈骗者如何让邮件成功送达所解释的。
和任何陷阱域名一样,这个网站也可能有有效的 HTTPS 证书和漂亮的小锁:它们证明连接是加密的,而不是网站是诚实的。
如何真正核实一个域名
有疑问时,不要相信自己看到的,而要让真正的名字自己说话:
- 不要点击。复制链接(右键,“复制链接地址”)。
- 把它粘贴到 Punycode 转换器里(网上有很多免费的):如果一个本该很普通的名字出现了
xn--形式,那就是陷阱。 - 找出域名:紧挨着第一个“/”之前的那部分。指南二维码钓鱼:当网络钓鱼藏在二维码背后详细讲解了这种读法。
- 走安全的路:使用自己保存的书签或官方 App。密码管理器也有帮助:它不会被替身骗过,在假域名上什么也不会填。
Baitback 会自动完成部分工作:把邮件粘贴进去后,它会标出 Punycode(xn-- 形式)链接,以及它所知道的品牌的相似域名(包括同形字),还会检查跳转之后的最终目的地。
找出注册商和托管商
要让这个域名消失,就要找出是谁卖的、是谁托管的。在查询工具中,始终使用 xn-- 形式:那才是真正的名字,也是注册局认识的名字。
- 对域名进行 RDAP 或 WHOIS 查询,可以得到注册商、其举报地址(“abuse”)以及域名的创建日期。一个上周才注册的品牌替身域名,几乎不留疑问。
- 通过网站的 IP 地址可以找到它的托管商,或者挡在前面的 CDN,后者同样接受举报并会转交。
在这里,注册商是最有效的一方:用同形字冒充品牌的域名是非常明确的滥用案例,一旦暂停该域名,网站、邮件和所有相关页面都会同时失效。
举报这个域名
一份好的举报只需几行:域名的 Unicode 形式和 xn-- 形式、被冒充的品牌、页面的完整网址、一张截图、日期和时间。把它发给注册商以及托管商或 CDN,并通知被冒充的品牌。
如果这个域名是通过邮件来的,就先从 Baitback 开始:粘贴邮件的完整源代码,工具会找出发件服务器及其托管商,标出可疑链接,并准备好举报邮件。它还会提示各浏览器的平台(Google Safe Browsing、Microsoft、Netcraft……),它们能在几小时内向所有访问者显示红色警告。
- 肉眼看来一样的两个字母,对电脑来说可能是两个不同的字符:这就是同形字。
- Punycode 把 Unicode 名字翻译成以
xn--开头的 ASCII 形式。 xn--本身并不可疑,但出现在本该普通或冒充品牌的名字里就可疑了。- 核实域名要靠复制链接,而不是用眼睛看;访问时走书签或官方 App。
- 向注册商举报时写上名字的两种形式:一旦暂停,一切同时失效。