课题研究 域名滥用治理 子课题02 · 第2页 / 共8页
02域名滥用治理 · 子课题深度研究

域名抢注与拼写错误检测

变体生成引擎是本课题的算法基础:围绕目标域名系统化枚举"用户可能敲错"的全部候选形式,并以相似度算法排序优先级。本页从生成问题的形式化建模出发,逐一剖析编辑距离族算法、键盘邻接加权、发音相似算法、视觉混淆字符表(含 IDN/Punycode)的工程实现,给出各类生成策略的候选空间量级估算,并对照开源工具 dnstwist / URLCrazy 的实现差异,最后讨论生成引擎的完备性评估方法。

Typosquatting变体生成相似度算法批量注册识别预警机制UDRP/CNDRP研究状态:研究中
当前章节变体生成引擎与相似度算法
目标受众安全运营人员、品牌保护团队、威胁分析师、域名管理人员
全文结构8页:总览 → 变体算法 → 数据源 → 判定模型 → 工程实现 → 案例实证 → 对抗规避 → 处置合规

01 · 生成问题的形式化建模

设目标域名为字符串 s(如 example,不含 TLD),字符集 Σ(常见配置为 a–z 与 0–9,36 字符)。变体生成的本质是:在 s 的邻域(neighborhood)内按编辑操作搜索候选集合 G(s)。形式化定义如下:

  • 单编辑邻域(Order-1):对 s 施加一次删除、插入、替换或相邻转置操作所得全部字符串的集合,即 Damerau-Levenshtein 距离 ≤1 的字符串集合。其规模上界约为:删除 n 个 + 重复(视为特殊插入)n 个 + 转置 (n−1) 个 + 插入 36n 个 + 替换 35n 个(n 为字符串长度,36 字符集下替换有 35 种选择)。
  • Order-2 邻域:两次编辑操作的复合空间。规模近似为 Order-1 的平方量级,仅在品牌保护的高价值场景中局部启用(如针对支付类品牌的双字符错误)。
  • 结构化邻域:不属于编辑距离框架的操作——子域化、连字符插入、前后缀词缀组合(combosquatting)、TLD 替换与同形字符替换。这些操作由独立生成器(generator)实现,与编辑类生成器输出做并集去重。

量级直觉(以 7 字符域名、36 字符集为例,可复算):删除约 7 个、重复约 7 个、转置约 6 个、元音替换(5 元音互换上界)约 21 个、单字符插入约 252 个、单字符替换约 245 个、键盘相邻替换(平均每字符约 4 个相邻键)约 28 个、子域化(n−1 个切分点)约 6 个、TLD 替换按常用后缀 10 种计约 10 个。合计约 580 个 Order-1 候选;加入 1,000 词前后缀词典的 combosquatting 后,单域名候选空间在数千量级——这决定了工程上必须做优先级排序与分批解析(第5页)。

1.1 候选质量控制原则

  • 不可读性过滤:连续元音超过 3 个、键盘两侧远距离字符组合(如 qza)等低概率候选直接丢弃。
  • 可发音性先验:发音算法(见 §04)得分过低且无关键词语义的候选降权。
  • 去重与规范化:所有候选先经 IDNA 2008 规范化(RFC 5890-5894 的 NFC/NFKC 与 STD3 规则)后比较,避免 Punycode 形态差异造成重复解析。

02 · 编辑距离族算法

2.1 Levenshtein 距离与 Damerau-Levenshtein 距离

工程实现可复用成熟库:Python 生态的 python-Levenshtein(C 实现)或 rapidfuzz(向量化、支持多进程),短字符串距离计算可达每秒百万级,千级品牌×数千候选的相似度排序不构成性能瓶颈。

Levenshtein 距离定义两字符串间最少的单字符编辑(插入、删除、替换)次数,是变体相似度度量的基线。Damerau-Levenshtein 距离额外计入相邻转置操作,与人类"敲反两个字母"的错误模式直接对应——因此变体生成应以 Damerau 变体为基准:它恰好覆盖"删除/插入/替换/转置"四类自然拼写错误。

