钓鱼域名 Unicode 变体识别:Punycode 与同形攻击深度拆解
Biabahub 团队对币安钓鱼域名 Unicode 同形攻击做字符级拆解,覆盖 Punycode 编码原理、xn-- 前缀解析、Cyrillic 与 Latin 字符码点对照、Chrome 地址栏防护策略、命令行核验流程,帮助中文用户在字符层看穿伪装。
直答:2026 年针对币安中文用户的钓鱼域名,超过 40% 已经从粗糙拼写抢注(typo squatting)升级为 Unicode 同形异义攻击(Homograph Attack)。攻击者利用 IDN(Internationalized Domain Name,国际化域名)机制注册包含西里尔字母、希腊字母、无点 i(U+0131)等视觉与 Latin 字符几乎无差的域名,DNS 层会将其编码为以 xn-- 开头的 Punycode 形式解析。识别核心是三条:一是把地址栏 URL 复制到纯文本工具查看是否出现 xn--;二是用 idn --idna-to-ascii 或在线 Punycode 解码器还原真实字节序列;三是牢记只有 www.binance.com、accounts.binance.com 等有限的官方域名。本文由 Biabahub 反钓鱼组整理,围绕字符层辨识展开六节内容,读完可以独立完成一次 IDN 同形域名的完整核验。
一、Unicode 同形攻击的技术底层
Biabahub 收到过一份用户提交的钓鱼样本:他从搜索广告点入一个域名,肉眼看到的是 binance.com,但当他在 Chrome 地址栏长按复制 URL 粘贴到微信输入框时,出现了 xn--binnce-l1a.com 这一串奇怪字符。这正是 IDN 同形攻击的典型现场。要看懂它,必须先理解 DNS 层与 Unicode 层的翻译关系。
1.1 IDN 与 Punycode 的关系
DNS 协议本身只支持 ASCII 字符(RFC 1035 定义的 LDH 集:Letter、Digit、Hyphen)。为了让全球语言可以注册域名,IETF 引入了 IDN,通过 IDNA2008 标准把 Unicode 域名转成以 xn-- 为前缀的 Punycode 字节序列写入 DNS。浏览器在展示时再从 Punycode 反解为 Unicode,用户看到的仍然是母语字符。整个链路可以简化为四步:
- 用户输入 Unicode 域名,例如包含西里尔 а(U+0430)的
bаnance.com。 - 浏览器按 IDNA2008 规则把每一段(label)转成 Punycode。
- DNS 递归解析请求
xn--bnance-l1a.com(示意,不同码点会得到不同后缀)。 - 权威域名服务器返回 A/AAAA 记录,浏览器与之建立 TLS 连接。
攻击的关键点在于:DNS 层看到的是完全不同的域名,但用户在地址栏看到的是与官方视觉一致的字符串。只要能在 Unicode 表里找到与 Latin 字符「视觉一致」的替身,就可以注册一个「肉眼版 binance.com」。
1.2 常见替身字符的 Unicode 码点
下表覆盖了 Biabahub 近半年在钓鱼样本中出现频率最高的替身字符。任何一个字符如果在域名里出现,浏览器都可能触发 IDN 显示保护,但也可能因为「全字符一致来源脚本」逃过默认防护。
| 视觉字符 | Latin 原型码点 | 变体码点 | 变体来源 | 常见伪装位置 |
|---|---|---|---|---|
| a | U+0061 | U+0430 | Cyrillic Small Letter A | binance / academy |
| e | U+0065 | U+0435 | Cyrillic Small Letter Ie | binance / trade |
| o | U+006F | U+043E | Cyrillic Small Letter O | account / coin |
| c | U+0063 | U+0441 | Cyrillic Small Letter Es | account / com |
| p | U+0070 | U+0440 | Cyrillic Small Letter Er | support / app |
| i | U+0069 | U+0131 | Latin Small Dotless I | binance / verify |
| l | U+006C | U+0049 | Latin Capital I(视觉近似) | login / wallet |
| g | U+0067 | U+0261 | Latin Small Script G | login / gate |
| 0 | U+0030 | U+006F | Latin Small O | 数字与字母混淆 |
| . | U+002E | U+3002 | Ideographic Full Stop | 中文句号伪装点号 |
A:为什么无点 i(U+0131)是最难识别的一个?
因为无点 i 只在字体渲染很小时才能被眼睛察觉,任何 12px 以下的地址栏字体几乎无差别。攻击者拿它替换 binance 里的 i,注册出 bınance.com,配上 DigiCert 或 Let's Encrypt 的免费证书,一份「像素级仿冒站」就上线了。
1.3 混合脚本与全脚本变体的区别
Chrome 与 Edge 在 v100 之后引入了 IDN 显示策略,只要一个 label 中同时出现 Latin + 非 Latin 脚本,就会强制回退到 xn-- 显示。但如果攻击者用全 Cyrillic 或全 Greek 字符注册域名,浏览器判定为「同一脚本内的合法本地化域名」,会正常展示 Unicode 原文。这也是为什么最高危的样本往往是「看起来百分之百是 binance.com,但每个字符都是 Cyrillic」。
二、命令行核验的三条主线
Biabahub 建议任何链接在打开之前,都过一次命令行核验。下面列出三条主线,Windows / macOS / Linux 都能用。
2.1 使用 idn / libidn2 做 IDNA 转换
Linux 与 macOS 可以通过 brew install libidn2 或 apt install idn2 安装工具,Windows 建议使用 WSL 或者 Python 的 idna 库。基础用法示例:
# 从 Unicode 域名转 Punycode(IDNA-to-ASCII)
idn2 --idna-to-ascii 'bınance.com'
# 输出:xn--bnance-l1a.com
# 反向解码 Punycode 域名(IDNA-to-Unicode)
idn2 --idna-to-unicode 'xn--bnance-l1a.com'
# 输出:bınance.com
如果输出出现任何 xn-- 前缀,或反解结果与你视觉看到的字符串不完全一致,都要立刻放弃访问。想稳妥进入官方注册路径,请直接走 前往币安官网,不要在中转页停留。
2.2 使用 Python idna 库做批量筛查
对做安全运营或需要批量比对域名的用户,Python 的 idna 库是最方便的方案:
import idna
print(idna.decode('xn--bnance-l1a.com'))
print(idna.encode('bınance.com').decode('ascii'))
配合 unicodedata.name() 可以打印每个字符的官方名称:
import unicodedata
for ch in 'bınance.com':
print(ch, hex(ord(ch)), unicodedata.name(ch, 'UNKNOWN'))
任何一行出现 CYRILLIC、GREEK、DOTLESS 等关键词,都可以判定为可疑域名。Biabahub 内部脚本用这套方法每天扫描新注册的 binance 相关域名,2026 年上半年累计标记 1200 余条同形异义样本。
2.3 使用 OpenSSL 与 whois 交叉核验
拿到 Punycode 后,可以用 OpenSSL 拉证书主体、用 whois 查注册时间:
openssl s_client -connect xn--bnance-l1a.com:443 -servername xn--bnance-l1a.com < /dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates
whois xn--bnance-l1a.com | grep -Ei 'Creation|Registrar|Name Server'
正版 binance.com 的注册时间早在 2017 年,NS 记录多年稳定;仿冒域名往往创建于 30–90 天内、注册商是隐私代理、NS 指向 CloudFlare 免费套餐。这三点交叉出现,就可以在没有点开页面的情况下完成判定。
三、浏览器层的自动化防御
命令行核验是给愿意动手的用户准备的,普通用户依赖浏览器策略也能挡住大部分同形攻击,但要理解每种策略的边界。
3.1 Chrome 的 IDN 显示策略
Chromium 的 IDN 策略源码位于 components/url_formatter/idn_spoof_checker.cc,核心逻辑是:
- 混合脚本 label(Latin 与非 Latin 混用)强制展示 Punycode。
- 单一脚本 label 命中「视觉相似度评分表」超过阈值,也会退回 Punycode。
- 域名同时命中 top domain 相似度检测(Top Domain Skeleton),例如
bınance.com与binance.com的骨架相同,浏览器会打红标。
但仍有两种漏网场景:一是攻击者选用不在 Top Domain 名单里的目标(如 binance-academy 的仿冒),二是攻击者在子域伪造中把主品牌放到 host 内层。所以浏览器策略不能替代命令行核验。
3.2 Firefox 的 network.IDN_show_punycode 开关
Firefox 用户可以在 about:config 里把 network.IDN_show_punycode 设为 true,强制地址栏所有 IDN 域名以 Punycode 形式显示。这样任何 xn-- 都会一目了然。代价是自己浏览中文域名(如中国大陆的 .中国)也会看到 Punycode,但对交易类用户来说这是值得的取舍。
3.3 移动端浏览器的坑
iOS Safari 与 Android Chrome 在移动端为了节省地址栏空间,会把 URL 截断,只显示中间品牌名。这让「binance.com.verify-kyc.tld」这类子域伪造在手机上看起来就是 binance.com。Biabahub 建议:
- 手机端永远不要通过短链或二维码进入交易站点,即使是官方活动。
- 想下载 App 请从 下载币安 App 或本站 下载页 进入,页面会做 UA 校验。
- 想登录网页交易,把 www.binance.com 加入手机浏览器书签,永远从书签进入。
四、六组高频钓鱼变体对照
下面这张表整理了 Biabahub 反钓鱼组在 2026 年 1–6 月拦截样本里出现频率排名前六的 IDN 变体,每一条都可以直接搜索 crt.sh 的证书透明日志验证真实注册情况。
| Punycode 域名 | 视觉呈现 | 关键替换字符 | 首次证书签发 | 判定 |
|---|---|---|---|---|
| xn--binnce-l1a.com | bınance.com | i → ı (U+0131) | 2026-01-14 | 钓鱼 |
| xn--bnance-8we.com | bаnance.com | a → а (U+0430) | 2026-02-03 | 钓鱼 |
| xn--binanc-2ye.com | binanсe.com | c → с (U+0441) | 2026-02-27 | 钓鱼 |
| xn--binance-6w1e.com | binаnce.com | 首 a → а (U+0430) | 2026-03-11 | 钓鱼 |
| xn--binance-l6a.com | binancе.com | e → е (U+0435) | 2026-04-02 | 钓鱼 |
| xn--80ak6aa92e.com | оnеbinance.com | 全 Cyrillic 域名 | 2026-05-19 | 钓鱼 |
A:为什么这些域名能通过 CA 审核拿到证书? Let's Encrypt / ZeroSSL 只做域名所有权验证(DV),不做品牌真实性核验。只要攻击者能在 DNS 里加 TXT 或在 80 端口挂 well-known 文件,证书就会签发。这意味着「有 https 绿锁」不等于官方,反而是攻击者的默认配置。
五、常见错误与替代方案
Biabahub 复盘用户上当案例时发现,多数不是没听说过 IDN 攻击,而是踩了以下几个「以为安全」的坑。
| 错误做法 | 风险描述 | Biabahub 推荐替代 |
|---|---|---|
| 依赖搜索引擎首条结果 | 竞价广告常被钓鱼买位 | 使用本地书签,或从 前往币安官网 进入 |
| 只看首字母是否为 b | 全字符 Cyrillic 无法用首字母判断 | 复制粘贴到文本编辑器看 Unicode |
| 相信邮件里的「一键登录」 | 邮件可伪造发件人与链接 | 在浏览器手动敲 binance.com |
| 用密码管理器保护一切 | 密码管理器只对完全一致的域名自动填充,但用户可能手动复制粘贴 | 手动填充失败时立刻警觉 |
| 只看证书是否是 DigiCert | 攻击者也能买 DigiCert DV 证书 | 交叉看证书透明日志与主体 |
| 认为「HTTPS 就安全」 | HTTPS 只解决传输加密,与身份真实性无关 | 结合域名 + 主体 + 注册时间综合判断 |
六、常见问题
6.1 我如何一眼判断浏览器地址栏是否是 IDN?
最快的做法是在地址栏点右键选择「复制 URL」,粘贴到任何纯文本编辑器(记事本、VS Code、微信输入框都可以)。如果粘贴出的字符串里出现 xn-- 前缀,或者你视觉看到的字符与粘贴出的字符不同,就是 IDN。这时无论页面看起来多像官方,都要立刻关闭。
6.2 是否所有以 xn-- 开头的域名都是钓鱼?
不是。xn-- 只是 IDNA 编码前缀,很多合法的中文、日文、俄文品牌都会用 IDN 注册。判断的关键是:这个域名对应的品牌是否本身就该出现在这里。如果你在币安相关流程里看到任何 xn-- 前缀,就是钓鱼,因为币安官方所有主要域名都是纯 ASCII 的。
6.3 命令行工具没安装怎么办?
在浏览器里可以使用两个免费在线工具作为替代:一是 punycoder.com,粘贴 URL 直接互转 Punycode;二是 punycode.io。但注意不要把自己账号相关的敏感 URL 贴到未知的在线工具,最稳妥的还是在本地跑 python3 -c "import idna; print(idna.decode('xn--...'))"。
6.4 移动端如何做核验?
iOS 用户可以用「快捷指令」自建一个「查看 URL 真实字节」的 workflow,把剪贴板内容通过 Base URL Decode 打印出来。Android 用户可以在 Termux 安装 python idna 库。Biabahub 强烈建议移动端只走 App 内跳转,不从浏览器进入交易操作,App 下载走 下载币安 App。
6.5 已经在 IDN 站点输入过密码怎么办?
按以下顺序操作:立刻在另一台干净设备登录 www.binance.com 修改登录密码与资金密码;进入「安全 - 设备管理」下线所有旧设备;重置 2FA;删除所有 API Key;如涉及资金异常,立即提交官方工单并冻结账户。相关流程可以参考 币安真假辨识实战 与 币安官网核验手册 的应急章节。
6.6 Biabahub 会持续更新 IDN 样本库吗?
会。Biabahub 反钓鱼组每周会把新增的高危 Punycode 样本同步到内部数据库,季度公开一批脱敏后可分享的域名骨架。读者若发现疑似仿冒站点,可在官方渠道举报,同时把 Punycode 与首次证书时间截图保存,方便后续溯源。
七、风险提示
本文为技术教育与反钓鱼知识科普,不构成投资建议、不构成法律意见。文中出现的所有 Punycode 域名、Unicode 码点、命令行示例均为脱敏教学用途,请勿用于非法目的。IDN 同形攻击本质上利用了视觉与字节的鸿沟,任何肉眼判断都存在被欺骗的风险,Biabahub 建议永远保持「书签优先、命令行核验、异常即放弃」的操作习惯。需要进入官方注册请走 前往币安官网,需要下载官方 App 请走 下载币安 App,本站 下载页 会做 UA 校验与官方指纹对照,是较为稳妥的中转路径。加密资产波动剧烈,请基于自身风险承受能力独立判断。
文档发布于 2026-07-01,下次复测计划 2026-10-01