NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

“Trojan Source”算法漏洞几乎影响所有代码的安全

  • 2021-11-05
  • 本文字数:3054 字

    阅读完需:约 10 分钟

“Trojan Source”算法漏洞几乎影响所有代码的安全

发表于 11 月 1 日的最新研究警告说,几乎所有的编译器(即把人类可读源码转换成计算机可执行的机器码的程序)都会受到一种“阴险的攻击”,在这种攻击中,黑客可以将目标漏洞引入任何软件而不被发现。披露这一漏洞的过程是与多个组织协调进行的,其中一些组织目前正在发布更新来解决这个安全漏洞。


剑桥大学的研究人员发现了一个 bug,这个 bug 影响了大多数计算机代码的编译器和许多软件开发环境。问题在于数字文本编码标准 Unicode 的一部分,该标准允许计算机之间进行信息交换,无论其使用何种语言。Unicode 目前定义了 154 种不同语言文字的 143000 多个字符(此外,还有许多非文字的字符集,例如表情符号)。


具体来说,这个漏洞涉及 Unicode 的双向或 “Bidi”算法,该算法处理显示的文本,包括具有不同显示顺序的混合文字,例如阿拉伯语(从右到左读)和英语(从左到右读)。


但是计算机系统需要有一种确定的方法来解决文本中相互冲突的方向性。输入“Bidi 重写”(Bidi override),它可以用来使“从左到右”的文本变成“从右到左”阅读,反之亦然。


“Bidi 算法设定的默认排序在某些情况下可能是不够的,”剑桥大学的研究人员写道,“对于这些情况,Bidi 重写控制字符可以切换字符组的显示顺序。”


Bidi 重写甚至可以使单个脚本字符不同于其逻辑编码的顺序显示。正如研究人员所指出的,这一事实以前曾被利用来掩盖通过电子邮件传播的恶意软件的文件扩展名


这就是问题:大多数编程语言都允许在注释和字符串中放置这些 Bidi 重写。这样做非常糟糕,因为大多数编程语言允许注释,而编译器和解释器会忽略所有文本(包括控制字符)。另外,这也很糟糕,因为大多数编程语言都允许字符串包含任意字符,包括控制字符。


这份研究的共同作者 Ross Anderson,剑桥大学计算机安全教授说:“因此,你可以把它们用在对人类审查者看来无害的源代码中,而实际上却能做出令人讨厌的事。对于像 Linux 和 Webkit 这样的项目来说,这是一个坏消息,这些项目接受来自随机人员的贡献,对其进行人工审查,然后将其合并到关键代码中。就我所知,这是第一个对任何事物都有影响的漏洞。”


这篇研究论文将该漏洞称为“Trojan Source”,指出虽然注释和字符串都有其开始和结束的特定语法语义,但是 Bidi 重写并没有遵循这些限制。以下摘自该论文:


“所以,通过将 Bidi 重写字符完全放入注释和字符串中,我们可以用大多数编译器接受的方式将它们‘偷渡’到源代码中。我们的主要见解是,我们可以用这样一种方法来重新排序源代码字符,而生成的显示顺序也代表了句法上有效的源代码。”


“将所有这一切结合起来,我们得出了一个新的对源代码的供应链攻击(supply-chain attack)。通过在注释和字符串中注入 Unicode Bidi 重写字符,黑客就能在大多数现代语言中产生语法有效的源代码,而在这些语言中,字符的显示顺序与真实逻辑有很大不同。事实上,我们将程序 A 变成了程序 B。”


Anderson 说,对于人类代码审查人员来说,这种攻击可能难以检测到,因为所呈现的源代码似乎是完全可以接受的。


他说:“如果逻辑上的改变足够细微,以至于在后续的测试中都没有被发现,那么黑客就能在不被发现的情况下引入有针对性的漏洞。”


还有一点也令人担心,在大多数现代浏览器、编辑器和操作系统上,Bidi 重写字符通过复制和粘贴功能都持续存在。


Anderson 表示:“任何开发者只要从不被信任的来源复制代码到受保护的代码库,都会无意中引入一个无形的漏洞。这种代码复制是现实世界中安全漏洞的重要来源。”


