修复 NPM 漏洞

7

我正在跟随一个TypeScript教程。
不幸的是,这些包已经过时了,我收到了有关漏洞的警告。

我遵循了npm检查并在需要时更新软件包的一堆建议:

npm audit fix
npm audit fix --force
npm update

npm audit 表示仍然存在 24 个漏洞。 但以上命令均无法修复。

npm outdated 不会输出任何结果。

这些有漏洞的包是:

ansi-regex
glob-parent
node-forge
nth-check
postcss

我其实不知道它们为什么会成为我的项目的一部分。
我在package.json配置中没有它们。

修复这些漏洞的下一步是什么?

以下是我尝试过的。

你可以在一个空目录下运行以下的 package.jsonnpm install 来复现我的最新状态。
{
  "name": "pacman",
  "version": "0.0.1",
  "description": "I just follow a tutorial. Nothing of interest.",
  "keywords": ["game"],
  "license": "MIT",
  "author": "someone stupid",
  "scripts": {
    "build": "parcel build index.html",
    "dev": "parcel index.html --open",
    "start": "npm run build && npm run dev",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^5.16.0",
    "@typescript-eslint/parser": "^5.16.0",
    "ansi-regex": "^6.0.1",
    "eslint": "^8.12.0",
    "eslint-config-prettier": "^8.5.0",
    "eslint-plugin-prettier": "^4.0.0",
    "glob-parent": "^6.0.2",
    "node-forge": "^1.3.0",
    "nth-check": "^2.0.1",
    "parcel": "^2.4.0",
    "parcel-bundler": "^1.12.5",
    "postcss": "^8.4.12",
    "prettier": "^2.6.1",
    "typescript": "^4.6.3"
  },
  "dependencies": {
    "npm": "^8.5.5"
  }
}

在撰写本文时,运行npm版本8.5.5,这应该会给您带来24个漏洞,其中18个是中等级别的,6个是高级别的。


1
我们需要一个[mre]。别人如何在本地重现这个问题?你可以在一个空目录中放入最少的内容,以便npm audit重新创建(可能是其中之一)有漏洞的依赖项上的警告。但如果你只是在跟着教程走(或者它们是开发依赖项),那么这些警告真的很重要吗? - jonrsharpe
@jonrsharpe:也许我可以忽略警告通过教程。只是我不喜欢漏洞,而且在我看来,学习的一部分应该是知道如何解决它们。我已经写了一个答案。我那里做的有意义吗? - Thomas Weller
1
无论如何,这是可以复现的... npm init -y && npm i parcel-bundler@1 -> 24 vulnerabilities (19 moderate, 5 high)。或者例如在您发布的内容上执行 npm ls node-forge,如上所建议,将显示尽管直接依赖于 1.3.0,但通过 parcel-bundler,您具有对 0.10.0 的传递依赖。 - jonrsharpe
我只是跟着教程做的。 你能告诉我你在跟随哪个教程吗?我问这个问题的主要原因是,你已经将 ansi-regex、glob-parent、node-forge、nth-check 和 postcss 这些包作为直接依赖添加到了原始的 package.json 中。 parcelparcel-bundler 这两个直接依赖是否包含在原始的 package.json 中?还是你后来添加的? - Henke
1
@Henke:这是一个吃豆人教程,但我不记得是哪一个了。我没有链接了。从项目的提交历史中可以看到,第一次提交就包含了修复的软件包。似乎我从来没有提交过有问题的版本。 - Thomas Weller
显示剩余4条评论
4个回答

3
根据评论,我已经尝试了所有通用命令,在这种情况下,您需要开始分析单个软件包。
那么,我做了什么?
1.将所有依赖项更新到最新版本。
接下来,通过删除一半的依赖项并重复以下步骤执行二进制搜索
2.删除 node_modules 文件夹 3.运行 npm install 4.运行 npm audit 检查漏洞
如果没有漏洞,则添加您要安装的剩余软件包的一半。
如果存在漏洞,请删除当前正在安装的一半软件包。
在我的案例中,此过程归结为以下两行:
"parcel": "^2.4.0",
"parcel-bundler": "^1.12.5",

对于 parcel-bundler,NPM 报出了一个警告:
npm WARN deprecated parcel-bundler@1.12.5: Parcel v1 is no longer maintained. 
Please migrate to v2, which is published under the 'parcel' package.

所以我想我根本不需要parcel-bundler,因为它已经集成到了parcel包中,而我之前已经更新到了版本2。


1

尝试使用以下命令更新所有npm。这对我很有帮助。

npm install -g npm@latest

1
OP尝试了这个方法,但没有使用全局标签。这样会有什么区别吗? - Fiehra

0
您自己的答案中所提到的,parcel-bundler包已被弃用:

Parcel v1不再维护。请迁移到v2版本,该版本发布在'parcel'包下。

The parcel-bundler package is deprecated.

实际上,npm包的名称已经从"parcel-bundler"更改为"parcel"。在同一个package.json文件中同时存在这两个包意味着有两个完全相同的包的不同版本,因此在这种情况下,"deprecated"这个词有些误导。
重新现您的发现 - 我们能相信审计报告吗?
感谢您在问题中包含了package.json文件。这样做可以使我们能够重新现您的发现。
  1. 我运行了"npm install npm@latest -g",然后运行"npm --version",得到的回应是"10.2.3"。
  2. 在一个空目录中,我添加了一个版本的您的package.json文件,然后运行"npm install"。1

