NPM 可以在安装包之前显示包的使用年限吗?
Can NPM show me the age of packages before installing them?
鉴于现有 npm 包中的最新恶意软件,我希望有一种机制可以让我在安装新包或更新现有包之前进行一些基本检查。我的主要问题是我直接安装的包和我间接安装的包。
一般来说,我想在安装之前获取 npm 将安装的包版本列表。更具体地说,我想要将要安装的软件包的使用期限,因此如果其中任何一个不到一天,我可以生成警告。
如果我可以直接用 npm 做那件事,那就太好了,但恐怕我需要围绕它编写一些脚本。
具体用例:
如果我在 2021 年 10 月 22 日执行 npm install react-native-gesture-handler
,它会执行恶意版本 ua-parser 的 post-install 挂钩,我的计算机就会受到损害,这是我想避免的事情。
当我输入npm install react-native-gesture-handler --dry-run
时,它只告诉我它会安装哪个版本的react-native-gesture-handler,但不会告诉我它会安装一个版本的ua-parser当天发布。
补充说明:
- 我知道
npm i --dry-run
存在,但它只显示直接包。
- 我知道
npm list
存在,但它只在安装后显示包(因此在安装挂钩已经造成伤害之后)
- 两者都只显示包版本而不是它们的年龄
- 我不知道如何在安装之前获得安装挂钩附带的软件包列表
- 欢迎指出处理恶意 npm 包的替代方法。
- 到目前为止,我最好的解决方案是执行“--ignore-scripts”,但这会带来一系列问题
要找出恶意包,您需要一个脚本来检查您的包是否存在针对 national vulnerabilities database
的漏洞
国家漏洞数据库包括安全检查表参考、安全相关软件缺陷、错误配置、产品名称和影响指标的数据库。
大多数软件公司都使用应用程序安全工具,例如 Veracode、Snyk 或 Checkmarx通常在 CICD 管道中部署之前的阶段执行此操作。
如果您希望在本地实现这一点,您可以尝试
npm audit
但是这将根据默认注册表审核已安装依赖项和还它在项目中的子依赖项(nexus 或 artifactory 或 npm registry) 并为您提供已知漏洞列表以及补丁可用的版本详细信息。
即使 未安装 .[=26=,npm view
也会为您提供有关该软件包的以下详细信息]
version checks before installing would need a script to do the necessary at preinstall, I would suggest to
have a dedicated project for security checks (reusable for all projects), and link
or
publish
it then configure that in your project scripts like
below,
安全项目:
这将有脚本来检查漏洞,利用 npm view
或 npm version
并审核模块,然后 return 结果。
主要项目:
在这里设置 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
}
Snyk 获取您的 package.json
并将扫描所有模块以查找安全漏洞。您还可以搜索特定模块并检查版本的健康评分。
https://snyk.io/advisor/check/npm
或者,您可以在 IDE 中使用 Snyk extension 来实现同样的效果。
我们有 RetireJS chrome extension 用于扫描应用程序中存在漏洞的易受攻击的 JS 模块版本。
很好的参考:- 6-tools-you-can-use-to-check-for-vulnerabilities-in-node-js
以上是我能想到的想法,希望对你有帮助。
首先以安全的方式安装包,然后使用npm list
和npm 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
选项 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
打印日期的脚本说明:
npm list --depth=100
获取已安装包列表
| awk '{ print $NF }'
从每一行提取包的id
| tail -n +2
删除第一行,它指的是当前文件夹
| grep -v "deduped"
删除引用欺骗的行
| xargs -I {} bash -c
为每一行打开 subshell
npm view {} time.modified _id
获取时间和 package-id
|tr '\n' ' ' && echo
去掉time和id之间的换行符,在末尾添加换行符
|sort
按字母顺序排列行
注意:由于npm view
一次通过网络获取1个包,所以脚本安装每个包大约需要1秒,对于中型项目来说,这将增加几分钟。
我找到了另一个解决方案。我可以使用 renovate 代替直接使用 npm 更新,它有一个“stabilityDays”选项:
If this is set to a non-zero value, and an update has a release timestamp header, then Renovate will check if the "stability days" have passed.
https://docs.renovatebot.com/configuration-options/#stabilitydays
鉴于现有 npm 包中的最新恶意软件,我希望有一种机制可以让我在安装新包或更新现有包之前进行一些基本检查。我的主要问题是我直接安装的包和我间接安装的包。
一般来说,我想在安装之前获取 npm 将安装的包版本列表。更具体地说,我想要将要安装的软件包的使用期限,因此如果其中任何一个不到一天,我可以生成警告。
如果我可以直接用 npm 做那件事,那就太好了,但恐怕我需要围绕它编写一些脚本。
具体用例:
如果我在 2021 年 10 月 22 日执行 npm install react-native-gesture-handler
,它会执行恶意版本 ua-parser 的 post-install 挂钩,我的计算机就会受到损害,这是我想避免的事情。
当我输入npm install react-native-gesture-handler --dry-run
时,它只告诉我它会安装哪个版本的react-native-gesture-handler,但不会告诉我它会安装一个版本的ua-parser当天发布。
补充说明:
- 我知道
npm i --dry-run
存在,但它只显示直接包。 - 我知道
npm list
存在,但它只在安装后显示包(因此在安装挂钩已经造成伤害之后) - 两者都只显示包版本而不是它们的年龄
- 我不知道如何在安装之前获得安装挂钩附带的软件包列表
- 欢迎指出处理恶意 npm 包的替代方法。
- 到目前为止,我最好的解决方案是执行“--ignore-scripts”,但这会带来一系列问题
要找出恶意包,您需要一个脚本来检查您的包是否存在针对 national vulnerabilities database
的漏洞国家漏洞数据库包括安全检查表参考、安全相关软件缺陷、错误配置、产品名称和影响指标的数据库。
大多数软件公司都使用应用程序安全工具,例如 Veracode、Snyk 或 Checkmarx通常在 CICD 管道中部署之前的阶段执行此操作。
如果您希望在本地实现这一点,您可以尝试
npm audit
但是这将根据默认注册表审核已安装依赖项和还它在项目中的子依赖项(nexus 或 artifactory 或 npm registry) 并为您提供已知漏洞列表以及补丁可用的版本详细信息。
即使 未安装 .[=26=,npm view
也会为您提供有关该软件包的以下详细信息]
version checks before installing would need a script to do the necessary at preinstall, I would suggest to have a dedicated project for security checks (reusable for all projects), and
link
orpublish
it then configure that in your project scripts like below,
安全项目:
这将有脚本来检查漏洞,利用 npm view
或 npm version
并审核模块,然后 return 结果。
主要项目:
在这里设置 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
}
Snyk 获取您的 package.json
并将扫描所有模块以查找安全漏洞。您还可以搜索特定模块并检查版本的健康评分。
https://snyk.io/advisor/check/npm
或者,您可以在 IDE 中使用 Snyk extension 来实现同样的效果。
我们有 RetireJS chrome extension 用于扫描应用程序中存在漏洞的易受攻击的 JS 模块版本。
很好的参考:- 6-tools-you-can-use-to-check-for-vulnerabilities-in-node-js
以上是我能想到的想法,希望对你有帮助。
首先以安全的方式安装包,然后使用npm list
和npm 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
选项 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
打印日期的脚本说明:
npm list --depth=100
获取已安装包列表| awk '{ print $NF }'
从每一行提取包的id| tail -n +2
删除第一行,它指的是当前文件夹| grep -v "deduped"
删除引用欺骗的行| xargs -I {} bash -c
为每一行打开 subshellnpm view {} time.modified _id
获取时间和 package-id|tr '\n' ' ' && echo
去掉time和id之间的换行符,在末尾添加换行符|sort
按字母顺序排列行
注意:由于npm view
一次通过网络获取1个包,所以脚本安装每个包大约需要1秒,对于中型项目来说,这将增加几分钟。
我找到了另一个解决方案。我可以使用 renovate 代替直接使用 npm 更新,它有一个“stabilityDays”选项:
If this is set to a non-zero value, and an update has a release timestamp header, then Renovate will check if the "stability days" have passed.
https://docs.renovatebot.com/configuration-options/#stabilitydays