function damerau_levenshtein(a, b):
    # 经典动态规划实现,O(|a|×|b|) 时间/空间
    # d[i][j] = a[0:i] 与 b[0:j] 的 Damerau-Levenshtein 距离
    # 递推含四种操作代价 + 相邻转置的特判(i,j>1 且 a[i]==b[j-1] 且 a[i-1]==b[j])

2.2 归一化与阈值设定

原始编辑距离随域名长度增长而放大,工程上采用归一化形式:

similarity(s, g) = 1 − dist(s, g) / max(|s|, |g|)
# 经验阈值:归一化相似度 ≥ 0.80 视为高置信变体;
# 0.65–0.80 进入人工复核队列;< 0.65 通常为用户创造力范畴,仅保留结构化生成器(combosquatting 等)输出

阈值基线来源于学术研究的测量结论:真实人类拼写错误中,绝大多数为单字符错误(Damerau 1964 年对打字错误的经典统计——约 80% 以上为单错误类型),这正是 Order-1 邻域覆盖率极高的原因;双错误候选数量指数增长但命中率递减,故作为低优先级层。

2.3 与其他字符串度量的分工

度量特点在本课题中的用途
Jaro-Winkler对前缀匹配加权,适合短字符串、人名类匹配combosquatting 域名中关键词与品牌词的位置匹配打分
Jaccard 相似度基于字符 n-gram 集合重合度变体候选与品牌名的形态重合粗筛,抵抗字符重排
最长公共子序列(LCS)不连续子序列匹配辅助特征,用于判定模型(第4页)特征工程
前缀/后缀匹配率品牌词在候选中的位置保持度区分"真变体"与"仅含品牌词的无关组合域名"

03 · 键盘邻接加权

替换类错误中,"敲到隔壁键"占人类输入错误的最大比例。键盘距离模型将 QWERTY 布局编码为坐标网格,为每对字符赋予物理距离 dk(c₁, c₂),替换代价按距离衰减函数取值:

# 代价函数示例(工程可调)
cost_replace(c1, c2) = 1.0                    # 随机替换
cost_replace(c1, c2) = 0.3  if 相邻键(d_k ≤ 1)
cost_replace(c1, c2) = 0.6  if 同一手同排(d_k ≤ 2)
# 效果:邻居键替换(如 x→z、n→b)保留更多候选进入高优先级队列
  • 同指法邻近键全集:除水平相邻外,同列上下键(如 e→d→c 斜向)也属于高频误敲区,建表时以每键 6–8 个邻近键为宜。
  • 数字行与符号:1/l/i、0/o、5/s 等跨行混淆需显式加入混淆对表(见 §05)。
  • 移动端扩展:触屏输入的误触模式与物理键盘不同(邻近热区更大、自动纠错介入),键盘距离表应提供移动端权重变体——这也是本课题区分"桌面变体"与"移动变体"两条生成管线的原因。

实证支撑(fat-finger distance):Moore 与 Edelman(FC 2010)将上述思想形式化为"胖手指距离"(fat-finger distance)——仅允许使用 QWERTY 键盘相邻字符完成插入/删除/替换/转置的最少操作次数。其抽样人工核验表明:编辑距离 1 的候选几乎全部被确认为拼写错误域名;距离 2 时"纯编辑距离"候选误报明显增多,而 fat-finger 距离 2 的候选仍大概率是真变体。该结论直接支持本课题把"键盘加权距离 ≤1"设为高优先级扫描层、距离 2 仅对高价值品牌局部启用。

04 · 发音相似算法