约翰霍普金斯大学信息安全研究所的副教授 Matthew Green 称,剑桥大学的研究清楚地表明,大多数编译器都会被 Unicode 欺骗,而不像读者所期望的那样处理代码。


图片来源:XKCD.com/2347/


Green 表示:“在阅读这篇论文之前,Unicode 可能会以某种方式加以利用的想法并不令我吃惊。令我吃惊的是,有多少编译器很乐意解析 Unicode,而不使用任何防御措施,它们从右向左的编码技术在将代码嵌入代码库方面是多么有效。那是很聪明的方法,我以前都没想到过。”


在 Green 看来,好消息是,研究人员进行了广泛的漏洞扫描,但未能发现有人利用这一漏洞的证据。


不过,Green 也说:“坏消息是,我们对它没有任何防御措施,而人们现在知道了,就可能会开始利用它。但愿编译器和代码编辑器的开发者能尽快修补这个漏洞!但是,因为有些人没有定期更新他们的开发工具,所以至少在一段时间内存在一定的风险。”


加州大学伯克利分校计算机科学系讲师 Nicholas Weaver 说,剑桥大学的研究提出了“一套非常简单、优雅的攻击方式,可能会使供应链攻击变得更多、更糟糕。”


“在源代码中,人们已经很难区分‘this is OK’和‘this is evil’,”Weaver 说,“有了这种攻击,你就可以利用方向性的转变来更改注释和字符串的呈现方式,例如,‘this is okey’就是它的呈现方式,但‘this is’ okey 就是它在代码中的存在方式。幸运的是,这种特征非常容易扫描,因此编译器可以在未来遇到它时(检测到)。”


剑桥大学那篇论文的后半部分是一项引人入胜的案例研究,介绍了在如此多受影响的编程语言和软件公司中协调漏洞披露的复杂性。研究人员称,在首次披露该漏洞后,它们提供了 99 天的时滞期,以允许受影响的产品能够通过软件更新得到修复。


研究人员写道:“我们遇到了各种各样的回应,从补丁承诺和漏洞赏金到快速解雇和提及法律政策。在我们接触过的 19 家软件供应商中,有 7 家使用外包平台接收漏洞披露,6 家有专门的门户网站接收漏洞披露,4 家通过 PGP 加密的电子邮件接受披露,2 家仅通过非 PGP 电子邮件接受披露。他们都确认收到了我们的披露,最后其中有 9 家承诺发布补丁。”


其中 11 家接受者有用于支付披露漏洞的漏洞赏金计划。但研究人员报告说,其中只有 5 家支付了赏金,平均支付额为 2246 美元,范围为 4475 美元。



Anderson 说,到目前为止,大约半数所联系的维护受影响的计算机编程语言的组织都承诺提供补丁。其他组织则在拖延时间。


“我们将在未来几天监测他们的部署情况,”Anderson 说。“我们也期望 Github、Gitlab 和 Atlassian 会采取行动,所以他们的工具应该能够检测到那些对于缺乏 Bidi 字符过滤语言的代码的攻击。”


至于需要对 Trojan Source 做什么,研究人员敦促依赖于关键软件的政府和公司查明其供应商的态势,对他们施加压力,要求他们实施足够的防御,并确保任何漏洞都被他们工具链中其他地方的控制所覆盖。


“Trojan Source 漏洞几乎影响了所有的计算机语言,这也让此成为一个难得的机会,可以进行全系统的、生态上有效的跨平台和跨厂商的响应对比,”该论文总结道,“由于使用这些技术可以很容易地发起强大的供应链攻击,参与软件供应链的组织实施防御是至关重要的。”


Weaver 称这项研究是 “是非常好的工作,因为在事情发展成问题之前阻止了它。”


“对于修复这些问题来说,协调披露是一项很好的研究,”他说,“这个漏洞确实存在,但是也凸显了我们现代代码所依赖的依赖项和软件包不断变化的更大漏洞。”


