基本上,如果安装未在沙箱中运行,那么当您npm install my-malicious-package
时,什么可以阻止我发布带有任意安装脚本的 NPM 模块,该模块会从您的计算机中窃取所有内容?
在 this article他们建议大多数攻击者将其恶意脚本放置在 pre/post
install
Hook 中。这很容易检测和过滤掉。我最关心的是可以运行任意程序的包的实际安装。
最佳答案
没有什么可以阻止这些脚本以当前用户身份执行任何操作。您需要避免运行安装脚本。
大多数恶意软件包都在使用这些软件包,但在极少数情况下(例如最近的 lofygang),软件包的功能中也可能携带恶意代码。
如何保护项目免受恶意软件包的侵害
- 确保不要运行生命周期(安装后)脚本,除非它们是已知且必要的(请参阅我的 talk on this topic )
- 将 3rdparty 代码放在一个隔间中,锁定环境,决定将哪些强大的 API 传递给每个包。
第二步需要使用 Compartment,这是 TC39 https://github.com/tc39/proposal-compartments/ 中的一个正在进行的工作。
但是存在垫片。一些工具是建立在该垫片之上的。
您可以使用SES-shim直接并实现您自己的控件,或使用 LavaMoat 的便利
LavaMoat允许您生成和调整每个包的策略,您可以在其中决定它应该有权访问哪些全局变量和内置函数。 LavaMoat 还提供了一个管理安装脚本的工具。
这是我的 talk on SES and LavaMoat最后有一个演示。
如何设置 LavaMoat
请参阅 LavaMoat 文档了解更多详细信息
- 通过@lavamoat/allow-scripts禁用/允许依赖生命周期脚本(例如“postinstall”)
npm i --ignore-scripts -D @lavamoat/allow-scripts
npx --no-install allow-scripts setup
npx --no-install allow-scripts auto
- 然后,编辑 package.json 中的允许列表
- 每次安装/重新安装后运行
allow-scripts
- 在 lavamoat-node 中运行您的服务器或构建进程
npm i -D lavamoat
在你的package.json中添加如下内容:
"scripts": {
"lavamoat-policy": "lavamoat app.js --autopolicy",
"start": "lavamoat app.js"
- 每次更改依赖关系树时运行 lavamoat-policy 并查看策略(另请参阅:策略覆盖)
- 运行
npm start
启动您的应用
Disclaimer: I contribute to LavaMoat and Endo. They are Open Source projects on permissive licenses.
关于security - NPM 安装是否在沙箱中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45846172/