当前位置:首页 行业动态 正文

Unicode 视觉欺骗攻击深度解析

2025-04-24

一、前言

2022 年 9 月 13 日,Unicode 15.0 正式版发布。在 Unicode 15.0 中增加了 4,489 个字符,总共字符数量达到了 149,186 个。这些新增内容包括 2 个新脚本,总共脚本数量达到 161 个,以及 20 个新的表情符号字符。同时,几个重要的 Unicode 规范也随着 15.0 版本进行了更新,这其中就包括 Unicode 安全机制(UTS#39)这个规范,它意在减少因 Unicode 字符视觉欺骗带来的同形异意攻击(Homoglyph Attack)。

同形异意攻击(Homoglyph Attack)是非常古老的一种视觉欺骗攻击方式。在机械打字机时代,很多打字机为了简化设计和降低制造及维护成本,键盘上没有单独的 1 和 0。打字员会使用小写字母 L 和大写字母 i 来代替数字 1,使用大写字母 O 来代替数字 0。当这些相同的打字员在 70 年代和 80 年代初转变为计算机键盘操作员时,他们的旧键盘习惯在他们的新职业中继续存在,并成为极大混乱的源泉。这应该是视觉混淆、同形异意攻击集中爆发的一个时期。

Unicode 视觉欺骗攻击深度解析

在此之后,打字机被文字处理器所代替,信息化时代逐步到来,字符编码也开始由 ASCII 字符集逐渐扩充到 Unicode 字符集。我们开始使用浏览器或其他应用客户端来呈现文本,那些在某些语境中不适合使用同形字书写 URL、公式、源代码、ID 等等,其相似的外观继续使得用户可能在视觉上无法区分。

Unicode 视觉欺骗取决于视觉上可以混淆的字符串:两个 Unicode 字符串外观上非常相似,在通常的屏幕分辨率下,它们以小尺寸的普通字体出现,很容易让人们误认为是另一个。视觉混淆没有明显的规则:当尺寸足够小时,许多字符都看起来像其他字符。“屏幕分辨率下的小尺寸”是指大多数脚本使用 9-12 像素的字体。易混淆性还取决于字体的风格:对于传统的希伯来字体,许多字符只能通过细微的差别来区分,而这些细微差别可能在小尺寸时丢失。在某些情况下,字符序列也可用于欺骗:例如,“rn”(“r”后跟“n”)在许多 sans-serif 字体中与“m”在视觉上混淆。

近些年来,因 Unicode 编码欺骗发生了很多恶意攻击事件,人为或编译器或 AI 都可能因 Unicode 欺骗产生错误的判断和解析。例如 2021 年有研究人员在谷歌等商业系统中使用 Unicode 的这些特殊字符对 NLP 模型进行对抗攻击。他们通过一些不可察觉的编码注入——比如一个不可见字符、同形符、重新排序或删除的操作字符,可以显著降低一些模型的性能,大多数模型都可能在功能上失灵(https://arxiv.org/abs/2106.09898)。

Unicode 视觉欺骗攻击深度解析

2022 年 Trezor 这款知名的硬件钱包出现了大量的网络钓鱼网站,钓鱼链接https://suite.tr?zor.com。这个钓鱼链接和真实 Trezor 官方网站 trezor.io 极为相似。(此案例来源于《区块链黑暗森林自救手册》:https://github.com/slowmist/Blockchain-dark-forest-selfguard-handbook/blob/main/README_CN.md)

Unicode 视觉欺骗攻击深度解析

虽然基于客户端的尤其是浏览器端的抵御视觉欺骗的防御措施一直在完善,但并没有办法完全封堵住这种攻击。第一,视觉欺骗是一种很难被完全消亡的攻击,因为在足够小的尺寸情况下人自身的生理视觉体系也是无法分辨的;第二,Unicode 字符集非常庞大,并且在不断的增加;第三,需要标准组织、浏览器开发商、域名注册商等多方共同协作去完成。

本文主要研究当下 Unicode 中因字形渲染、混合脚本、PunyCode、双向文本、组合字符引起的视觉欺骗问题,结合作者发现的不同类型的 Unicode 视觉欺骗漏洞,分享漏洞挖掘过程方法并给出一些防御的思路。

Unicode 视觉欺骗攻击深度解析

二、字形渲染带来的安全风险

当字体或渲染引擎对字符或字符序列的支持不足时,就使得本应该在视觉上可以区分的字符或字符序列出现新的问题--视觉混淆。尤其是这些字符被做为关键的信息出现时,比如在浏览器重要的安全指示器地址栏中,这种视觉欺骗的危害就会显而易见。浏览器厂商对于地址栏上的 IDN 欺骗问题,一直在做积极的防御,通常是在浏览器里维护一个重要域名列表,如果一个域名和列表中的域名同形异议,则将其转化为 Punycode 编码显示。

渲染支持不足,直接导致每一个字符的字形含义往往超出我们的预期,这种不确定性使得视觉欺骗随时都可能发生。那么字形到底是什么,它和字型、字符、字体有什么关系,包括 Unicode 中越来越火的 Emoji 表情它是字符吗?其中一些基本的名词概念非专业人士经常混淆,我们先简要了解下。

Unicode 视觉欺骗攻击深度解析

字体(英语:Typeface)指的是一组字符的设计,通常包括字母、一组数字和一组标点符号。也常包括表意字符以及制图符号。每个字体都是字形的集合,比如宋体、黑体等。 有些字体技术非常强大,比如 TrueType/OpenType,它们可以根据分辨率、系统平台、语言等来选择显示最佳的形状。但是,它也可以用于安全攻击,因为它足够强大,可以在打印时将屏幕上的“$ 100.00”外观更改为“$ 200.00”。 此外,层叠样式表(CSS)可以更改为不同的字体,用于打印与屏幕显示,这可以使用更多可混淆字体。这些问题并非特定于 Unicode。为了降低此类漏洞利用的风险,程序员和用户应该只允许可信任的字体。