部分拼写错误源于"按发音记错"(如 exampel)。Soundex(1918 年起用于美国人口普查)与 Metaphone / Double Metaphone(Philips, 1990/2000)将字符串编码为发音指纹,指纹相同即视为同音候选。工程用法:

  • 对目标域名计算发音指纹,再枚举"指纹相同或相近"的拼写形式(可结合常见拼读错误规则表,如 -le 结尾误作 -el)。
  • 发音生成器输出量小(每域名通常 <20 个候选)但命中率不可忽视,Moore & Edelman 2010 的测量即包含此类错误模式。
  • 中文场景边界:拼音域名的混淆模式(如 zhifubao vs zfb 缩写、前后鼻音 ang/an、平翘舌 z/zh)无现成发音算法可用,本课题采用规则表+拼音音节库方式处理(见第4页 §07)。

05 · 视觉混淆字符表(Homoglyph / IDN)

同形字符攻击用视觉上不可区分的外文字符替换域名中的 ASCII 字符,经 Punycode(RFC 3492)编码注册。典型混淆对:

原字符常见混淆字符(Unicode 名称节选)说明
aа(西里尔 U+0430)、ɑ(U+0251)、α(希腊 U+03B1)西里尔小写 а 与 ASCII a 字形完全相同
eе(西里尔 U+0435)、ė、ê西里尔 е 常用于拼接高仿品牌域名
oо(西里尔 U+043E)、ο(希腊 U+03BF)、0(数字)о/ο/0 三者肉眼难辨
l / i1(数字)、І(西里尔 U+0406)、і(U+0456)、|(竖线)1/l/I/| 四元混淆是钓鱼经典手法
rn / mm 拆作 rn(如 corn→corn 的视觉等价 corm 反例)字形拼接混淆,如 paypal→paypa1、airbnb 类 rn/m
w / vvw 拆作 vv同上,双字符等价混淆
–‐ (U+2010)、‑ (U+2011)、− (U+2212) 等连字符变体不同连字符在部分字体下不可区分

