NPM投毒导致所有公开NPM包无法删除

admin 2024年1月6日09:50:36评论36 views字数 3172阅读10分34秒阅读模式

概述

墨菲安全实验室监测发现,名为 gdi2290 的NPM用户于2023年12月30日上传了名为 everything 的NPM组件包和超过3000个被 everything 依赖的包,这些包以 @everything-registry 为前缀进行命名,用于分批次下载所有公开的NPM包。当用户安装 everything 投毒包时会下载所有公开的npm组件包,造成存储空间耗尽,导致业务中断。

由于 npmjs 具有被依赖的组件包不能直接删除的限制,导致被 everything NPM组件包依赖了所有的 NPM 包均不可下架。开发者在投毒包 everything 发布前(2023年12月30日)上传的NPM包均不可删除,如果是用于本地测试或者误操作上传了包含敏感信息的NPM包,则会由于不能删除而导致信息泄露,此次事件影响所有NPM用户。

事件分析

投毒者 gdi2290 在每个投毒包的 index.js 中输出“You have installed everything... but at what cost?”、“Beep boop!”等调侃语句。

投毒者同时创建了域名 https://everything.npm.lol/(已无法访问)用于展示安装时效果,页面中融入 《The Elder Scrolls V: Skyrim》元素,增加了些许调侃意味。

NPM投毒导致所有公开NPM包无法删除

everything.npm.lol 网页截图

当用户安装投毒包时,分为以下三个阶段下载所有发布的 NPM 包:

第一阶段

当用户安装 everything NPM组件包时将下载 dependencies 中的 @everything-registry/chunk-0 等依赖包,下面为 Everything 组件包的 package.json 代码:

{  "name": "everything",  "version": "3.0.0",  "description": "npm install everything",  "main": "index.js",  "contributors": [    "PatrickJS <[email protected]>",    "uncenter <[email protected]>",    "ChatGPT <[email protected]>",    "trash <[email protected]>",    "Hacksore <[email protected]>"  ],  "scripts": {},  "keywords": [    "everything",    "allthethings",    "everymodule"  ],  "license": "MIT",  "homepage": "https://github.com/everything-registry/everything",  "repository": {    "type": "git",    "url": "git+https://github.com/everything-registry/everything.git"  },  "dependencies": {    "@everything-registry/chunk-0": "0.1.0",    "@everything-registry/chunk-1": "0.1.0",    "@everything-registry/chunk-2": "0.1.0",    "@everything-registry/chunk-3": "0.1.0",    "@everything-registry/chunk-4": "0.1.0"  }}

第二阶段

安装的依赖包会继续安装该作者发布的以 @everything-registry/chunk 为前缀的依赖包,以 @everything-registry/[email protected] 为例:

NPM投毒导致所有公开NPM包无法删除

NPM组件包@everything-registry/chunk package.json代码

第三阶段

以 @everything-registry/chunk 为前缀的依赖包会分批安装所有公开的 NPM 组件包,以 @everything-registry/[email protected] 为例:

NPM投毒导致所有公开NPM包无法删除

NPM组件包@everything-registry/sub-chunk-0 package.json代码

所有被 everywhere 间接依赖的NPM包删除时会报错: 

# 报错信息You can no longer unpublish this package.npm ERR! Failed criteria:npm ERR! has dependent packages in the registry

随后,开发者(Github 用户名为 PatrickJS)在github中道歉并请求NPM官方下架投毒包,但是 NPM 官方仍未下架 everywhere 投毒包。

NPM投毒导致所有公开NPM包无法删除

类似的投毒事件


“no-one-left-behind”事件

2023年1月28日,名为 Zalastax 的NPM用户向NPM官方仓库中上传名为 no-one-left-behind 的NPM包,并创建了超过 33000 个以 nolb- 为前缀的子包并依赖所有的公开 NPM 包,由于严重影响NPM仓库最终被 NPM 安全团队下架。

“left-pad” 事

2018年,left-pad NPM包的作者 Azer 因个人情绪原因将包从 NPM 仓库中删除,影响了上千个依赖 left-pad 的NPM包(其中包含热门的 babel 和 react-native等)。下面为 left-pad NPM包源码:

module.exports = leftpad;function leftpad(str,len, ch){      str = String(str);      var i = -1;      ch || (ch = '  ');      len = len - str.length;            while(++i < len){          str = ch + str;       }}

如何避免受到影响

  1. 避免安装投毒组件;

  2. 建立投毒风险感知及检测能力;

  3. 使用 npm shrinkwrap 或 shrinkpack 管理依赖,避免版本无效等导致的构建失败问题。

参考链接

  • https://www.oscs1024.com/hd/MPS-4op5-lxys

  • Tweets by PatrickJS__

  • https://github.com/PatrickJS

  • https://www.npmjs.com/package/everything/

  • https://github.com/everything-registry/everything/issues/17

  • https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap

排查工具及投毒情报

墨菲安全提供产品可实时拦截针对开源组件的投毒


墨菲安全的私有源网关产品可对npm、pip、maven等中央仓库的投毒事件进行实时的检测和拦截,同时支持对高危漏洞实现基线管理,目前该产品已在蚂蚁、小米、中国电信、中国移动等数十家客户落地应用。


墨菲安全提供实时的开源组件投毒情报预警可订阅

墨菲安全0day漏洞及投毒情报覆盖最新的0day、1day及投毒情报预警,所有情报经过严格的安全专家研判,保障企业获取的第一手的高质量漏洞及投毒情报,更有比CVE漏洞库多25+额外的详细分析字段,目前该产品已在蚂蚁、美团、中国电信等数十家客户落地应用。


以上功能企业可通过以下方式申请试用

一、长按二维码申请:

NPM投毒导致所有公开NPM包无法删除

二、访问申请链接:

https://murphysec.feishu.cn/share/base/form/shrcny75AEBuEJpL8myuAKPfsPe

原文始发于微信公众号(墨菲安全实验室):NPM投毒导致所有公开NPM包无法删除

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月6日09:50:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   NPM投毒导致所有公开NPM包无法删除http://cn-sec.com/archives/2367745.html

发表评论

匿名网友 填写信息