我该如何修复在我的 package-lock.json 中存在的一个未在 package.json 中列出的易受攻击的 npm 包?

170
Github 提醒我,我 package-lock.json 文件中的某一依赖存在漏洞且版本过旧。问题是,无论我执行 `npm install` 还是 `npm update`,它们都无法更新 package-lock.json 文件中的该依赖项。
我已经搜索了很多东西,并删除了该文件并执行了 `npm install`,但问题仍然存在。请问有人能够帮助解决这个问题吗?有问题的软件包是 Hoek,但实际上我没有在我的 package.json 文件中列出它。

7
尝试删除你的 package-lock.json 文件,然后再次运行 npm install。 - Rishikesh Dhokare
1
您可以检查您的依赖关系,找出哪个依赖于hoek并更新它。(但是您也可能运气不佳,该依赖项没有更新的版本。) - Roland Starke
我建议与@RishikeshDhokare相同。 - Idemax
1
我按照@RishikeshDhokare所说的做了。问题已经解决了。 - melih sahin
正如Rishikesh Dhokare所指出的那样,删除我的package-lock.json文件并重新安装所有软件包解决了问题。不确定为什么,但是,哇,这是一个令人沮丧的问题。 - ScottWelker
10个回答

77

看起来Hoek是你其中一个依赖项的依赖(也就是说,你在package.json中有一个包要求从它自己的package.json中使用它)。

你已经尝试过删除/重新安装和更新你的项目依赖项,但似乎问题所在的包依赖项指定了一个明确的或最大版本。

如果不查看每个依赖项的package.json,很难进一步建议如何强制更新。

编辑: 为帮助您识别哪些包正在使用哪些依赖项,您可以使用NPM的ls命令:https://docs.npmjs.com/cli/ls

例如,要查看哪些包正在使用Hoek: npm ls hoek

编辑2: 正如Ulysse BN正确指出的那样,如果您使用的是NPM 6或更高版本,则可以使用npm audit fix来请求NPM为您尝试修复漏洞。

编辑3: 阅读本文的人还应该查看下面JBallin的答案。它扩展了我在此处提供的信息,并且是(在我看来)一个更结构化的答案,更好地解答了OP的问题。但是,如果您想要快速修复,这个答案就足够了。


4
我遇到了一个类似的问题,但是是针对另一个包(Growl)。我猜测可能是我 package.json 中的某个依赖项依赖于特定(有漏洞)版本的 Growl。你的答案已经朝着正确方向,如果你能分享一个命令,可以显示 package-lock.json 中哪些包依赖了存在漏洞的包,那么你或许就能解决这个问题。 - Fuhrmanator
请查看更新的答案。如果需要额外的帮助,请创建一个新问题。 :) - Alex Mulchinock
谢谢。完成:https://stackoverflow.com/questions/50764225/find-source-in-package-json-of-vulnerability-in-package-lock-json - Fuhrmanator
您确定需要再提出一个问题吗?它们看起来是重复的。 - JBallin
@JBallin 我的回答已经更新了多次。最初可能不符合重复要求。 - Alex Mulchinock
太好了。感谢您的支持。 - Marcus Hiles

49

TLDR: 使用 npm i $PARENT_PKG_NAME 更新父级包。


注意

在更新依赖项时,应查看 CHANGELOG 是否有任何重大更改。

诊断

npm audit 将显示脆弱的软件包(请注意,您需要一个 package-lock.json 文件才能进行此操作,因此您需要运行 npm i),以及它所依赖的软件包(如果适用)。请注意,您也可以使用 npm ls $CHILD_PKG_NAME 来查看其父级依赖项。

快速修复尝试

尝试 npm audit fixnpm audit fix --force,但有时需要手动修复(请参见下文)。

手动修复

很可能父级软件包已经解决了他们的依赖关系(您可以通过访问他们的 GitHub 并查看最近的提交 - 或者仅仅看看这是否解决了问题),因此您可以只需运行 npm i $PARENT_PKG_NAME @$NEW_VERSION 即可更新您的 package-lock.json。

