SCW 아이콘
영웅 배경, 구분선 없음
블로그

什么是特洛伊木马源以及它是如何潜入您的源代码的

로라 베르헤이드
게시됨 Feb 23, 2022
마지막 업데이트: 2026년 3월 9일

11月初,剑桥大学发布了他们的 名为 Trojan-Source 的研究。这项研究的重点是如何使用定向格式化字符将后门隐藏在源代码和注释中。它们可用于编写代码,编译器对逻辑的解释与人工代码审查员的解释有所不同。

这个漏洞是新出现的,尽管过去曾有人恶意使用 Unicode,例如通过以下方式隐藏文件的真实文件扩展名 反转文件名最后一部分的方向。最近的研究表明,许多编译器会在没有警告的情况下忽略源代码中的Unicode字符,而包括代码编辑器在内的文本编辑器可能会重排包含注释和基于这些字符的代码的行。因此,编辑器显示代码和注释的方式可能与编译器解析代码和注释的方式有所不同,甚至可以互换代码和注释。

请继续阅读以了解更多信息。或者,如果你想卷起袖子试一试 Trojan Source 的模拟黑客攻击,可以试试我们的免费版 公共使命 亲自体验一下。

双向文本

其中一种特洛伊木马源攻击使用了 Unicode Bidi(双向)算法,该算法处理如何将具有不同显示顺序(例如英语(从左到右)和阿拉伯语(从右到左)的文本组合在一起。定向格式化字符可用于重新组织分组和显示字符顺序。

上表包含一些与攻击有关的 Bidi 替换角色。举个例子,

RLI e d o c PDI

缩写 RLI 代表 从右到左隔离。它将把文本与其上下文隔离开来(由 PDI 分隔, 流行定向隔离),并将从右向左读取。导致:

c o d e

但是,编译器和解释器通常不会在解析源代码之前处理格式控制字符,包括 Bidi 覆盖。如果他们只是忽略方向格式化字符,他们就会解析:

e d o c

新瓶装旧酒?

当然,这在阳光下并不是什么新鲜事。过去,定向格式化字符是 插入到文件名中 掩盖他们的恶意本质。如果不是 RLO,显示为 “myspecialexe.doc” 的电子邮件附件可能看起来足够纯真 (从右到左的超控) 出现的角色显示真名是 “myspecialcod.exe”。

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

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

양방향 유니코드 텍스트

将按方向格式化字符进行重新排序,如下所示

방향 서식 지정 문자

如果没有明确调出方向格式化字符,则会导致代码像这样呈现:

양방향 유니코드 문자

RLO 在最后一行将右大括号翻转为左大括号,反之亦然。执行此代码的结果将是:“你是管理员”。管理员支票被注释掉了,但是控制角色给人的印象是它仍然存在。

(来源: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 的模拟(公共任务),然后阅读 特洛伊木马来源研究

用 Java 进行模拟

在 C# 中进行模拟

PHP 中的模拟

GO 中的模拟

Python 中的模拟

特洛伊木马来源
特洛伊木马来源
리소스 보기
리소스 보기

더 많은 것에 관심이 있으신가요?

더 알아보세요

Secure Code Warrior는 조직이 소프트웨어 개발 생명주기 전반에 걸쳐 코드를 보호하고 사이버 보안을 최우선으로 하는 문화를 조성하도록 지원합니다. 앱 보안 관리자, 개발자, 최고정보보안책임자(CISO) 또는 보안 관련 업무를 수행하는 모든 분들에게, 저희는 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

데모 예약
공유하기:
링크드인 브랜드사회적x 로고
저자
로라 베르헤이드
게시됨 Feb 23, 2022

Laura Verheyde는 Secure Code Warrior 의 소프트웨어 개발자로서 취약점을 연구하고 Missions 및 코딩 연구소의 콘텐츠를 제작하는 데 주력하고 있습니다.

공유하기:
링크드인 브랜드사회적x 로고
特洛伊木马来源
特洛伊木马来源

11月初,剑桥大学发布了他们的 名为 Trojan-Source 的研究。这项研究的重点是如何使用定向格式化字符将后门隐藏在源代码和注释中。它们可用于编写代码,编译器对逻辑的解释与人工代码审查员的解释有所不同。

这个漏洞是新出现的,尽管过去曾有人恶意使用 Unicode,例如通过以下方式隐藏文件的真实文件扩展名 反转文件名最后一部分的方向。最近的研究表明,许多编译器会在没有警告的情况下忽略源代码中的Unicode字符,而包括代码编辑器在内的文本编辑器可能会重排包含注释和基于这些字符的代码的行。因此,编辑器显示代码和注释的方式可能与编译器解析代码和注释的方式有所不同,甚至可以互换代码和注释。

请继续阅读以了解更多信息。或者,如果你想卷起袖子试一试 Trojan Source 的模拟黑客攻击,可以试试我们的免费版 公共使命 亲自体验一下。

双向文本

其中一种特洛伊木马源攻击使用了 Unicode Bidi(双向)算法,该算法处理如何将具有不同显示顺序(例如英语(从左到右)和阿拉伯语(从右到左)的文本组合在一起。定向格式化字符可用于重新组织分组和显示字符顺序。

上表包含一些与攻击有关的 Bidi 替换角色。举个例子,

RLI e d o c PDI

缩写 RLI 代表 从右到左隔离。它将把文本与其上下文隔离开来(由 PDI 分隔, 流行定向隔离),并将从右向左读取。导致:

c o d e

但是,编译器和解释器通常不会在解析源代码之前处理格式控制字符,包括 Bidi 覆盖。如果他们只是忽略方向格式化字符,他们就会解析:

e d o c

新瓶装旧酒?

当然,这在阳光下并不是什么新鲜事。过去,定向格式化字符是 插入到文件名中 掩盖他们的恶意本质。如果不是 RLO,显示为 “myspecialexe.doc” 的电子邮件附件可能看起来足够纯真 (从右到左的超控) 出现的角色显示真名是 “myspecialcod.exe”。

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

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

양방향 유니코드 텍스트

将按方向格式化字符进行重新排序,如下所示

방향 서식 지정 문자

如果没有明确调出方向格式化字符,则会导致代码像这样呈现:

양방향 유니코드 문자

RLO 在最后一行将右大括号翻转为左大括号,反之亦然。执行此代码的结果将是:“你是管理员”。管理员支票被注释掉了,但是控制角色给人的印象是它仍然存在。

(来源: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 的模拟(公共任务),然后阅读 特洛伊木马来源研究

用 Java 进行模拟

在 C# 中进行模拟

PHP 中的模拟

GO 中的模拟

Python 中的模拟

리소스 보기
리소스 보기

아래 양식을 작성하여 보고서를 다운로드하세요

귀하의 허락을 받아 저희 제품 및/또는 관련 보안 코딩 주제에 관한 정보를 보내드리고자 합니다. 귀하의 개인정보는 항상 매우 신중하게 취급되며, 마케팅 목적으로 타사에 판매하지 않을 것을 약속드립니다.

제출
scw 성공 아이콘
scw 오류 아이콘
양식을 제출하려면 "분석" 쿠키를 활성화하십시오. 완료 후에는 원할 때 다시 비활성화할 수 있습니다.
特洛伊木马来源

11月初,剑桥大学发布了他们的 名为 Trojan-Source 的研究。这项研究的重点是如何使用定向格式化字符将后门隐藏在源代码和注释中。它们可用于编写代码,编译器对逻辑的解释与人工代码审查员的解释有所不同。

这个漏洞是新出现的,尽管过去曾有人恶意使用 Unicode,例如通过以下方式隐藏文件的真实文件扩展名 反转文件名最后一部分的方向。最近的研究表明,许多编译器会在没有警告的情况下忽略源代码中的Unicode字符,而包括代码编辑器在内的文本编辑器可能会重排包含注释和基于这些字符的代码的行。因此,编辑器显示代码和注释的方式可能与编译器解析代码和注释的方式有所不同,甚至可以互换代码和注释。

请继续阅读以了解更多信息。或者,如果你想卷起袖子试一试 Trojan Source 的模拟黑客攻击,可以试试我们的免费版 公共使命 亲自体验一下。

双向文本

其中一种特洛伊木马源攻击使用了 Unicode Bidi(双向)算法,该算法处理如何将具有不同显示顺序(例如英语(从左到右)和阿拉伯语(从右到左)的文本组合在一起。定向格式化字符可用于重新组织分组和显示字符顺序。

上表包含一些与攻击有关的 Bidi 替换角色。举个例子,

RLI e d o c PDI

缩写 RLI 代表 从右到左隔离。它将把文本与其上下文隔离开来(由 PDI 分隔, 流行定向隔离),并将从右向左读取。导致:

c o d e

但是,编译器和解释器通常不会在解析源代码之前处理格式控制字符,包括 Bidi 覆盖。如果他们只是忽略方向格式化字符,他们就会解析:

e d o c

新瓶装旧酒?

当然,这在阳光下并不是什么新鲜事。过去,定向格式化字符是 插入到文件名中 掩盖他们的恶意本质。如果不是 RLO,显示为 “myspecialexe.doc” 的电子邮件附件可能看起来足够纯真 (从右到左的超控) 出现的角色显示真名是 “myspecialcod.exe”。

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

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

양방향 유니코드 텍스트

将按方向格式化字符进行重新排序,如下所示

방향 서식 지정 문자

如果没有明确调出方向格式化字符,则会导致代码像这样呈现:

양방향 유니코드 문자

RLO 在最后一行将右大括号翻转为左大括号,反之亦然。执行此代码的结果将是:“你是管理员”。管理员支票被注释掉了,但是控制角色给人的印象是它仍然存在。

(来源: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 的模拟(公共任务),然后阅读 特洛伊木马来源研究

用 Java 进行模拟

在 C# 中进行模拟

PHP 中的模拟

GO 中的模拟

Python 中的模拟

웹 세미나 시청
시작하자
더 알아보세요

아래 링크를 클릭하고 이 자료의 PDF를 다운로드하세요.

Secure Code Warrior는 조직이 소프트웨어 개발 생명주기 전반에 걸쳐 코드를 보호하고 사이버 보안을 최우선으로 하는 문화를 조성하도록 지원합니다. 앱 보안 관리자, 개발자, 최고정보보안책임자(CISO) 또는 보안 관련 업무를 수행하는 모든 분들에게, 저희는 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

보고서 보기데모 예약
리소스 보기
공유하기:
링크드인 브랜드사회적x 로고
더 많은 것에 관심이 있으신가요?

공유하기:
링크드인 브랜드사회적x 로고
저자
로라 베르헤이드
게시됨 Feb 23, 2022

Laura Verheyde는 Secure Code Warrior 의 소프트웨어 개발자로서 취약점을 연구하고 Missions 및 코딩 연구소의 콘텐츠를 제작하는 데 주력하고 있습니다.

공유하기:
링크드인 브랜드사회적x 로고

11月初,剑桥大学发布了他们的 名为 Trojan-Source 的研究。这项研究的重点是如何使用定向格式化字符将后门隐藏在源代码和注释中。它们可用于编写代码,编译器对逻辑的解释与人工代码审查员的解释有所不同。

这个漏洞是新出现的,尽管过去曾有人恶意使用 Unicode,例如通过以下方式隐藏文件的真实文件扩展名 反转文件名最后一部分的方向。最近的研究表明,许多编译器会在没有警告的情况下忽略源代码中的Unicode字符,而包括代码编辑器在内的文本编辑器可能会重排包含注释和基于这些字符的代码的行。因此,编辑器显示代码和注释的方式可能与编译器解析代码和注释的方式有所不同,甚至可以互换代码和注释。

请继续阅读以了解更多信息。或者,如果你想卷起袖子试一试 Trojan Source 的模拟黑客攻击,可以试试我们的免费版 公共使命 亲自体验一下。

双向文本

其中一种特洛伊木马源攻击使用了 Unicode Bidi(双向)算法,该算法处理如何将具有不同显示顺序(例如英语(从左到右)和阿拉伯语(从右到左)的文本组合在一起。定向格式化字符可用于重新组织分组和显示字符顺序。

上表包含一些与攻击有关的 Bidi 替换角色。举个例子,

RLI e d o c PDI

缩写 RLI 代表 从右到左隔离。它将把文本与其上下文隔离开来(由 PDI 分隔, 流行定向隔离),并将从右向左读取。导致:

c o d e

但是,编译器和解释器通常不会在解析源代码之前处理格式控制字符,包括 Bidi 覆盖。如果他们只是忽略方向格式化字符,他们就会解析:

e d o c

新瓶装旧酒?

当然,这在阳光下并不是什么新鲜事。过去,定向格式化字符是 插入到文件名中 掩盖他们的恶意本质。如果不是 RLO,显示为 “myspecialexe.doc” 的电子邮件附件可能看起来足够纯真 (从右到左的超控) 出现的角色显示真名是 “myspecialcod.exe”。

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

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

양방향 유니코드 텍스트

将按方向格式化字符进行重新排序,如下所示

방향 서식 지정 문자

如果没有明确调出方向格式化字符,则会导致代码像这样呈现:

양방향 유니코드 문자

RLO 在最后一行将右大括号翻转为左大括号,反之亦然。执行此代码的结果将是:“你是管理员”。管理员支票被注释掉了,但是控制角色给人的印象是它仍然存在。

(来源: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 的模拟(公共任务),然后阅读 特洛伊木马来源研究

用 Java 进行模拟

在 C# 中进行模拟

PHP 中的模拟

GO 中的模拟

Python 中的模拟

목록

PDF 다운로드
리소스 보기
더 많은 것에 관심이 있으신가요?

더 알아보세요

Secure Code Warrior는 조직이 소프트웨어 개발 생명주기 전반에 걸쳐 코드를 보호하고 사이버 보안을 최우선으로 하는 문화를 조성하도록 지원합니다. 앱 보안 관리자, 개발자, 최고정보보안책임자(CISO) 또는 보안 관련 업무를 수행하는 모든 분들에게, 저희는 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

데모 예약다운로드
공유하기:
링크드인 브랜드사회적x 로고
자원 센터

시작하는 데 도움이 되는 자료

더 많은 게시물
자원 센터

시작하는 데 도움이 되는 자료

더 많은 게시물