当前开源代码已被广发使用,检测开源代码安全性有多重要?这些“狡猾”又多变的漏洞缺陷可以帮你直观地看到安全的重要性。
剑桥大学的两名研究人员发现了一个影响大多数计算机代码编译器和大部分软件开发环境的漏洞,并将其命名为Trojan Source(“木马源”)。Trojan Source 漏洞几乎影响所有计算机语言。
研究人员表示,该Bug可能会给开源项目添加漏洞,并导致类似SolarWinds的开源供应链攻击场景。他们称,这种攻击在软件供应链的背景下特别强大,如果攻击者通过逃过人类审阅成功地将目标漏洞提交到开源代码中,下游软件可能会继承该漏洞。在GitHub上的存储库中,他们提供了概念验证 (PoC) 脚本。
根据研究论文作者Nicholas Boucher和Ross Anderson的说法,该漏洞影响了几乎所有将人类可读的源代码转换为计算机可执行的机器代码的编译器。他们表示,他们通过协调的披露工作通知了19家独立企业——包括Red Hat、Atlassian和Rustc。
关于漏洞
该漏洞被跟踪为CVE-2021-42574,存在于Unicode的双向算法中,该算法处理从左到右(如英语)和从右到左(如阿拉伯语和希伯来语)脚本显示顺序。
根据CVE列表,“该漏洞允许通过控制序列对字符进行视觉重新排序,该控制序列可用于制作呈现与编译器和解释器摄取的令牌的逻辑顺序不同的逻辑的源代码。攻击者可以利用这一点来为接受Unicode的编译器编码源代码,以便将目标漏洞引入人类审阅不到的地方。”
在Atlassian 工作人员Srivathsav Gandrathi提供的一个示例他表示,“当将带有双向覆盖字符的代码片段复制并粘贴到易受攻击的代码编辑器/块时,Unicode 字符会发生变化文本的顺序没有显示。许多网站和在线编辑器不呈现这些特殊字符,因此开发人员可以通过从另一个易受攻击的网站复制和粘贴代码片段,无意中将攻击者的代码引入到他们自己的代码库中,而没有意识到这一点。”简而言之,审查的代码与编译的代码不同。
Rustc的例子更清楚地说明了这一点:
尽管 CVE 计划尚未为此漏洞分配严重性,但其云、服务器和数据中心产品受该漏洞影响的Atlassian 已根据Atlassian 严重性级别将其严重性评为“高” 。但红帽产品安全部门根据其CVSS v3严重性指标,将此漏洞评为具有中等安全影响。
利用技术
研究人员表示至少有3种不同的技术可以利用源代码标记的视觉重新排序。
1-早期返回:在早期返回利用技术中,对手将一个真正的返回语句伪装成一个注释或字符串字面量,因此他们可以使一个函数比看起来更早地返回。它通过执行在注释中显示的return语句,导致函数短路。
2-注释掉:在这种漏洞利用技术中,看起来是合法代码的文本实际上存在于注释中,因此永远不会执行。这允许对手向审查者展示一些看起来正在执行但从编译器或解释器的角度来看并不存在的代码。
3-扩展字符串:此漏洞利用导致部分字符串文字在视觉上显示为代码。看起来在字符串文字之外的文本实际上位于其中,并且具有与注释掉相同的效果,从而导致字符串比较失败。
这些攻击在 C、C++、C#、JavaScript、Java、Rust、Go 和 Python 编程语言中成功实施概念验证攻击,并在Ubuntu上的gcc v7.5.0和MacOS上的Apple clang v12.0.5上成功验证了这些攻击。
另一种变体
剑桥大学的两位研究人员还发现了另一种类似的攻击,使用的是同形文字,即看起来几乎相同的字符。跟踪为CVE-2021-42694。
在上面的例子中,研究人员展示了如何在C++中执行同形文字攻击。他们使用了两个看起来相似但实际上不同的 H,蓝色的拉丁语H和红色的西里尔字母Н。当使用clang++编译时,该程序输出文本“Goodbye, World!”研究人员表示。
通过这个例子可以看出,“攻击者可以在导入到目标的全局命名空间的上游包中定义这样的同形函数,然后从受害者代码中调用该函数。”
加强防御
研究人员建议的最简单的防御策略是禁止在语言规范和实现这些语言的编译器中使用文本方向控制字符。为了进一步解释该策略,他们将其分为三个部分:
支持Unicode的编译器、解释器和构建管道需要对注释或字符串字面量中的未终止双向控制字符以及带有混合脚本易混淆字符的标识符显示错误或警告。
语言规范应该正式禁止在注释和字符串字面量中使用未终止的双向控制字符。
代码编辑器和存储库前端应该用视觉符号或警告使双向控制字符和混合脚本易混淆字符具有可辨性。
目前尽管有近20家软件供应商意识到了这一威胁,但多个编译器仍无法阻止Trojan Source攻击方法。由于许多维护者仍在实施补丁,这两位研究人员建议政府和公司确定他们的供应商,并迫使他们采取必要的防御措施。
目前,维护代码存储库的三家公司目前正在部署针对特洛伊木马源的防御措施。
目前开源软件呈现两个特点,一个是量多另一个是成长速度快。在日常软件开发中更是离不开开源组件,当今软件中超过90%的应用程序包含来自第三方库的代码。而作为商业软件供应商需要满足的关键要点,是确保软件供应链安全,保证源代码安全性及完整性,定期对应用程序进行安全测试和修复,确保软件源组件及开源框架等来源安全可信。
参读链接:
https://www.bleepingcomputer.com/news/security/trojan-source-attack-method-can-hide-bugs-into-open-source-code/
https://thehackernews.com/2021/11/new-trojan-source-technique-lets.html
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!