package.json :

{
  "name": "soq-71635274-fix-npm",
  "license": "MIT",
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^5.16.0",
    "@typescript-eslint/parser": "^5.16.0",
    "eslint": "^8.12.0",
    "eslint-config-prettier": "^8.5.0",
    "eslint-plugin-prettier": "^4.0.0",
    "parcel": "^2.4.0",
    "parcel-bundler": "^1.12.5",
    "prettier": "^2.6.1",
    "typescript": "^4.6.3"
  }
}

为了确保我拥有所有软件包的最新版本,我接着运行 `npx npm-check-updates`,然后是 `npx npm-check-updates -u` 和 `npm install`。响应显示有 `59个漏洞(47个中等,12个高危)`,并建议运行 `npm audit` 以获取详细信息。
接下来我运行 `npm audit`。这是生成的 npm 审计安全报告的开头。

Start of npm audit security report, at first.

# npm audit report
glob-parent  <5.1.2
Severity: high
…
  • 由于parcel-bundler已经过时,我将其从package.json中移除。
    但是运行npm install并没有给出一个干净的报告。
    它仍然显示有11个中等严重性漏洞

  • 运行npm audit fix既不会改变package.json,也不会改变package-lock.json

  • 运行npm audit fix --force 一次会将package.json中的parcel^2.10.2降级到^1.12.4
    package-lock.json的大小从255 kB增加到477 kB。

  • 运行npm audit fix --force 两次(第二次)会将package.json中的parcel^1.12.4重新升级到^2.10.2
    它将package-lock.json的大小从477 kB减小到184 kB。2

  • 这也导致了发现0个漏洞

    Finally, 'found 0 vulnerabilities'

    我觉得这很了不起。 修复所有漏洞并运行npm install还不足以获得一个干净的报告。 你还需要运行npm audit fix --force 两次3

    参考资料


    自从您将ansi-regexglob-parentnode-forgenth-checkpostcss作为直接的开发依赖项添加到package.json中,我决定通过从package.json中删除它们来撤销这个操作。
    我还删除了对npm@^8.5.5的依赖,我认为这是因为您运行了npm i npm@latest,这会在本地安装npm
    相比之下,我总是只在全局安装npmnpm i npm --global
    在运行npm audit fix --force之前和之后的package-lock.json唯一的区别是删除了许多包。
    我认为被删除的是parcel-bundler依赖的包。因此,仅仅运行npm install并不能删除这些包。
    第三次运行npm audit fix --force不再改变package.jsonpackage-lock.json
    似乎一旦达到了“0个漏洞”的状态,npm audit fix --force命令就不会再引起任何更改。
    这是有道理的。

    -1

    这个答案是正确的。

    重现你的发现

    感谢在你的问题中包含了package.json
    通过这样做,任何人都可以重现你的发现

    我运行了npm install npm@latest -g, 然后运行了npm --version,响应为9.6.3

    在一个空目录中,我添加了一个剥离版本的你的 package.json,然后运行了npm install1

    我使用的package.json

    {
      "license": "MIT",
      "devDependencies": {
        "@typescript-eslint/eslint-plugin": "^5.16.0",
        "@typescript-eslint/parser": "^5.16.0",
        "eslint": "^8.12.0",
        "eslint-config-prettier": "^8.5.0",
        "eslint-plugin-prettier": "^4.0.0",
        "parcel": "^2.4.0",
        "parcel-bundler": "^1.12.5",
        "prettier": "^2.6.1",
        "typescript": "^4.6.3"
      }
    }
    

    响应显示29个漏洞(15个中等,14个高危)

    这是运行npm audit后生成的NPM审计安全报告的开头。

    Start of NPM audit security report, at first

    # npm audit report
    glob-parent  <5.1.2
    Severity: high
    …
    

    正如您在自我回答中所指出的那样, parcel-bundler已被弃用
    后一个链接包含了一个 解释如何迁移的链接

    正如您已经得出的结论,建议的操作是简单地删除 parcel-bundler包。 当我这样做并再次运行npm install时,我得到了 9个中等严重性漏洞

    现在,这里有一个不太好看的技巧。
    我通过运行npm install npm@8.0.0 --global 2
    将npm本身的版本降级,然后再通过运行npm install npm --global将其升级回来。

    这导致了发现0个漏洞

    Finally, 'found 0 vulnerabilities'

    参考资料


    1 由于您添加了包ansi-regexglob-parentnode-forgenth-checkpostcss作为直接devDependencies,我决定通过将它们从package.json中删除来撤销这一操作。
    我还删除了对npm@^8.5.5的依赖,我认为这是因为您运行了npm i npm@latest,安装了npm 本地。相比之下,我总是只全局安装npmnpm i npm@latest --global

    2 似乎任何8.x.x版本都可以。版本8.0.0易于记忆。
    不幸的是,我无法解释为什么这个技巧会奏效。 我碰巧发现它确实有效。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接