近日,安全研究圈再次响起警报——一种看似无害的Unicode特性“从右到左装饰字符”,正被恶意利用为隐蔽攻击工具,给代码安全、文件命名甚至日常通信带来严重威胁。安全专家警告,这类字符就像一把“指向自己的枪”,开发者与普通用户若不提高警惕,极易在不知不觉中“走火”。
什么是“从右到左装饰字符”?
在Unicode标准中,有一类专门用于控制文本显示方向的字符,被称为“双向文本(BiDi)控制字符”。其中最常见的包括U+202E(从右到左覆盖,RLO)、U+2066(从左到右隔离,LRI)、U+2067(从右到左隔离,RLI)等。这些字符本身不会显示任何符号,但能强制改变后续字符的排列顺序——例如,让原本从左向右书写的英文单词,在屏幕上呈现为从右向左的乱序。
原本,这类字符用于支持阿拉伯语、希伯来语等从右向左书写的语言与拉丁字母混合排版,但近年频频被攻击者“武器化”。安全公司Check Point的研究员指出:“攻击者只需在文件名、代码注释或URL中插入一个不可见的控制字符,就能让显示结果与真实内容截然不同,用户看到的是一回事,程序执行的却是另一回事。”
攻击手法:看不见的“文字游戏”
最典型的攻击场景发生在软件供应链中。2023年,研究人员曾发现一批恶意npm包,其文件名看似为safe-utils.pdf,但实际在文件扩展名前插入了RLO字符。由于RLO强制后续字符从右向左显示,原本的.pdf在屏幕上会翻转成.fdp——然而系统实际读取的仍是.exe。当开发者或用户双击“PDF文件”时,系统实际执行的是恶意可执行程序。
类似的把戏也出现在GitHub代码仓库中。攻击者将恶意代码隐藏在看似无害的函数注释里。比如,一行代码注释写的是“// 检查登录状态: false”,但如果在该行末尾插入RLI字符,注释显示方向反转,用户可能误读为“true”,从而忽略安全漏洞。此外,在电子邮件、即时消息或社交媒体中,攻击者可通过伪造链接显示域名来实施钓鱼——例如,将example.com中的字母“c”替换为插入RLO字符的Unicode变体,让用户误以为访问的是正规网站。
“脚枪”之名的由来:开发者常自食其果
安全社区将这类问题形象地称为“footgun”(脚枪),意指设计初衷良好的功能,却因使用者缺乏认知或疏忽而变成自伤工具。许多开发者甚至不知道这些字符的存在。在代码审查中,肉眼几乎无法分辨正常文本与包含控制字符的文本——Unicode控制字符在大多数编辑器中默认不显示。只有通过十六进制查看器或专用工具才能现出原形。
“这就像在代码里藏了一颗地雷。”开源安全基金会(OpenSSF)的专家评论道。“攻击者不需要复杂的技术,只需一个复制粘贴操作,就能让合法的提交记录、文件下载链接或终端输出变得极具欺骗性。”
更棘手的是,这类攻击的溯源难度极大。由于控制字符是Unicode标准的一部分,许多安全扫描工具并未将其列为高危特征,导致恶意包或文件能够轻松绕过自动化检测。2024年初,Python软件包索引(PyPI)曾紧急下架多个包含RLO字符的恶意库,这些库在上传时均通过了基础安全检查。
如何防范?警惕“看不见的威胁”
面对这类威胁,安全专家给出了多条实操建议:
-
开发者应启用显示不可见字符的功能。所有主流的代码编辑器(VS Code、Sublime Text、JetBrains系列)均可配置高亮显示Unicode控制字符。在代码审查中务必留意异常色彩标记。
-
在文件上传、包管理平台增加对控制字符的检测。例如,npm和PyPI可以拒绝包含BiDi控制字符的包名或文件名,或在下载页面显式警告用户。
-
普通用户应对文件名保持警惕。在下载文件时,建议查看文件的“属性”或“详细信息”,而非仅依靠图标和显示名称。如果文件名中出现异常的反向斜杠、乱码或方向颠倒,应暂停操作。
-
安全团队应将Unicode攻击纳入威胁模型。红蓝对抗演练中,可设计BiDi字符相关的攻击场景,提升团队对非传统攻击向量的应对能力。
结语
从右到左装饰字符本是为全球文本多样性服务的桥梁,如今却成为黑客手中的暗器。在数字世界“所见即所得”的信任模式已不再可靠。每一次点击、每一条命令执行前,不妨多问一句:屏幕上的文字,真的是它本来的样子吗?这把“脚枪”,或许正握在我们每个人手中。