特洛伊木马源代码攻击会对开发人员不可见的代码进行更改

剑桥大学的研究人员发布了一种技术,可以将恶意代码悄悄插入经过同行评审的源代码中。 准备好的攻击方法(CVE-2021-42574)以“Trojan Source”的名称出现,并且基于对于编译器/解释器和查看代码的人来说看起来不同的文本形式。 针对 C、C++(gcc 和 clang)、C#、JavaScript (Node.js)、Java (OpenJDK 16)、Rust、Go 和 Python 提供的各种编译器和解释器演示了该方法的示例。

该方法基于在代码注释中使用特殊 Unicode 字符来更改双向文本的显示顺序。 借助此类控制字符,文本的某些部分可以从左到右显示,而其他部分可以从右到左显示。 在日常实践中,此类控制字符可用于将希伯来语或阿拉伯语的代码行插入文件中。 但是,如果使用指定的字符将具有不同文本方向的行组合在一行中,则从右到左显示的文本段落可能会与从左到右显示的现有常规文本重叠。

使用此方法,您可以在代码中添加恶意构造,然后通过在以下注释中或从右到左显示的文字字符中添加,使具有此构造的文本在查看代码时不可见,这将导致完全恶意插入时叠加了不同的字符。 此类代码在语义上将保持正确,但将以不同的方式解释和显示。

特洛伊木马源代码攻击会对开发人员不可见的代码进行更改

在审查代码时,开发人员将面临字符的视觉顺序,并且会在现代文本编辑器、Web 界面或 IDE 中看到无可疑的注释,但编译器和解释器将使用字符的逻辑顺序,并且将按原样处理恶意插入,而不关注评论中的双向文本。 该问题影响各种流行的代码编辑器(VS Code、Emacs、Atom)以及用于查看存储库中代码的界面(GitHub、Gitlab、BitBucket 和所有 Atlassian 产品)。

特洛伊木马源代码攻击会对开发人员不可见的代码进行更改

利用该方法实现恶意操作的方式有多种:添加隐藏的“返回”表达式,导致函数提前完成; 注释掉通常作为有效构造可见的表达式(例如,禁用重要检查); 分配其他字符串值导致字符串验证失败。

例如,攻击者可能会提出包含以下行的更改: if access_level != "user{U+202E} {U+2066}// Check if admin{U+2069} {U+2066}" {

会在审核界面显示为 if access_level != “user” { // 检查是否为 admin

此外,还提出了另一种攻击变体 (CVE-2021-42694),该变体与同形文字的使用相关,即外观相似但含义不同且具有不同 unicode 代码的字符(例如,字符“ɑ”类似于“ a”、“ɡ”-“g”、“ɩ”-“l”)。 在某些语言中,函数和变量的名称中可能会使用类似的字符来误导开发人员。 例如,可以定义两个具有无法区分的名称的函数来执行不同的操作。 如果不进行详细分析,无法立即明确在特定位置调用了这两个函数中的哪一个。

特洛伊木马源代码攻击会对开发人员不可见的代码进行更改

作为一项安全措施,如果注释、字符串文字或更改输出方向的标识符中存在不成对的控制字符,建议支持 Unicode 字符的编译器、解释器和汇编工具显示错误或警告(U+202A、 U+202B、U+202C、U+202D、U+202E、U+2066、U+2067、U+2068、U+2069、U+061C、U+200E 和 U+200F)。 编程语言规范中也应明确禁止此类字符,并且在代码编辑器和存储库界面中应尊重此类字符。

附录1:已为GCC、LLVM/Clang、Rust、Go、Python、binutils准备了漏洞补丁。 GitHub、Bitbucket 和 Jira 也修复了该问题。 GitLab 的修复正在进行中。 要识别有问题的代码,建议使用命令: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/来源

附录 2:Plan 9 操作系统和 Go 编程语言的开发者之一 Russ Cox 批评对所描述的攻击方法的过度关注,这些攻击方法早已为人所知(Go、Rust、C++、Ruby)并且没有得到认真对待。 Cox表示,问题主要涉及代码编辑器和Web界面中信息的正确显示,这可以通过在审查时使用正确的工具和代码分析器来解决。 因此,与其关注推测性攻击,不如将重点放在改进代码和依赖项审查流程上。

Ras Cox 还认为编译器不是解决问题的正确位置,因为通过在编译器级别禁止危险符号,仍然存在大量工具可以接受这些符号的使用,例如构建系统、汇编器、包管理器和各种配置解析器和数据。 作为示例,给出了 Rust 项目,该项目禁止在编译器中处理 LTR/RTL 代码,但没有对 Cargo 包管理器添加修复,从而允许通过 Cargo.toml 文件进行类似的攻击。 同样,BUILD.bazel、CMakefile、Cargo.toml、Dockerfile、GNUmakefile、Makefile、go.mod、package.json、pom.xml 和requirements.txt 等文件也可能成为攻击源。

来源: opennet.ru

添加评论