如果父级没有解决漏洞

如果维护者似乎不响应,您可以考虑使用达到相同目的的替代软件包或 fork 该软件包并自己更新漏洞。

验证修复

你现在可以通过运行npm audit来验证它是否有效,确保没有漏洞显示出来。提交你的更改,将它们推送到 GitHub,刷新您的通知/警报,然后它们应该消失!


如果像我这种情况,快速修复和此答案中的手动方法都不起作用,因为父框架在更新中完全更改了API并且甚至摆脱了该库,那怎么办呢?这是因为父框架仍然使用旧库。实际上,旧库仍在维护,但没有更新,我的意思是我该如何继续进行? - Carmine Tambascia
1
如果您正在使用的软件包未修复其漏洞(我会打开一个问题/PR,希望它会得到修复),那么我会考虑制作自己的软件分支来修复漏洞,而不是使用受影响的软件包。 - JBallin
有没有办法更新子包?在父包未修复漏洞的情况下? - Harshita
@Harshita 请查看标题为“如果父级未修复漏洞”的部分。 - JBallin
@JBallin 这是我遇到过的最有用的答案之一,但我们正在使用的依赖项不是开源的,而是由封闭的团队维护。 - Harshita
1
@Harshita,你联系过他们了吗?修复这些漏洞对他们自己也有好处。 - JBallin

15

步骤 1:安装同行依赖项

npm i --legacy-peer-deps

步骤2:手动更改包

手动编辑package-lock.json文件,并将易受攻击的包版本更新为修复后的版本。

npm ci

这将根据 package-lock.json 安装软件包,首先忽略 package.json

步骤 3:再次控制

运行

npm audit fix

要确保它是否正确完成。如果这样做没有帮助,那么请使用其他给定的解决方案。

更多信息请参见:

https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

或者在这里:https://docs.npmjs.com/auditing-package-dependencies-for-security-vulnerabilities


另一种解决方案可能是:https://www.npmjs.com/package/npm-check-updates - user3025289
2
这是一个很好的替代方案。如果这是在一个旨在发布的包内完成的,那么它将不起作用,因为 package-lock.json 文件不会被发布,但对于本地使用包来说,如果 npm audit fix 不可行,这可能是最好的解决方案。 - rpivovar
在生产环境中,我总是会添加 package-lock.json 文件。(宁愿安全也不要后悔) - user3025289

8

如果你的npm版本是6及以上,可以使用npm audit fix来修复你的安全问题。


3

用途:

npm i hoek

npm会安装最新版本的hoek,并更新您的package.lock.json文件。


3
自 NPM v8.3.0(2021-12-09)起,package.json 文件新增了一个名为 overrides 的属性,可以帮助您修复依赖项的漏洞,而无需修改 package-lock.json 文件。
{
  "overrides": {
    "foo": "1.0.0"
  }
}

文档:https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides

注意:不要忘记检查您尝试覆盖的软件包是否有重大变更。


1

要检查易受攻击的npm包,只需使用以下命令:

npm audit

为了修复易受攻击的npm包,只需使用以下命令,这将同时修复package-lock.json:

npm audit fix

0

我曾经遇到过这个问题,后来发现是因为我运行npm的服务器上安装的npm版本太旧了- package-lock.json只支持较新的版本。


-1

你试过这个方法吗:进入你的项目根目录,删除 package-lock.json 文件、node_modules.cache 文件夹,然后执行 npm install 命令。


1
在实践中,这非常危险。即使补丁版本都可能隐藏一些重大错误或破坏性更改,甚至更糟(例如黑客在npmjs.org上发布新版本的库)。您无法保证更新所有依赖项将使项目正常工作。安全的方法是逐步更新依赖项,为每个创建拉取请求,并使用自动化测试/构建来确保一切都保持正常工作。 - Ricovitch

-5
安装新依赖项后,请运行以下命令以更新package-lock.json文件:
npm update package-lock.json

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