5.1 检测方法

  • Unicode 规范化比对:候选域名经 NFKC 规范化后与品牌名比对,规范化后相等即命中同形攻击(Unicode UTS #39 定义了"混淆检测"的完整机制,包括 Skeleton 算法)。
  • 全量混淆对枚举:对品牌名每个字符,从混淆对表中替换生成候选(k 个混淆位 × 每位置 2–4 个混淆字符)。
  • 浏览器呈现层差异:浏览器对 Punycode 域名的显示策略不同(如 Firefox 地址栏默认对非当前语言字符的 Punycode 域名显示 xn-- 原形,而部分浏览器/历史版本曾直接显示 Unicode 形态),2017 年 Xudong Zheng 构造的 apple.com 西里尔同形域名 PoC 即利用了这一差异——检测系统应以"跨浏览器一致呈现为 Unicode"作为高危判据之一。

严谨性说明:并非所有 IDN 变体都是恶意的——大量 IDN 注册是正当的本地化业务(如西里尔语区企业的西里尔域名)。同形检测输出必须经"品牌相关性"复核,防止对正常 IDN 注册的误伤;同时合规采集 Punycode 注册数据需遵循各注册局政策(第3页)。

06 · 生成策略工程实现与候选空间估算

综合主流开源工具的工程实践,本课题的生成引擎按以下生成器组合实现(与 dnstwist 的策略集对应):

生成器策略单域名候选量级(7字符基准,理论值)
Omission逐字符删除≈ n(7)
Repetition逐字符重复≈ n(7)
Transposition相邻转置≈ n−1(6)
VowelSwap元音互换≤ 4×元音数(上界 ~21)
Insertion逐位插入全字符≈ 36n(252)
Replacement逐位替换全字符≈ 35n(245)
KeyboardReplacement仅替换邻近键≈ 4n(28)
BitsquatASCII 单位翻转≤ 8×n×单字节平均翻转数(≈ 数百,按实现裁剪)
Homoglyph(Cyrillic 等)混淆对替换组合爆炸,限制 1–2 个混淆位
Hyphentation / Addition连字符/词根插入依赖词典(百级)
Combosquatting前后缀关键词组合依赖词典(千级,需强过滤)
Subdomain品牌降子域≈ n−1(6)× TLD 集合

注:上表量级为算法决定的可复算理论值(随字符集、词典规模、裁剪策略变化),非实测统计,供容量规划参考。

各类生成策略候选量对比(7 字符域名基准,理论估算)
编辑类生成器中,插入/替换主导候选空间;结构化生成器由词典规模决定
说明:理论估算值(36 字符集、1,000 词组合词典、Bitsquat 按 ASCII 可见字符翻转裁剪),非实测统计。生成引擎需按此分布配置解析预算。

6.1 工具实现对照

工具类型生成策略特点
dnstwist开源(Python)内置 10+ 种生成器(bitsquatting、homoglyph、hyphentation、insertion、omission、repetition、replacement、subdomain、transposition、vowel-swap、addition 等),支持字典模式、GeoIP 定位解析结果、导出 fuzzy hash——本课题以其为基座。
URLCrazy开源(Ruby)较早的变体生成工具(Andrew Horton 维护),生成策略含多种拼写错误类型与 popularity 排序参考。
DomainTyper 等在线工具Web 服务适合单次人工查询,不支持批量与管道集成。
自研引擎(本课题)—在 dnstwist 基础上补充中文拼音混淆规则表、移动端键盘权重、品牌词优先级打分与批量调度(第5页)。

注:dnstwist 仓库地址 github.com/elceef/dnstwist;URLCrazy 仓库地址 github.com/urbanadventurer/urlcrazy,具体策略以各仓库文档为准。

07 · 生成引擎的完备性评估

生成引擎是否"够全",须以真实错误分布为标尺。评估方法:

  • 错误语料回放:收集真实误输入样本(公开的拼写错误语料、企业 DNS 日志中的 NXDOMAIN 聚合、输入法纠错数据),计算回放命中率:真实错误落在生成候选集合中的比例。目标:Order-1 覆盖 ≥95%(依据:单字符错误占人类拼写错误绝对多数)。
  • 反向校验(负召回):抽样生成候选做人工标注,估计"生成但未注册"候选中将来被注册的比例,用于校准优先级排序的有效性。
  • 版本化基线:生成策略集、字符集、词典全部版本化管理;每次变更以固定品牌集回放对比,保证引擎演进可回溯。

与第3—5页的衔接:生成引擎输出候选清单后,需经数据源比对确认"哪些已注册"(第3页),解析与富化(第5页),最后进入判定模型分级(第4页)。生成质量直接决定整条管道的上限——生成遗漏的变体,后续环节再精确也无法召回。

本节参考来源(第2页)

[1]

Fred J. Damerau, "A technique for computer detection and correction of spelling errors", Communications of the ACM, 1964(Damerau-Levenshtein 距离与单字符错误统计的原始出处)

[2]

Vladimir I. Levenshtein, "Binary codes capable of correcting deletions, insertions, and reversals", Soviet Physics Doklady, 1966

[3]

Matthew A. Jaro, "Advances in record-linkage methodology as applied to matching the 1985 Census of Tampa, Florida", JASA 1989;William E. Winkler, "The state of record linkage and current research problems", 1999

[4]

Lawrence Philips, "The Double Metaphone Search Algorithm", Dr. Dobb's Journal, 2000(Metaphone 系列出处)

[5]

RFC 3492, "Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)", 2003;RFC 5890-5894(IDNA 2008, 2010):rfc-editor.org

[6]

Unicode Technical Standard #39(混淆检测 Skeleton 算法):unicode.org/reports/tr39

[7]

dnstwist 项目文档(生成器清单与参数):github.com/elceef/dnstwist;URLCrazy:github.com/urbanadventurer/urlcrazy

[8]

Xudong Zheng, 同形域名 PoC 演示(2017)及其引起的浏览器显示策略讨论:xudongz.com/blog/2017/idn-phishing

[9]

Moore & Edelman, "Measuring the Perpetrators and Funders of Typosquatting", FC 2010, LNCS 6052, pp.175–191(fat-finger distance 定义与 Damerau 单错误占比 80% 的引用出处):doi.org/10.1007/978-3-642-14577-3_15;benedelman.org 存档页