概述
墨菲安全实验室监测发现,名为 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》元素,增加了些许调侃意味。
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组件包@everything-registry/chunk package.json代码
第三阶段
以 @everything-registry/chunk 为前缀的依赖包会分批安装所有公开的 NPM 组件包,以 @everything-registry/[email protected] 为例:
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 投毒包。
类似的投毒事件
“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;
}
}
如何避免受到影响
-
避免安装投毒组件;
-
建立投毒风险感知及检测能力;
-
使用 npm shrinkwrap 或 shrinkpack 管理依赖,避免版本无效等导致的构建失败问题。
参考链接
-
https://www.oscs1024.com/hd/MPS-4op5-lxys
-
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+额外的详细分析字段,目前该产品已在蚂蚁、美团、中国电信等数十家客户落地应用。
以上功能企业可通过以下方式申请试用
一、长按二维码申请:
二、访问申请链接:
https://murphysec.feishu.cn/share/base/form/shrcny75AEBuEJpL8myuAKPfsPe
原文始发于微信公众号(墨菲安全实验室):NPM投毒导致所有公开NPM包无法删除
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论