钓鱼域名 Unicode 变体识别:Punycode 与同形攻击深度拆解

Biabahub 团队对币安钓鱼域名 Unicode 同形攻击做字符级拆解,覆盖 Punycode 编码原理、xn-- 前缀解析、Cyrillic 与 Latin 字符码点对照、Chrome 地址栏防护策略、命令行核验流程,帮助中文用户在字符层看穿伪装。

发布于 2026-07-10 · 约 16 分钟 · 真伪辨识

直答: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,用户看到的仍然是母语字符。整个链路可以简化为四步:

  1. 用户输入 Unicode 域名,例如包含西里尔 а(U+0430)的 bаnance.com
  2. 浏览器按 IDNA2008 规则把每一段(label)转成 Punycode。
  3. DNS 递归解析请求 xn--bnance-l1a.com(示意,不同码点会得到不同后缀)。
  4. 权威域名服务器返回 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 libidn2apt 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'))

任何一行出现 CYRILLICGREEKDOTLESS 等关键词,都可以判定为可疑域名。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.combinance.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