返回论坛

Unicode 视觉欺骗攻击深度解析:威胁分析与防护指南

查找币 漏洞披露 安全研究 Web3安全 区块链安全

查找币安全研究院

钱包恢复评估 | 链上取证分析 | Web3 事件响应
以合法授权、证据保全、隐私保护和可复核流程为前提,不要求用户在线提交完整私钥或助记词。

查看研究院 研究报告中心
> 作者:查找币安全团队 | 发布时间:2022年9月 ## 一、前言 2022年9月13日,Unicode 15.0正式版发布,新增4,489个字符,总字符数达到149,186个。此次更新包含2个新脚本(脚本总数达161个)及20个新表情符号。与此同时,Unicode安全机制规范(UTS#39)同步更新,旨在减少因Unicode字符视觉欺骗引发的**同形异意攻击(Homoglyph Attack)**。 同形异意攻击是一种古老的视觉欺骗技术。在机械打字机时代,为简化设计,键盘常省略数字1和0,打字员使用小写字母`l`、大写字母`i`替代数字1,用大写字母`O`替代数字0。这种习惯延续至计算机时代,成为视觉混淆的源头。 随着Unicode字符集的扩展,视觉欺骗问题愈发严峻。两个外观相似的Unicode字符串,在普通屏幕分辨率(9-12像素字体)下极易被误认。例如字符序列`rn`(r后跟n)在无衬线字体中与`m`视觉混淆。近年来,此类攻击已导致多起安全事件: - **2021年**:研究人员利用Unicode特殊字符对NLP模型进行对抗攻击,通过不可见字符、同形符、重排序操作符等,显著降低模型性能([论文链接](https://arxiv.org/abs/2106.09898))。 - **2022年**:知名硬件钱包Trezor遭遇钓鱼攻击,钓鱼链接`https://suite.trẹzor.com`与真实域名`trezor.io`高度相似(案例来源:[《区块链黑暗森林自救手册》](https://github.com/查找币/Blockchain-dark-forest-selfguard-handbook))。 尽管浏览器等客户端防御措施不断完善,但视觉欺骗难以根除:人眼在足够小的尺寸下无法分辨;Unicode字符集持续扩大;需标准组织、浏览器厂商、域名注册商多方协作。 本文聚焦**字形渲染、混合脚本、PunyCode、双向文本、组合字符**引发的视觉欺骗问题,结合发现的安全漏洞,分享挖掘方法与防御思路。 --- ## 二、字形渲染:安全风险的温床 当字体或渲染引擎对字符支持不足时,本应区分的字符可能产生视觉混淆。尤其在浏览器地址栏这类安全指示器中,风险尤为突出。浏览器厂商通常将疑似同形异意的域名转换为PunyCode显示,但渲染支持不足可能导致防御失效。 ### 2.1 核心概念辨析 - **字符(Character)**:Unicode为每个字符分配唯一编号(代码点),如`U+0041`代表拉丁大写字母A。 - **字形(Glyph)**:字符在特定字体下的可视化表示。同一字符在不同字体中可能呈现不同字形。 - **字体(Font)**:包含字形集合的文件,定义字符如何渲染。 - **Emoji**:Unicode中的特殊字符,具有独立字形,但可能被渲染引擎错误解析。 ### 2.2 攻击场景 攻击者利用字形渲染缺陷,构造与合法域名或代码片段视觉相同的字符串。例如: - **域名欺骗**:使用西里尔字母`е`(U+0435)替代拉丁字母`e`(U+0065),在浏览器中呈现相同外观,但实际指向不同服务器。 - **代码注入**:在智能合约或脚本中插入不可见字符(如零宽空格`U+200B`),绕过代码审查,实现隐蔽逻辑。 --- ## 三、混合脚本与PunyCode:域名欺诈的利器 ### 3.1 混合脚本攻击 Unicode允许在同一字符串中混合不同脚本(如拉丁、西里尔、希腊)。攻击者利用脚本混淆构造钓鱼域名: - **示例**:拉丁字母`a`(U+0061)与西里尔字母`а`(U+0430)视觉相同,但`а`可注册为独立域名。 - **危害**:用户点击钓鱼链接后,浏览器地址栏显示合法外观,实际跳转至恶意站点。 ### 3.2 PunyCode绕过 浏览器对IDN(国际化域名)使用PunyCode编码(以`xn--`开头)。但攻击者可利用以下方式绕过防御: - **混合脚本域名**:如`xn--pple-43d.com`(苹果公司钓鱼站),PunyCode解码后显示为`apple.com`(西里尔字母`а`替代拉丁`a`)。 - **视觉同形字符**:注册与知名域名仅差一个字符的PunyCode域名,如`xn--gogle-whf.com`(谷歌钓鱼站)。 --- ## 四、双向文本:混淆逻辑的陷阱 Unicode双向算法(BiDi)允许文本同时包含从左到右(LTR)和从右到左(RTL)的字符。攻击者可利用此特性构造欺骗性字符串: - **攻击手法**:在代码或URL中插入RTL覆盖符(U+202E),使后续字符显示顺序反转。例如,将`file.exe`显示为`exe.elif`。 - **危害**:用户误以为文件扩展名为`.txt`,实际为可执行文件。在智能合约审计中,此类攻击可隐藏恶意函数调用。 ### 防御策略 - **限制BiDi字符使用**:在用户输入中禁止或转义RTL/LTR覆盖符。 - **可视化检测**:开发工具高亮显示BiDi字符,便于审计人员识别异常。 --- ## 五、组合字符:隐藏的恶意载荷 组合字符(如重音符号、变音标记)可与基础字符叠加,形成视觉上不可见的附加信息。 - **攻击示例**:在合法域名后添加零宽连接符(U+200D)和表情符号,浏览器渲染后不显示,但DNS解析时包含这些字符。 - **危害**:用户通过搜索引擎点击看似正常的链接,实际被重定向至钓鱼页面。 ### 技术细节 组合字符的Unicode范围包括: - **组合变音标记**:`U+0300`-`U+036F` - **零宽字符**:`U+200B`(零宽空格)、`U+200C`(零宽非连接符)、`U+200D`(零宽连接符) --- ## 六、漏洞挖掘与防护建议 ### 6.1 挖掘方法 1. **字符集遍历**:使用脚本遍历Unicode平面,找出与常见字符(如拉丁字母、数字)视觉相似的同形符。 2. **渲染测试**:在不同浏览器、字体、操作系统下测试字符渲染效果,识别差异。 3. **域名注册监控**:监控与知名域名同形的新注册域名,分析其PunyCode编码。 4. **代码审计**:在智能合约、配置文件中搜索不可见字符和BiDi覆盖符。 ### 6.2 防护建议 #### 对开发者 - **输入验证**:使用Unicode安全规范(UTS#39)推荐的混淆检测算法,过滤高风险字符。 - **域名处理**:将用户输入的域名转换为PunyCode后显示,避免渲染混淆。 - **代码审查**:在IDE中启用不可见字符高亮,使用静态分析工具检测BiDi攻击。 #### 对用户 - **检查域名**:在浏览器地址栏手动输入域名,避免点击链接。 - **使用安全插件**:安装反钓鱼插件,自动检测IDN欺骗。 - **保持警惕**:对异常URL(如包含表情符号、特殊字符)保持怀疑。 #### 对平台 - **域名注册限制**:禁止注册与知名域名同形的PunyCode域名。 - **实时监控**:建立钓鱼域名检测系统,自动拦截恶意链接。 - **安全公告**:及时发布Unicode相关漏洞预警,推动标准更新。 --- ## 七、总结与展望 Unicode字符集已从1991年的7,161个字符扩展至149,186个,未来仍将持续增长。每个新增字符都可能成为视觉欺骗的潜在载体。在安全漏洞驱动的网络攻击日益频繁的今天,深入Unicode编码研究,从根源分析漏洞收敛,是保护数据安全的必经之路。 作为安全从业者,我们需持续关注Unicode规范更新,结合自动化工具与人工审计,构建多层次防御体系。唯有如此,才能在不断演变的攻击手法中立于不败之地。 --- *本文由查找币安全团队整理发布* **参考文献:** - Unicode 15.0 Release Notes - UTS#39: Unicode Security Mechanisms - 《区块链黑暗森林自救手册》(查找币团队) **延伸阅读:** - [揭秘以太坊Vanity生成器Profanity私钥破解漏洞](https://查找币.io/security/profanity) - [区块链分叉带来的安全挑战](https://查找币.io/security/fork) - [Redline Stealer木马盗币分析](https://查找币.io/security/redline) --- > 查找币安全团队专注于Web3领域安全研究,持续追踪Unicode、智能合约、跨链桥等方向的最新威胁。欢迎通过以下渠道与我们交流: > - GitHub: [github.com/查找币](https://github.com/查找币) > - Telegram: [t.me/查找币team](https://t.me/查找币team) > - Twitter: [@查找币_team](https://twitter.com/查找币_team)
在论坛中查看和回复