01 · 字符级相似度度量
1.1 Levenshtein编辑距离与Damerau变体
Levenshtein距离(V. Levenshtein, 1965)定义两个字符串之间的最小编辑次数(插入、删除、替换),是域名相似度计算的基线度量。设品牌域名为 s、候选域名为 t,归一化相似度可表示为 sim = 1 − ED(s,t) / max(|s|,|t|)。Damerau-Levenshtein距离(Damerau, 1964)额外允许"相邻字符交换"这一编辑操作,对键盘误触型变体(如"googel")更敏感,是域名场景中的首选变体。
工程要点:①长度归一——原始ED值受域名长度影响,必须归一化后才能跨品牌比较;②前缀加权——域名首段(Second-Level Domain)的品牌核心位置权重高于后缀,可对前2-4字符设置更高替换代价;③TLD剥离——比较前必须剥离顶级域(.com/.cn等),否则"brand.com vs brand.xyz"会产生系统性高分。
1.2 Jaro-Winkler:面向短字符串的改进
Jaro相似度(Jaro, 1989;Winkler, 1990改进)衡量两个字符串的字符匹配度与换位情况,对短字符串(域名典型长度6-15字符)表现优于编辑距离,且对前缀一致的字符串给予加成——恰好契合仿冒域名"保留品牌前缀、改动尾部"的常见模式。Winkler加成系数通常取0.1,前缀匹配窗口4字符。经验上,Jaro-Winkler ≥ 0.85 可作为高相似候选的初筛阈值(经验值,需按品牌长度分布校准)。
1.3 键盘邻接加权距离
用户拼写错误高度集中于键盘物理相邻键(QWERTY布局):n↔m↔b、c↔v、g↔h、.↔/等。将"相邻键替换"的编辑代价设为低于"任意替换"(如0.5 vs 1.0),可显著区分"手滑打错"与"随机字符"两类变体——前者是typosquatting的主要模拟对象。dnstwist等工具内置键盘邻接矩阵;多语言环境下应扩展考虑九宫格输入法与拼音输入法的错误模式。
| 算法 | 时间复杂度 | 优势 | 局限 |
|---|---|---|---|
| Levenshtein | O(m·n) | 语义直观、实现成熟、被广泛引用 | 不区分错误类型;对短串区分度一般 |
| Damerau-Levenshtein | O(m·n) | 覆盖转置错误(手滑高频) | 代价矩阵需按场景调权 |
| Jaro-Winkler | O(m·n) 实际更快 | 短字符串表现好;前缀加成契合仿冒模式 | 对字符位置敏感,尾部插入收益递减 |
| 键盘加权距离 | 取决于基线算法 | 贴合真实输入错误分布 | 依赖布局假设(QWERTY),需本地化扩展 |
1.4 工程实现要点
算法落地时的四个工程要点:①空间优化——Levenshtein/Damerau的动态规划实现可将完整矩阵压缩为两行(O(min(m,n))空间),域名典型长度下毫秒级完成单次比较;②短串查表——长度≤5的品牌核心词候选空间小,可预生成全量变体字典做O(1)哈希查表,避免重复计算;③分桶阈值——阈值须按品牌长度分桶校准(短品牌收紧、长品牌放宽),并定期用新标注样本回归复核(见第5页校准方法);④算法库选型——成熟字符串相似度库(如Python的python-Levenshtein、jellyfish,Java的commons-text)均内置上述算法并通过长期社区验证,生产环境优先使用成熟实现而非自研,将研发资源留给领域特征(视觉归一化、键盘加权)层。
02 · 发音级相似度:Sound-Squatting
攻击者不仅利用"看错",还利用"听错":电话客服、语音助手、口头传播场景下,发音相似的域名可截获流量(学术社区称之为sound-squatting)。经典发音编码算法包括:Soundex(美国人口普查局,1918/1922年)保留首字母并按发音规则映射辅音;Metaphone(Philips, 1990)与Double Metaphone改进多语言发音覆盖,可处理英文中不规则发音。
中文场景的发音相似更为关键:拼音全拼/简拼(zhongguo→zg、zhg)、声调丢失(gongsi≠gōngsī)、儿化与方言变体都应纳入变体生成器。例如品牌"招商"的拼音zhāoshāng,其简拼zssh、全拼变体zhaoshang1、zhaoshang88等均属发音维度的常见仿冒扩展。
注意:发音算法在域名场景属补充度量而非主度量——Soundex类算法为英文设计,直接用于拼音效果有限。建议将拼音相似度作为排序特征之一(权重通常低于字符距离,经验值0.1-0.2),而非硬性过滤条件。
03 · 视觉级相似度:混淆字符
3.1 ASCII内的视觉混淆
纯ASCII范围内存在大量视觉等价/近似的字符组合,攻击者利用人眼的分辨极限实施欺骗:
| 混淆类型 | 典型字符对 | 机理说明 |
|---|---|---|
| 数字-字母 | 0↔O、1↔l↔I、5↔S、8↔B、6↔G/b | 字形轮廓高度相似,低分辨率下不可区分 |
| 多字符-单字符 | rn↔m、cl↔d、vv↔w、ij | 字符序列的视觉融合 |
| 相邻键形近 | c↔e、g↔q、n↔h | 书写体/印刷体中的字形收敛 |
| 大小写与分隔符 | paypaL、paypal-secure、paypal_secure | 利用大小写视觉弱化与合法分隔符习惯 |
检测方法:构建混淆字符映射表(confusable map),对候选域名做"视觉归一化"(canonicalization)——将所有视觉等价字符归并到同一表示后再计算编辑距离。例如将 rn→m、0→o 后再比对,可捕获"microsoft"→"rnicrosoft"这类纯编辑距离难以暴露的变体。
3.2 Unicode混淆字符集(UTS #39)
Unicode联盟发布的UTS #39《Unicode Security Mechanisms》维护官方混淆字符数据(confusables.txt),覆盖跨书写系统的等价字形:西里尔小写а(U+0430)与拉丁a(U+0061)、希腊ο(U+03BF)与拉丁o(U+006F)、全角a(U+FF41)与半角a等。检测时应将域名逐字符查表归一,再比对标准品牌名。
3.3 IDN与Punycode:国际化域名的攻防
国际化域名(IDN)通过Punycode编码(RFC 3492)以xn--前缀表示非ASCII域名。2002年Gabrilovich与Gontmakher发表的同形字符攻击(Homograph Attack)论文揭示了其风险:将拉丁"apple.com"中的字母替换为西里尔等价字符后,浏览器地址栏显示几乎无法区分。2017年安全研究者Xudong Zheng公开的演示(将"apple.com"的西里尔变体注册并展示证书有效性)推动主流浏览器改进策略:当域名中同时混合多个书写系统的字符时,地址栏强制显示Punycode形式(如xn--pple-43d.com)。
检测规则建议:对任何含xn--前缀的域名,①解码为Unicode后检查是否存在跨书写系统字符混合(mixed-script);②对照UTS #39混淆表做视觉归一;③比对品牌库。三条任一命中即进入候选队列。同时,中文品牌须额外关注".中国"等IDN后缀及中文域名的形近字问题(如"工商"vs"工啇")。
边界说明:浏览器对同形字符域名的缓解策略(强制显示Punycode)并不完备——仅对"混合书写系统"生效,纯西里尔仿冒(面向俄语用户)或利用允许同文种内混淆的场景(UTS #39定义的single-script confusable)仍可显示为欺骗性外观。因此服务端/企业侧检测不可依赖浏览器自保护。
04 · 变体生成工程化
4.1 生成手法清单
以开源工具dnstwist(elceef/dnstwist)为代表,社区已沉淀出成熟的变体生成手法清单。本课题在其基础上按手法谱系扩展:
| 生成器 | 原理 | 示例(示意) |
|---|---|---|
| bitsquat | 逐字符做单比特翻转 | example→exampld(比特翻转) |
| homoglyph | 按混淆字符表替换视觉等价字符 | 0→o、rn→m |
| hyphenation | 插入连字符(词边界切分) | example→ex-ample |
| insertion / omission | 插入/删除单字符 | example→exxample / exaple |
| repetition | 重复相邻字符 | example→exxample |
| replacement | 替换单字符(含键盘邻接加权) | example→exanple |
| transposition | 交换相邻字符 | example→exapmle |
| vowel-swap | 元音互换(读音近似) | example→axample |
| addition / dictionary | 拼接高频词/品牌功能词 | example→example-login |
| subdomain / TLD-swap | 品牌入子域、更换TLD | example.com.cn→example-login.net |
4.2 变体空间爆炸与剪枝策略
全手法展开下,单个品牌的候选变体可达数十万至百万级。工程上必须剪枝:①注册活跃度过滤——仅保留历史上真实注册过或当前可注册的变体(与注册局/数据商接口比对);②长度约束——域名长度越界(<3或>63字符)直接裁剪;③手法优先级——按各手法的历史命中率分配生成配额,高频手法(replacement、addition)展开深度大,低频手法(bitsquat)全量展开;④品牌分级——核心品牌全手法展开,长尾品牌仅高召回手法。
# 生成某品牌域名的常见变体并探测可注册/已注册状态(仅示例命令) $ dnstwist --registered example.com # 输出字段通常包括:变体域名、解析IP、MX记录、WHOIS创建时间等 # 注意:探测行为应遵守目标注册商与网络的可接受使用策略
05 · 融合排序与阈值校准
5.1 特征体系
单一度量均有盲区,工程实践采用多特征融合排序。推荐特征集合:
| 特征 | 取值说明 | 建议权重(经验) |
|---|---|---|
| 归一化编辑距离 | 1 − ED/max(len) | 0.25 |
| Jaro-Winkler | 0-1连续值 | 0.20 |
| 视觉归一后距离 | 混淆字符表归一化后再计算 | 0.20 |
| 键盘加权距离 | 邻接替换低代价版本 | 0.10 |
| 发音相似度 | 拼音/Metaphone编码一致度 | 0.10 |
| 手法先验分 | 按手法历史命中率赋分 | 0.15 |
注:权重为经验起点值,须以自有标注集训练/校准后替换(见§5.3)。
5.2 排序模型演进路径
- 阶段一(规则加权):线性加权打分,可解释性强,适合冷启动;
- 阶段二(学习排序):以人工标注的"仿冒/合法"样本训练GBDT/LambdaMART类排序模型,输出候选的相对恶意度排序;
- 阶段三(语义扩展):引入词向量/字符级神经编码(如基于CNN的域名嵌入),捕获训练集外的变体模式。
5.3 指标与校准
采用Precision/Recall/F1与PR曲线评估(类别极不平衡下PR曲线比ROC更有区分度);人工复核资源决定工作点选择——经验上应先保证召回≥95%(高召回切入),再通过判定层(第5页)压制误报。阈值按品牌长度分桶校准:短品牌(<6字符)编辑距离阈值应收紧(≤1),长品牌(>10字符)可放宽(≤2)。
CONFUSABLE = {'0':'o','1':'l','rn':'m','cl':'d'} # 混淆字符表(生产环境用UTS#39全表)
def visual_canon(name: str) -> str:
for k in sorted(CONFUSABLE, key=len, reverse=True):
name = name.replace(k, CONFUSABLE[k])
return name
def sim_score(brand: str, cand: str) -> float:
b, c = brand.lower(), cand.lower()
f1 = 1 - damerau_levenshtein(b, c) / max(len(b), len(c))
f2 = jaro_winkler(b, c)
f3 = 1 - damerau_levenshtein(visual_canon(b), visual_canon(c)) / max(len(b), len(c))
return 0.25*f1 + 0.20*f2 + 0.20*f3 + keyboard_weighted(b, c) + phonetic(b, c)06 · 算法局限与对策
| 局限 | 说明 | 对策 |
|---|---|---|
| 语义仿冒不可见 | "brand-login-verify"类组合与品牌字面距离远,但语义高度仿冒 | 功能词词典扩展生成器(第4页视觉层兜底) |
| 混淆表不完备 | 新注册字体/Emoji/罕见Unicode块未覆盖 | 跟踪UTS #39更新;引入字形渲染比对(截图级) |
| 中文拼音歧义 | 多音字、简拼碰撞率高 | 拼音特征降权;结合商标词库人工维护 |
| 对抗性生成器升级 | 攻击者借鉴公开工具手法进行规避(如随机插入无关字符) | 持续运营:手法库版本化、红蓝对抗演练 |
本节参考来源(第2页)
V. Levenshtein, "Binary Codes Capable of Correcting Deletions, Insertions and Reversals"(1965,编辑距离出处):苏联物理学报
F. J. Damerau, "A Technique for Computer Detection and Correction of Spelling Errors"(1964):Communications of the ACM
W. Winkler, "String Comparator Metrics and Enhanced Decision Rules in the Fellegi-Sunter Model of Record Linkage"(1990):Proceedings of the Section on Survey Research Methods
Unicode Technical Standard #39 及 confusables 数据:unicode.org/reports/tr39
RFC 3492 "Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)"(2003)
RFC 5890-5894 "Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework" 等(IDNA 2008)
Xudong Zheng, "Phishing with Unicode Domains"(2017,同形字符PoC演示):公开安全博客
elceef/dnstwist 项目文档(生成器手法清单):github.com/elceef/dnstwist
L. Philips, "Hanging on the Metaphone"(1990, Computer Language杂志):Metaphone发音算法出处
Kintis et al., CCS 2017(combosquatting纵向研究):ACM CCS