上周,一位研究人员演示了一种新的供应链攻击,该攻击在该星球上一些最大的公司(包括Apple,Microsoft和Tesla)所属的网络上执行了伪造代码。现在,其他研究人员正在使用模仿者程序包在Internet上大放异彩,到目前为止,已有150多个此类程序被检测到。
该技术由安全研究员亚历克斯·伯桑(Alex Birsan)于上周二揭晓。他所谓的依赖混淆或命名空间混淆攻击始于将恶意代码放置在NPM,PyPI或RubyGems等官方公共存储库中。通过为提交的文件指定与Apple,Microsoft,Tesla和其他33个公司使用的依赖项相同的程序包名称,Birsan能够使这些公司自动下载并安装伪造代码。
依赖关系是开发人员用来将常见功能类型添加到他们编写的软件中的公共代码库或程序包。通过利用成千上万的开放源代码同行的工作,开发人员可以避免自己创建代码的麻烦和开销。开发人员的代码可以从开发人员的本地计算机或公共存储库中自动下载并合并依赖项或对其的任何更新。
Birsan搜寻了Internet论坛,JavaScript代码,意外发布的内部软件包以及其他来源,以查找35家公司在软件中使用的代码依赖项的名称。然后,他使用相同的依赖项名称将自己的代码上传到NPM,PyPI或Ruby Gems。换句话说,研究人员正在蹲下属于公司的真实包裹名称。研究人员最终获得了13万美元的错误赏金。
通过提供比真实版本更高的软件包版本号,目标公司可以自动下载并执行Birsan的假冒软件包。
从开发人员在自己的计算机上犯下的一次性错误,到内部或基于云的构建服务器配置不当,再到系统易受攻击的开发管道,一件事很明显:抢占有效的内部软件包名称几乎是一种肯定的方法。一些最大的科技公司的网络,可以远程执行代码,并且可能允许攻击者在构建过程中添加后门。
安全公司Sonatype上周五说,在Birsan发布结果的两天内,其他开发人员或研究人员就进行了模仿攻击,并在NPM中放入了150个类似名称的软件包。
程序包管理器通常接受列为名称的依赖项,并尝试解析开发人员的意图。管理器在存储项目的本地计算机和程序包管理器的Internet可访问目录上都查找依赖项。
“依赖关系混乱问题是本机安装工具和DevOps工作流程中固有的设计缺陷,这些缺陷将依赖关系拉入您的软件供应链,” Sonatype研究人员在较早的一篇有关Birsan攻击的文章中写道。 “在这种情况下,依赖性混淆是指您的开发环境无法区分软件构建中内部私有创建的当前程序包和公用软件存储库中同名的程序包。”
例如,假设您的应用程序使用一个内部私有创建的PyPI组件foobar(版本1)作为依赖项。稍后,如果将同名但版本号更高的foobar(版本9999)的不相关组件发布到PyPI下载公共存储库,则PyPI开发环境的默认配置要求将具有更高版本的foobar作为依赖项下载。
在这种情况下,这意味着攻击者使用更高版本号的伪造的foobar程序包会在无提示的情况下自动进入您的软件版本。
所谓的错字抢注攻击已经存在多年了。他们将代码上传到公共存储库中,并使用与合法软件包名称相似的名称,以希望开发人员输入错误或单击导致下载伪造代码的恶意链接。 Birsan的依赖关系混淆技术的优点是它不依赖人为错误进行工作。
虽然受影响的公司没有发现伪造品,但Sonatype却发现了。与Birsan核对后,该公司得知虚假依赖项是良性实验的一部分。
Birsan发现,受影响的35家公司使用的是本地存储的依赖项,而公共目录中没有这些依赖项。当他使用与合法依赖相同的名称和更高的版本号将自己的概念验证恶意代码上传到公共存储库时,这些公司的软件会自动安装并运行它们。
为了避免违反公司的漏洞报告政策,Birsan的代码将其活动限制为向研究人员发送每个唯一安装的用户名,主机名和当前补丁。他还被允许通过公共漏洞赏金计划或私人协议来测试所有35家公司的安全性。
为了确保安全防御措施不会阻止信息离开目标公司的网络,Birsan的PoC代码对数据进行了十六进制编码,然后通过DNS查询发送。两家公司未能阻止流量,至少是在恶意软件使用DNS渗透引起研究人员注意的四年之后。加拿大电子商务公司Shopify在Birsan放置在Ruby Gems存储库中的几个小时内,自动安装了一个名为shopify-cloud的Ruby Gem。同时,苹果网络内部的多台计算机执行了Birsan上载的代码,并将其上传到了NPM。 Birsan表示,受影响的Apple项目似乎与该公司的身份验证系统Apple ID有关。 Shopify和Apple都分别向Birsan奖励了30,000美元的赏金。
Sonatype在此列出了开发人员可以用来防止依赖关系混淆攻击的步骤列表。防御措施中最主要的是使存储库强制执行强制的名称空间和范围验证。一种验证技术是反向使用完全限定的域名,该域名允许品牌或名称空间的合法所有者在该名称空间中发布组件,同时将对手拒之门外。