黑入微软苹果特斯拉竟如此容易!这位鬼才的攻击方法火了

边策金磊发自凹非寺
量子位报道|公众号QbitAI
论攻击科技巨头有多难?
非常容易 , 而且是简单到极致的那种 。
只需要制造虚假的pip、npm软件包 , 就可以轻松攻破微软、苹果、特斯拉、PayPal、Yelp等数十家科技公司服务器 。
没错 , 就是我们再熟悉不过的那些安装命令 。
这是一位名叫AlexBirsan的黑客最近发现的巨大漏洞:只要上传和科技公司内部软件包名字相同的“李鬼” , 就可以让他们在不知不觉中感染恶意软件 。
波及范围之广、攻击方式之简单 , 令人咋舌 。
Birsan由此发现了30多家科技公司的存在漏洞 , 有两家公司已经奖励他3万美元的的bug赏金 。
怎么一回事?
事情起源于2020年夏天 。
另一位黑客在网上分享了一段GitHub上有趣的Node.js源代码 。 这段代码原来仅供PayPal内部使用 。
Birsan发现 , package.json文件列出了安装软件所需的各种依赖项:

黑入微软苹果特斯拉竟如此容易!这位鬼才的攻击方法火了
文章图片
其中有来自npm的公共软件包 , 也有PayPal内部的私有软件包(红色) , 后者是由PayPal内部托管 , 这些软件包在公共npm注册表中搜索不到 。
Birsan因此产生了很多的疑问:
如果有人假冒PayPal私有软件包的名字 , 将恶意代码上传到npm会发生什么?
PayPal的内部项目是否有可能因此使用假冒的软件包 , 而不是原来的私有软件包?
系统是否会因为安装假冒软件包而运行恶意代码?
如果这种攻击方法行得通 , 可以从中获得科技公司的漏洞赏金吗?
这种攻击还会对其他公司起作用吗?
攻击方法
带着这些想法 , Birsan将同名的“恶意”Node程序包上传到npm注册表 , 这样PayPal的程序员如果安装他们的私有软件包 , 就会被假的软件欺骗和替代 。
当然 , Birsan的“恶意软件”并不包含破坏成分 , 它只有一个功能 , 当对方使用npm安装上与原软件同名的“李鬼”时 , 就会发送信息通知Birsan 。
“恶意软件”将返回用户名、主机名、安装路径等信息 , 一方面可以帮助公司安全团队根据这些信息确定可能受到攻击的系统 , 同时还可以避免将Birsan的测试误认为是实际的攻击 。
不过 , 要让安装假软件的服务器向自己发出信息并不容易 。 因为公司内部电脑都受到防火墙的保护 , DNS渗透是解决办法 。

黑入微软苹果特斯拉竟如此容易!这位鬼才的攻击方法火了
文章图片
Birsan通过DNS协议将信息发送到他的服务器 ,
Birsan数据经过十六进制编码 , 将数据伪装成DNS查询的一部分 , DNS查询直接或通过中间解析器到达了他自定义的服务器 。
通过这种攻击方式 , 他记录了每台计算机下载软件包的记录 。
寻找攻击目标
有了攻击的基本计划 , Birsan决定寻找更多可能的攻击目标 。
首先就是把攻击的软件生态范围扩大 , 除了Node.js外 , 他还将代码移植到Python和Ruby上 , 这样使用PyPI和RubyGems的公司也会受到影响 。
接下来就是寻找各大公司的私有软件包名称 。
在搜索了整整几天后 , Birsan发现 , 可以在GitHub以及主要软件包托管服务中找到 , 也可以通过各种互联网论坛上的帖子 。
甚至没必要那么麻烦 , 其实找到私有程序包名称的最佳位置 , 是在各家公司的javascript文件 。
这和前面在package.json找到依赖项类似 。 同样 , require()这些文件中泄漏的内部路径或调用也可能包含依赖项名称 。
苹果、Yelp和特斯拉都可以通过这种方式找到 。 下面就是从Yelp网站上发现的依赖项 。

黑入微软苹果特斯拉竟如此容易!这位鬼才的攻击方法火了
文章图片
接下来 , 就开始“攻击”了 。
攻击结果如何?
“成功率简直让人吃惊 。 ”
Brisan在按照上述方法进行攻击后 , 不禁发出这样的感慨 。
黑入微软苹果特斯拉竟如此容易!这位鬼才的攻击方法火了】他将这样的bug叫做依赖性混乱(dependencyconfusion) , 并称已经在超过35个组织、所有三种测试编程语言中 , 均有发现:
有一点非常明确:非法占用有效的内部包名称 , 几乎成了一种万无一失的攻击方法 。
绝大多数受此影响的公司 , 规模都是超过1000名员工的 , 这很可能反映出大型公司内部库的使用率很高 。
并且 , 由于Javascript依赖名称更容易找到 , 几乎75%的已记录回调来自npm包 , 但这并不一定意味着Python和Ruby不易受到攻击:
事实上 , 尽管在我的搜索过程中只能识别出8个组织的内部Rubygem名称 , 但其中有4个公司很容易因为RubyGems而产生“依赖性混乱” 。