Rust 发布了一份针对此安全漏洞的安全公告,它的追踪代号是 CVE-2021-42574 和 CVE-2021-42694。其他受影响语言提供的安全建议将在此添加和更新。


Trojan Source 研究论文下载地址:https://www.trojansource.codes/trojan-source.pdf


作者介绍:

Brian Krebs,独立调查记者。报道网络犯罪、安全、隐私。《纽约时报》畅销书《Spam Nation》一书作者。前华盛顿邮报记者(1995 年~2009 年)。


原文链接:

https://krebsonsecurity.com/2021/11/trojan-source-bug-threatens-the-security-of-all-code/

2021-11-05 18:305507
用户头像
罗燕珊 InfoQ中文站编辑

发布了 424 篇内容, 共 246.9 次阅读, 收获喜欢 759 次。

关注

评论

发布
暂无评论
发现更多内容

深入浅出 Go - sync/atomic 源码分析

helbing

Go 语言

原来只想简单看一下String源码,没想到整理了这么多知识点

小Q

Java 学习 编程 面试 string

第十周作业

走走,停停……

盘点 2020 | 一枚程序员的跑步之路

Simon

程序员 跑步 锻炼 盘点2020

三分钟看懂新一代.Net Core3.1工作流引擎平台

Learun

敏捷开发

年终盘点 | 七年零故障支撑 双11 的消息中间件 RocketMQ,怎么做到的?

阿里巴巴云原生

阿里云 开源 云原生 中间件 消息队列

tron波场智能合约系统软件开发|tron波场智能合约APP开发

系统开发

智慧社区服务平台开发,平安小区建设

t13823115967

智慧城市 平安小区

mybatis分页插件如何实现?

田维常

mybatis

我是如何拿到蚂蚁金服offer?看完2020年Java研发岗复盘经验总结,是时候让面试官懵逼了

比伯

Java 编程 架构 面试 程序人生

实践大于一切!Alibaba最新MySQL性能优化+高可用架构全彩版PDF

Java架构追梦

Java MySQL 学习 架构 面试

警惕”被讲故事“ | 读《叙事改变人生》

邓瑞恒Ryan

读书笔记 哲学 创业心态 社会学 世界观

六个步骤,从零开始教你搭建基于WordPress的个人博客

华为云开发者联盟

网站 WordPress 搭建

《Tensorflow:实战Google深度学习框架》.pdf

田维常

微信昵称可以加雪花了,个性又好看

程序员生活志

工具 微信名 雪花

JVM的艺术—JAVA内存模型

Java jdk JVM

英特尔正式发布全新一代内存和存储产品

E科讯

十一周作业

走走,停停……

智能警务平台搭建,公安一体化警务实战解决方案

t13823115967

智慧公安 智慧警务系统开发

iOS面试基础知识 (二)

iOSer

ios 面试

盘点2020 | 热点事件回顾这一年经历的共同记忆

Java_若依框架教程

盘点2020

线程池的7种创建方式,强烈推荐你用它...

王磊

Java

IT民工闲话·点一盏灯

IT民工大叔

成长 IT 传承

架构师训练营第一期 - 第十二周学习总结

卖猪肉的大叔

极客大学架构师训练营

最简单的 K8S 部署文件编写姿势,没有之一!

万俊峰Kevin

Kubernetes Go 语言

Android uni-app 封装原生插件

anyRTC开发者

uni-app android 音视频 跨平台 聊天室

实战排查|为什么遮挡推流摄像头,会导致播放绿屏?

阿里云视频云

音视频 WebRTC RTC bug RTMP

刚刚,阿里云知行动手实验室正式开放公测了

阿里巴巴云原生

阿里云 开发者 云原生 k8s dubbo

3. 搞定收工,PropertyEditor就到这

YourBatman

Spring Framework 类型转换 PropertyEditor

亿级流量背后战场,京东11.11大促全方位技术揭秘

京东科技开发者

云计算

智能合约DAPP软件系统开发

系统开发

“Trojan Source”算法漏洞几乎影响所有代码的安全_语言 & 开发_Brian Krebs_InfoQ精选文章