最聪明的想法往往是最简单的。困难的部分是第一个提出这个想法并付诸实施的人。

一个如此聪明的人简单的想法他发明了一种方法,破解了包括微软、苹果、Yelp、贝宝、Shopify、Netflix、特斯拉和优步在内的35家大型科技公司的漏洞,这为他赢得了13万美元的漏洞奖金。

依赖混淆

这种方法依赖于所谓的“依赖混淆”。基本上,它利用了计算机程序(在本例中是流行的包管理器,如npm、PyPI和RubyGems)用于查找项目依赖的文件的可能位置的混淆。

所有这些包管理器都将接受作为名称列出的依赖项,并尝试解决开发人员的意思。他们将在项目所在的计算机上本地查找依赖项,并检查包管理器的公共、可通过Internet访问的目录。

Birsan发现,受影响的公司使用的是开源目录中不存在的本地存储文件。

下面的例子显示了一个缩写package.json这个文件列出了一个由PayPal创建的私有项目的依赖项,该项目最终在GitHub上完成。Birsan注意到,虽然有些依赖,比如表达在本例中,出现在公共NPM存储库中,其他如pplogger,而是贝宝私人创建的npm包,由公司内部使用和存储。

"dependencies": {"express": "^4.3.0",…:“pplogger ^ 0.2”,……}

Birsan想知道是否可以通过在公共npm存储库上创建与这些本地依赖项名称匹配的包,将恶意软件引入这些项目。

为了验证他的想法,他开始寻找上传自己的“恶意”Node包到npm注册表的有效位置。因为npm允许在安装包时自动执行任意代码,所以他的代码可以从安装包的每台电脑上“打电话回家”,告诉他什么时候他的想法成功了。

打电话回家

从内部保护良好的公司网络将信息传送到自己的服务器,这又是一个问题,通过使用DNS过滤解决了这个问题。DNS数据过滤是一种在两台计算机之间无需任何直接连接即可交换数据的方法,这种方法不会引起太多关注。

在Exfilter阶段,客户端向外部DNS服务器地址发出DNS解析请求。攻击者的名称服务器不会使用A记录进行响应,而是使用CNAME、MX或TXT记录进行响应,从而允许攻击者和受害者之间发送大量非结构化数据。

版本混淆

除了将他的原始想法扩展到Python和Ruby包管理器,分别是PyPI(Python包索引)和RubyGems之外,Birsan还测试了如果他上传的包的版本号比实际的上一个版本高,因此“更新”时会发生什么情况。在这些情况下,公共存储库中的较高版本将优先于较旧的本地版本。这进一步提高了他的成功率。

奖励

到目前为止,亚历克斯·比尔桑已经从漏洞奖励计划中获得了13万美元。这看起来可能是一大笔钱,但想象一下,如果他把这个戏法卖给出价最高的人,他能赚多少钱。在我们的短期和长期记忆中,成功的供应链攻击都会带来毁灭性的后果。

根据Sonatype公司2020年软件供应链状况报告,针对开源软件项目的供应链攻击是企业面临的主要问题,因为90%的应用程序包含开源代码,其中11%具有已知漏洞。

和Alex Birsan一样,我们要强调的是,他入侵的所有公司都允许他们通过运行漏洞奖励程序或明确许可进行安全测试。换句话说,“不要在自家地下室尝试,否则你可能会被你的连帽衫拖上法庭”。

修复

大多数被入侵的公司都采取了措施来防止这种类型的攻击,但这种方法仍然可用。根本问题需要针对整个生态系统而不是一家公司一个公司地解决,因为我们都知道总会有拖拖拉拉的人迟到。我们注意到,package.json文件允许要作为完整URL列出的依赖项,这可能会对这种形式的攻击提供一定的恢复力。

这种方法最令人满意的地方在于它不依赖于社会工程。如果可以找到文件名,就可以执行计划。

对于那些想要了解更多细节的人来说,整个故事用亚历克斯自己的话来说就是在他的Medium文章中找到的以及随之而来的Twitter的线程