NPM 审计修复:修复 NPM 依赖项漏洞
TLDR;
- 运行该
npm audit命令 - 向下滚动直到找到分隔两个问题的文字行。
- 手动运行文本中给出的命令,一次升级一个软件包,例如
npm i --save-dev jest@24.8.0 - 升级软件包后,请务必在升级下一个软件包之前检查是否存在重大更改。
- 避免跑步
npm audit fix --force
漏洞
有时在安装项目依赖项后,npm i您会遇到来自NPM的错误,其内容大致如下:
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low │ Regular Expression Denial of Service │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ braces │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ jest [dev] │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ jest > jest-cli > micromatch > braces │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://nodesecurity.io/advisories/786 │
└───────────────┴──────────────────────────────────────────────────────────────┘
found 62 low severity vulnerabilities in 20610 scanned packages
62 vulnerabilities require semver-major dependency updates.
这实际上是一个典型的漏洞警告的极小示例。正如您从漏洞下方的文本中看到的,它说:
found 62 low severity vulnerabilities in 20610 scanned packages
62 vulnerabilities require semver-major dependency updates.
这意味着此示例还将存在另外 61 个漏洞,其严重程度从low到high不等,其中漏洞最为危险。有关这些漏洞的更多信息,警告部分还提供了指向NPM漏洞页面high的链接。More Info
一开始,如何正确修复这些漏洞可能会让人感到困惑。NPM实际上提供了一个内置服务,本应自动修复这些问题,但我发现它很少奏效,而且几乎不会留下任何漏洞。事实上,以下是我运行该命令后发生的情况示例。npm audit fixnpm audit fix
fixed 0 of 62 vulnerabilities in 20610 scanned packages
1 package update for 62 vulns involved breaking changes
(use `npm audit fix --force` to install breaking changes; or refer to `npm audit` for steps to fix these manually)
NPM允许我们使用该--force标志,npm audit fix --force但即使是NPM也会警告你不要使用此标志。
user@group:~/npm_project$ npm audit fix --force
npm WARN using --force I sure hope you know what you are doing.
那我们该怎么办?如果我们的包管理器无法修复这些漏洞,那我们肯定就束手无策了,只能想办法带着这些漏洞生存下去,希望没有人会利用它们攻击我们的项目。
修复方案
请使用 NPM 建议的命令手动逐个升级软件包,而不是运行该npm audit fix --force命令。例如npm install --save-dev jest@24.8.0:
首先,我想说,对于之前遇到过类似问题的人来说,这可能显而易见。我第一次看到这些警告时,它们堆积如山,而我作为一个懒惰的开发者,甚至懒得仔细查看。
如果你继续在控制台中向上滚动到第一个问题,你就会找到解决方法,而且正如你所料,解决方法很简单,只需更新导致问题的软件包即可。
user@group:~/npm_project$ npm audit --fix
=== npm audit security report ===
# Run npm install --save-dev jest@24.8.0 to resolve 62 vulnerabilities
SEMVER WARNING: Recommended action is a potentially breaking change
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low │ Regular Expression Denial of Service │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ braces │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ jest [dev] │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ jest > jest-cli > jest-config > babel-jest > │
│ │ babel-plugin-istanbul > test-exclude > micromatch > braces │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://nodesecurity.io/advisories/786 │
└───────────────┴──────────────────────────────────────────────────────────────┘
... 61 more vulerabilities ...
在漏洞问题之前,您会注意到一段文本# Run npm install --save-dev jest@24.8.0 to resolve 62 vulnerabilities,这正是我们要找的内容。您可能还会注意到下一行写着…… SEMVER WARNING: Recommended action is a potentially breaking change。手动运行此命令而不是使用默认npm audit fix --force命令,可以让我们准确地知道正在更新哪些软件包。这对于更新这些软件包会导致重大变更的情况非常有用。
概括
所以最终,手动升级存在漏洞的软件包并运行命令npm audit fix --force会得到相同的结果。唯一的区别在于,手动升级软件包允许我们每次只升级一个软件包,测试是否存在破坏性变更,然后再更新下一个软件包,而不是一次性升级所有软件包,发现破坏性变更后却不知道是哪个软件包导致了问题。