阅读(1867) (8)

npm 审计 audit

2021-09-06 11:14:36 更新

运行安全审计

概要

npm audit [--json|--parseable]
npm audit fix [--force|--package-lock-only|--dry-run|--production|--only=dev]

描述

审计命令将项目中配置的依赖项的描述提交到默认注册表,并要求提供已知漏洞的报告。如果发现任何漏洞,则将计算影响和适当的补救措施。如果fix提供了参数,则补救措施将应用于包树。

如果未发现漏洞,该命令符将以0退出代码。

请注意,某些漏洞无法自动修复,需要人工干预或审查。

另请注意,由于npm audit修复程序在后台下运行一个完整的npm install,因此适用于安装程序的所有配置也将适用于npm install。因此就像npm audit fix --package-lock-only只会按预期工作。

默认情况下,如果发现任何漏洞,审计命令将以非零代码退出。在 CI 环境中包含--audit-level参数以指定导致命令失败的最低漏洞级别可能很有用。此选项不过滤报告输出,它只是更改命令的失败阈值。

审计端点

npm 可以使用两个审计端点来获取漏洞信息:Bulk Advusirt=yQucik Audit 端点。

批量咨询端点

从版本 7 开始,npm 使用更快的Bulk Advisory端点来优化计算审计结果的速度。

npm 将生成一个 JSON 负载,其中包含树中每个包的名称和版本列表,并将其 POST 到路径/-/npm/v1/security/advisories/bulk处的默认配置注册表。

树中任何在 package.json 文件中没有version字段的包都将被忽略。如果指定了任意的--omit选项(通过--omit配置或速记之一,例如 --production--only=dev等),则将根据需要从提交的有效负载中省略包。

如果注册中心以错误或无效响应作为响应,则 npm 将尝试从Quick Audit端点加载咨询数据。

预期结果将包含与建议范围匹配的每个依赖项的一组建议对象。每个咨询对象包含nameurlidseverityvulnerable_versions,和title

然后 npm 使用这些咨询对象来计算树中依赖项的漏洞和元漏洞。

快速审计端点

如果Bulk Advisory端点返回错误或无效数据,npm 将尝试从Quick Audit端点加载建议数据,这在大多数情况下要慢得多。 package-lock.json提交了在中找到的完整包树,以及以下附加元数据:

  • npm_version
  • node_version
  • platform
  • arch
  • node_env

树中的所有包都提交到 Quick Audit 端点。生成报告时会跳过省略的依赖项类型。

清除

出于谨慎考虑,如果包名包含/字符,npm 版本 5 和 6 会从提交的报告中“清除”任何包,以避免泄露潜在私有包或 git URL 的名称。

然而,在实践中,这导致审计经常无法正确检测元漏洞,因为树会因缺少依赖项而显得无效,并阻止检测使用 git 依赖项或私有模块的包树中的漏洞。

从版本 7 开始,此清理已从 npm 中删除。

计算元漏洞和补救措施

npm 使用该 @npmcli/metavuln-calculator 模块将一组安全公告转换为一组“漏洞”对象。“元漏洞”是由于依赖于易受攻击包的易受攻击版本而易受攻击的依赖项。

例如,如果包foo在 范围内易受攻击>=1.0.2 <2.0.0,并且包bar依赖于foo@^1.1.0,则bar只能通过安装易受攻击版本的 来安装该版本foo。在这种情况下,bar是一个“元漏洞”。

一旦计算了给定包的元漏洞,它们就会被缓存在~/.npm文件夹中,并且只有在建议范围发生变化或包的新版本发布时才会重新评估(在这种情况下,新版本也会检查元漏洞状态) )。

如果元漏洞链一直延伸到根项目,并且在不更改其依赖范围的情况下无法更新,npm audit fix则将需要--force应用修复的选项。如果补救措施不需要更改依赖范围,那么所有易受攻击的软件包都将更新为没有针对其发布建议或元漏洞的版本。

退出代码

npm audit如果未发现漏洞,该命令将以 0 退出代码退出。npm audit fix如果未发现漏洞或修复能够成功修复所有漏洞,则该命令将以 0 退出代码退出。

如果发现漏洞,退出代码将取决于 audit-level配置设置。

例子

