NPM 可以在安装之前显示软件包的使用期限吗?

wot*_*nii 9 security node.js npm npm-install

鉴于现有 npm 软件包中最近出现的恶意软件,我希望有一种机制可以让我在安装新软件包或更新现有软件包之前进行一些基本检查。我的主要问题是直接安装的软件包和间接安装的软件包。

一般来说,我想在安装之前获取 npm 将安装的软件包版本列表。更具体地说,我想要安装的软件包的年龄,因此如果其中任何一个软件包的年龄小于一天,我可以生成警告。

如果我可以直接使用 npm 来做到这一点,那就太好了,但恐怕我需要围绕它编写一些脚本。

具体用例:

如果我npm install react-native-gesture-handler在 2021 年 10 月 22 日执行,它将执行恶意版本的 ua-parser 的安装后挂钩,并且我的计算机将受到损害,这是我想避免的事情。

当我输入时npm install react-native-gesture-handler --dry-run,它只告诉我它将安装哪个版本的react-native-gesture-handler,但它不会告诉我它将安装当天发布的ua-parser版本。

补充笔记:

  • 我知道npm i --dry-run存在,但它只显示直接包。
  • 我知道npm list存在,但它只显示安装后的软件包(因此在安装挂钩已经造成伤害之后)
  • 两者都只显示软件包版本而不显示它们的年龄
  • 我不知道在安装之前如何获得安装挂钩附带的软件包列表
  • 欢迎提供处理恶意 npm 包的替代方法。
  • 到目前为止,我最好的解决方案是执行“--ignore-scripts”,但这会带来一系列问题

dee*_*s27 8

要找出恶意软件包,您需要一个脚本来根据国家漏洞数据库检查您的软件包是否存在漏洞

国家漏洞数据库包括安全检查表参考、安全相关软件缺陷、错误配置、产品名称和影响指标的数据库。

大多数软件公司都使用VeracodeSnykCheckmarx等应用程序安全工具,这些工具通常在 CICD 管道中部署之前的阶段执行此操作。

如果您想在本地实现此目标,您可以尝试

npm audit
Run Code Online (Sandbox Code Playgroud)

但这将根据默认注册表( nexus 或 artifactory 或 npm 注册表)审核项目中已安装的依赖项及其依赖项,并为您提供已知漏洞的列表以及可用补丁的版本详细信息。

npm view即使未安装该软件包,也会为您提供以下有关该软件包的详细信息。

在此输入图像描述

安装之前的版本检查需要一个脚本来在预安装时执行必要的操作,我建议有一个专门的项目用于安全检查(可重复用于所有项目),或者link然后 publish在您的项目脚本中进行配置,如下所示,

安全项目:

这将有脚本来检查漏洞、利用npm viewnpm version审核模块,然后返回结果。

主要项目:

在这里设置脚本以package.json使用上面发布的项目并在安装前检查漏洞。

npx security-project vulnerabilities


scripts: {
  vulnerability: npx security-project vulnerabilities
  preinstall: npx security-project vulnerabilities

  or

  preinstall: "sh ./checkVulnerabilities.sh" // this script can take package name through command line flags like --package axios
}
Run Code Online (Sandbox Code Playgroud)

Snyk将扫描package.json所有模块以查找安全漏洞。您还可以搜索特定模块并检查版本的运行状况评分。

https://snyk.io/advisor/check/npm

或者,您可以在 IDE 中使用Snyk 扩展来实现相同的目的。

我们有RetireJS chrome 扩展,用于扫描应用程序中存在漏洞的 JS 模块版本。

很好的参考:- 6 个可以用来检查 Node-js 漏洞的工具

以上是我能想到的一些想法,希望对你有帮助。


wot*_*nii 1

首先以安全的方式安装软件包,然后使用npm listnpm view来获取安装软件包的年龄。

选项 1:安装--ignore-scripts

npm i --ignore-scripts
npm list --depth=100 | awk '{ print $NF }'| tail -n +2 | grep -v "deduped" |  xargs -I {}  bash -c "npm view {} time.modified _id|tr '\n' ' ' && echo "|sort
Run Code Online (Sandbox Code Playgroud)

选项2:安装在docker中

docker run -v $PWD/package.json:/a/package.json -v $PWD/package-lock.json:/a/package-lock.json --rm -it node:lts-buster bash

cd a && npm i
npm list --depth=100 | awk '{ print $NF }'| tail -n +2 | grep -v "deduped" |  xargs -I {}  bash -c "npm view {} time.modified _id|tr '\n' ' ' && echo "|sort
Run Code Online (Sandbox Code Playgroud)

打印日期的脚本的解释:

  • npm list --depth=100获取已安装软件包的列表
  • | awk '{ print $NF }'从每一行中提取包的 id
  • | tail -n +2删除第一行,它指的是当前文件夹
  • | grep -v "deduped"删除涉及欺骗的行
  • | xargs -I {} bash -c为每一行打开子shell
  • npm view {} time.modified _id获取时间和包裹 ID
  • |tr '\n' ' ' && echo 删除 time 和 id 之间的换行符,并在末尾添加换行符
  • |sort按字母顺序对行进行排序

注意:由于npm view通过网络一次获取 1 个包,因此该脚本每个安装的包大约需要 1 秒,对于中型项目来说,这将增加几分钟的时间。