RHSB-2021-007 Trojan 源攻击 (CVE-2021-42574、CVE-2021-42694)

Public Date: October 27, 2021, 09:19
已更新 February 15, 2022, 14:18 - English(英语) French Japanese Korean
Resolved 状态
Moderate Impact

红帽已了解到一种新型的安全攻击方式,它会对开发环境造成影响,使向最终用户显示的文本与预期执行的内容不匹配。相关问题被记录为 CVE-2021-42574CVE-2021-42694。这两个漏洞的严重性影响级别为重要(Important)

这类问题被称为 "Trojan Source (特洛伊木马源)" 攻击,它并不是红帽产品中的缺陷。这个安全漏洞的存在是因为在开发环境中实施 Unicode 标准的方式所造成的。 

红帽发布的软件包更新可作为缓解此问题的一个可能的解决方案。红帽提供了一个示例脚本,用于在您自己的开发环境中检测这些问题。此外,红帽还与上游研究人员和社区合作,以在各种开发工具中解决这些问题。

文本编码方案必须同时支持从左到右的语言和从右到左的语言。当带有不同显示顺序的语言脚本混合在一起时,需要 Unicode 中的 Bidirectional (BiDi) 来实现相应的功能。但是,这在源代码中可能会引起混淆。对于一个代码审阅人员,显示的 BiDi 代码可能会引起混淆,被误认为是相似的非 BiDi 代码。这会导致审阅人员无法正确理解代码的执行方式。

攻击者可利用此问题,通过创建一系列精心设计的 BiDi 字符来蒙骗代码审查人员。这些字符的特殊处理方式会蒙骗过代码审阅人员,使他们无法发现其中隐藏的非预期、存在潜在危险的行为。 

这种类型的攻击可能会威胁到代码存储库和构建管道。在常用的开发工具(编译器、编辑器、源代码管理工具)中还没有发现相关的缺陷。红帽正在与上游社区合作,在常用的开发工具中添加适当的诊断功能,以检测可能存在问题的 BiDi 序列。 

另外一个相关的问题是同形字(homoglyphs),它是一个 字形(glyphs)(一组符号中的一个符号,用于在书写的语言中代表一个可以被读的字符),其显示的形式可能与其他字符相同或非常类似。攻击者可以使用同形字修改源代码用于攻击目的,这样的修改不太容易被发现。

CVE-2021-42574

这个安全漏洞的存在是因为在开发环境中实施 Unicode 标准的方式所造成的。攻击者可利用此问题,通过创建一系列精心设计的 BiDi 字符来蒙骗代码审查人员。这些字符的特殊处理方式会蒙骗过代码审阅人员,使他们无法发现其中隐藏的非预期、存在潜在危险的行为。

Unicode 的Directional Formatting Characters ('BiDi' ) 是不可见的字符,用于切换一个或多个字符的显示顺序。BiDi 可以导致显示的顺序与其编写的顺序不同。

大多数编程语言都不容许在源代码中有不明确的控制字符,因为它们不符合相关的语言语法并导致语法错误。某些语言还不允许在变量名中使用一些特殊字符。但是,在大多数的编程语言中,BiDi 字符都可以在注释和一些字符串中使用。 

在当前使用的大多数系统中,在复制和粘贴操作中都会保留 BiDi 字符。因此,从一个不被信任的代码源中进行代码的复制和粘贴就存在引入安全漏洞的风险。如果代码在逻辑上的变化非常小,人工审阅过程可能会无法检测到相关的问题。 

CVE-2021-42694

这个安全漏洞的存在是因为在开发环境中实施 Unicode 标准的方式所造成的。同形字(homoglyph) 指不同的 Unicode 字符,但从人类肉眼来看,它们看起来是相同的。  一个攻击者可以利用同形字来蒙骗代码的审阅人员。例如创建一个恶意补丁,其中包含看似标准的库函数(如 print),但使用同形字替换其中的一个字符。然后,可在一个上游的依赖关系中将这个代码定义为一个依赖项,从而启动与源代码相关的攻击。

这并不是一个在红帽产品中发现的漏洞。

CVE-2021-42694 已被发现一段时间 ,其严重性低于 CVE-2021-42574。在过去的几年里,多个上游项目已开始对同形字的问题进行处理,目前仍在进行中。

红帽已开始对我们的产品和服务进行内部扫描,目前尚未在我们的代码中发现与 unicode 字符相关的此类安全漏洞。另外,红帽还在供应链中对我们的产品进行检查,以检测产品中是否存在不正常的 Unicode 序列。红帽正在与上游社区合作,在常用的开发工具中添加适当的诊断功能,以检测可能存在问题的 BiDi 序列。 

请注意:这个安全漏洞的存在是因为在开发环境中实施 Unicode 标准的方式所造成的。它并不是红帽产品中的一个缺陷。红帽发布的软件包更新可作为缓解此问题的一个可能的解决方案。

已经开发了一个诊断脚本,以确定您的代码中是否存在 BiDi 字符。您可以下载 GPG 签名来验证脚本的真实性。红帽客户门户网站上提供了有关如何使用GPG签名进行验证的说明。

备注:红帽为我们的客户和社区提供此脚本。我们对它的使用并不提供支持,对其输出也不进行评估。如需使用这个脚本的信息,请参阅 README 文件。客户需要自行对 BiDi 字符的使用进行分析并做成自己的决策。研究人员发布的技术白皮书详细介绍了 BiDi 字符。

在源代码中检测 BiDi 字符的替代方法:

在某些文本编辑器中,会通过某些方式(如语法高亮显示、翻转文本滚动方向,打印控制字符)提示存在 BiDi 字符,特别是在一个单词中。在 cat 命令中,可以使用 -A 和 -v 标志来显示不可打印的字符,从而显示 BiDi 控制序列。

红帽借此感谢 Cambridge 大学的 Nicholas Boucher 和 Ross Anderson 报告了该问题。

问:此缺陷是否影响红帽产品?

答:不影响。它不是红帽产品中的一个缺陷。这个安全漏洞的存在是因为在开发环境中实施 Unicode 标准的方式所造成的。

问:此安全漏洞是否影响红帽供应链?

答:红帽在供应链中会对我们的产品进行检查,以检测产品中是否存在不正常的 Unicode 序列。

问:红帽计划如何解决这个问题?

答:这个问题并不是红帽产品中的一个缺陷,它只是在使用上游代码时可能会引入恶意代码。红帽目前正在与各个上游项目合作,在不同的组件中设计和实施诊断和审计功能。这是解决这个问题的最好方案。

问:我在使用旧版本的 Red Hat Enterprise Linux(6 或更早版本),需要如何检测我的代码中是否存在这个问题?

答:使用以下 bash 命令行命令。它没有包括在本文档中的检测脚本那样强大,但具有基本功能:

 $grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069]' /path/to/source

如果您看到任何输出,则需要检查您的代码。

https://trojansource.codes/ 

https://www.lightbluetouchpaper.org/2021/11/01/trojan-source-invisible-vulnerabilities/ 

https://www.unicode.org/reports/tr36/#Canonical_Represenation 

https://www.unicode.org/reports/tr36/#Bidirectional_Text_Spoofing 

https://www.unicode.org/reports/tr39/

Comments