博客

什么是 Trojan Source 以及它如何潜入您的源代码

February 23, 2022
Laura Verheyde
发光的电路板特写,橙色线路清晰可见,焦点对准“01”字样。

11 月初,剑桥大学发布了名为 Trojan-Source 的研究。该研究重点探讨了如何利用方向格式化字符将后门隐藏在源代码和注释中。攻击者可以利用这些字符编写代码,使编译器对逻辑的解读与人类代码审查员的理解产生偏差。

这种漏洞是全新的——尽管 Unicode 过去曾被恶意利用,例如通过反转文件名末尾的顺序来隐藏文件的真实扩展名。最新的研究表明,许多编译器会直接忽略源代码中的 Unicode 字符而不发出警告,而包括代码编辑器在内的文本编辑器可能会根据这些字符重新排列包含注释和代码的行。因此,编辑器显示代码和注释的方式与编译器解析它们的方式可能完全不同,甚至顺序颠倒,导致代码和注释被互换。

请继续阅读以了解更多信息。或者,如果您想亲自上手尝试模拟 Trojan Source 攻击,欢迎加入我们免费的公开任务,亲身体验其中的奥秘。

双向文本

其中一种 Trojan-Source 攻击利用了 Unicode Bidi(双向)算法,该算法用于处理不同显示顺序的文本组合,例如英语(从左到右)和阿拉伯语(从右到左)。方向格式化字符可用于重新组织字符的分组和显示顺序。

上表列出了一些与该攻击相关的 Bidi 覆盖字符。以这个为例,

RLI e d o c PDI

缩写 RLI 代表从右到左隔离 (Right-to-Left Isolate)。它会将文本与其上下文隔离(由 PDI,即弹出方向隔离 (Pop-Directional-Isolate)界定),并从右向左读取。结果如下:

c o d e

然而,编译器和解释器在解析源代码之前通常不会处理格式控制字符(包括 Bidi 覆盖字符)。如果它们直接忽略这些方向格式化字符,解析结果将是:

e d o c

旧瓶装新酒?

当然,这并非什么新鲜事。过去,方向格式化字符就曾被插入到文件名中以掩盖其恶意本质。一个显示为“myspecialexe.doc”的电子邮件附件看起来可能很无害,但如果其中包含 RLO(从右到左覆盖)字符,其真实名称其实是“myspecialcod.exe”。

Trojan Source 攻击将方向格式化字符插入到源代码的注释和字符串中,因为这些字符不会产生任何语法或编译错误。这些控制字符会改变代码逻辑的显示顺序,导致编译器读取的内容与人类看到的内容完全不同。

例如,一个包含以下字节序列的文件:

Bidirectional Unicode Text

将被方向格式化字符重新排序为:

Directional Formatting Characters

如果未明确标出方向格式化字符,代码呈现的效果如下:

Bidirectional Unicode Characters

RLO 会将最后一行中的闭括号翻转为开括号,反之亦然。执行此代码的结果将是:“You are an admin”。尽管管理员检查已被注释掉,但这些控制字符会让人误以为它仍然存在。

(来源:https://github.com/nickboucher/trojan-source/blob/main/C%23/commenting-out.csx)

这会如何影响您?

许多语言都容易受到这种攻击:C、C++、C#、JavaScript、Java、Rust、Go 和 Python,且推测还有更多语言受影响。经验丰富的开发者看到源代码中出现方向格式化字符时可能会皱眉,但新手可能只会耸耸肩而不以为意。此外,这些字符的显示效果高度依赖于 IDE,因此无法保证一定能被发现。

但这种漏洞最初是如何潜入源代码的呢?首先,这可能发生在使用来自不可信来源的源代码时,恶意代码贡献未被察觉。其次,它可能源于从互联网上复制粘贴代码,这是我们大多数开发者都做过的事情。大多数组织依赖来自多个供应商的软件组件。这就提出了一个问题:我们能在多大程度上完全信任和依赖这些代码?我们该如何筛查包含隐藏后门的源代码?

这是谁的问题?

一方面,编译器和构建流水线应禁止源代码行中出现多种方向,除非某种方向被严格限制在字符串和注释内。请注意,字符串或注释中的方向格式化字符如果未被闭合,可能会将方向更改延伸至行尾。通常,代码编辑器应明确渲染并高亮显示可疑的 Unicode 字符,例如同形异义字和方向格式化字符。自 11 月起,GitHub 会为每一行包含双向 Unicode 文本的代码添加警告标志和消息,尽管它不会高亮显示这些字符在行中的具体位置。这仍可能导致恶意方向更改与良性方向更改一同潜入。

提高开发者和代码审查人员的意识至关重要,这就是我们创建演示该漏洞的演练教程的原因。目前,该演练教程适用于 Java、C#、Python、GO 和 PHP。

如果您想了解更多信息,请尝试我们的 Trojan Source 模拟(公开任务),并阅读 Trojan Source 研究报告。

Java 模拟

C# 模拟

PHP 模拟

GO 模拟

Python 模拟

标语

在 AI 驱动的开发成果发布前实现有效治理

评估 AI 辅助风险,在提交代码时强制执行安全编码策略,并加速整个软件开发生命周期的安全交付。

预约演示
资源库

探索更多博客

获取有关安全编码、人工智能治理和软件风险管理的专家内容。

浏览全部
案例研究
筛选标签
这是 div 块中的一段文本。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

统一的安全文化:Sage 如何打造其安全倡导者项目

了解 Sage 如何通过灵活且以关系为导向的方法提升安全性,成功培养了 200 多名安全倡导者,并实现了显著的风险降低。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

2026年网络安全意识月:理解人工智能安全对企业防御至关重要

目前,大多数顶级人工智能公司已公开呼吁全球放缓人工智能的发展速度,以便安全防护措施能够跟上步伐。然而事实是,严重的安全问题已经显现。随着人工智能实施带来的经济成本和风险不断累积,无数安全领导者和高管团队正处于紧迫的境地。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

赋能要素 8:打造项目品牌

成功的安全编码项目不仅需要优质的内容。赋能要素 8 展示了如何通过品牌化将参与过程转变为一种令人向往、以地位为驱动的体验。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

每一位员工现在都处于 AI 网络安全的最前线

企业技术格局正以一种鲜有人预料到的速度发生剧变,直到为时已晚。我们已正式跨越了从人工编写代码和基础辅助编程,进入“智能体开发生命周期”(ADLC)的时代。虽然自主 AI 智能体有望在多个职能领域实现前所未有的效率,但它们也带来了全新的安全和监管风险。

了解更多

在产品发布前确保 AI 驱动的开发安全

洞察开发风险,执行安全策略,并在整个软件开发生命周期中预防漏洞。

预约演示
未找到相关项目。