扫描你的项目中是否存在漏洞,并自定为易受攻击的依赖项安装任何兼容更新:

$ npm audit fix

audit fix不修改的情况下运行node_modules,但仍更新 pkglock:

$ npm audit fix --package-lock-only

跳过更新devDependencies

$ npm audit fix --only=prod

audit fix为顶级依赖项安装 semver-major 更新,而不仅仅是与 semver 兼容的更新:

$ npm audit fix --force

不要运行得到一个什么样的想法干audit fix就行了,还输出安装在JSON格式的信息:

$ npm audit fix --dry-run --json

扫描你的项目是否存在漏洞并仅显示详细信息,无需修复任何内容:

$ npm audit

获取 JSON 格式的详细审计报告:

$ npm audit --json

以纯文本结果获取详细的审计报告,由制表符分隔,允许将来在脚本或命令行后处理中重用,例如,选择一些打印的列:

$ npm audit --parseable

要解析列,你可以使用 example awk,然后打印其中的一些:

$ npm audit --parseable | awk -F $'\t' '{print $1,$4}'

配置

audit-level 审计级别

  • 默认值:null
  • 类型:null,"info",'low","moderate","high","critical",or"none

npm audit以非零退出代码退出的最低漏洞级别。

dry-run 试运行

  • 默认值:false
  • 类型:Boolean

表示你不希望 npm 进行任何更改并且它应该只报告它会做的事情。这可以被传递到任何修改本地安装,例如,命令的installupdate, dedupeuninstall,以及packpublish

注意:这不是由其他网络相关的命令,如兑现dist-tags, owner等等。

force 强制

  • 默认值:false
  • 类型:Boolean

删除各种针对不幸副作用、常见错误、不必要的性能下降和恶意输入的保护措施。

  • 允许在全局安装中破坏非 npm 文件。
  • 允许npm version命令在不干净的 git 存储库上工作。
  • 允许删除缓存文件夹npm cache clean
  • 允许安装engines声明要求不同版本的 npm 的包。
  • 允许安装engines声明要求不同版本 的包node,即使--engine-strict已启用。
  • 允许npm audit fix在你声明的依赖范围之外安装模块(包括 SemVer 主要更改)。
  • 允许取消发布已发布包的所有版本。
  • 允许在根项目中安装冲突的 peerDependencies。--yes期间隐式设置npm init
  • 允许破坏现有值 npm pkg

如果你不清楚自己要做什么,强烈建议你不要使用此选项!

json

  • 默认值:false
  • 类型:Boolean

是否输出JSON数据,而不是正常输出。

  • npm pkg set它允许在将设置值保存到您的package.json.并非所有 npm 命令都支持。

package-lock-only 包的唯一锁

  • 默认值:false
  • 类型:Boolean

如果设置为 true,当前操作将只使用package-lock.json,忽略node_modules

因为update这意味着只会package-lock.json更新,而不是检查node_modules和下载依赖项。

对于list这个装置的输出将根据由所描述的树 package-lock.json,而不是内容node_modules

omit 省略

  • 默认值:如果NODE_ENV环境变量设置为production,则为dev,否则为空。
  • 类型:devoptionalpeer(可多次设置)

要从磁盘上的安装树中省略的依赖项类型。

请注意,这些依赖的仍然解决,加入 package-lock.jsonnpm-shrinkwrap.json文件。它们只是没有物理安装在磁盘上。

如果包类型同时出现在--include--omit列表中,则它将被包括在内。

如果生成的省略列表包含'dev',则NODE_ENV环境变量将被设置'production'为所有生命周期脚本。

workspace 工作区

  • 默认:
  • 类型:String(可多次设置)

允许在当前项目的已配置工作区的上下文中运行命令,同时通过仅运行此配置选项定义的工作区进行过滤。 workspace配置的有效值为:

  • 工作区名称
  • 工作区目录的路径
  • 父工作区目录的路径(将导致选择所有嵌套工作区)

为该npm init命令设置时,可以将其设置为尚不存在的工作区的文件夹,以创建该文件夹并将其设置为项目中的全新工作区。

此值不会导出到子进程的环境中。

workspaces 工作区

  • 默认值:false
  • 类型:Boolean

启用在所有已配置工作区的上下文中运行命令。

此值不会导出到子进程的环境中。