一句话定义:Unicode 同形字攻击(Homoglyph Attack)是指用另一个“长得几乎一模一样”的字符替换原文中的字符,让字符串在机器看来已经不同、在人的眼里却毫无差别,从而绕过关键词匹配、黑名单和内容检测。
为什么能做到
Unicode(统一码)为了容纳全世界的文字,收录了来自不同书写系统的海量字符。问题在于,这些字符并不总是长得很不一样:拉丁字母、西里尔字母、希腊字母里有大量“撞脸”的成员。常见例子:
| 你看到的 | 可能是拉丁字母 | 可能是西里尔/希腊字母 |
|---|---|---|
| a | a(U+0061) | а(西里尔 U+0430) |
| o | o(U+006F) | о(西里尔)、ο(希腊) |
| p | p | р(西里尔) |
| c | c | с(西里尔) |
看起来完全一样,但字符编码不同。过滤器做的是逐字比较,比较时认的是编码;人做的是看图,看图时认的是形状。这两套判断标准对不上,于是前面说的绕过就成立了。
打个比方:门禁只比对身份证号,不比对照片。有人拿着一个号码不同、但照片和你一模一样的证件,机器放行,保安肉眼也看不出破绽。
一个词里的某个字母被换成同形字后,关键词黑名单就匹配不到了;而语言模型在分词和理解时往往仍能读出原意,于是“过滤没有拦住、模型却读懂了”这个缺口就出现了。同类思路还有在词中间插入零宽字符(Zero-Width Character),肉眼完全看不见,但字符串已经变了。
和相邻概念的区别
- 拼写错误或变体:错别字肉眼能看出来,同形字看不出来。
- 编码错误(乱码):乱码是渲染失败,同形字是合法字符,显示完全正常。
- 对抗性扰动:那是在语义或向量层面做手脚,通常带一串看着奇怪的词;同形字只动字符本身。
- 国际化域名仿冒(IDN Homograph):这是同形字攻击在域名上的应用,比如把某个品牌名里的字母换成西里尔同形字,做出一个肉眼难辨的钓鱼网址。
对实际工作的意义
做内容安全、风控、合规过滤的团队,如果只靠字符串黑名单,基本挡不住这一层。通行做法是先做 Unicode 规范化(Normalization,常用 NFKC),再做同形字映射归并——统一码联盟(Unicode Consortium)长期维护一份可混淆字符表(confusables),具体规则和文件以官方页面为准。更稳的思路是把检测放到分词后或语义层,而不是纯字符层。
做评测的人也要留意:测试集里如果只有“原样”的违规样本,指标会虚高;加上同形字变体,才是真实分布。
对普通人来说,这件事的现实版本是钓鱼链接和仿冒账号。看到域名或用户名时,别只看“像不像”,点进去之前多确认一次来源,涉及账号、支付尤其如此。
