避免对纱线脆弱的间接依赖

jro*_*ind 7 npm yarnpkg

我是一名 Rails 开发人员,对 JS 依赖管理有点陌生。我使用yarn/webpacker管理JS依赖关系,尽管我不认为这个问题有任何特定于webpack/webpacker的内容。

最近,Github 提醒我在 GH 存储库的纱线依赖项中发现了一个漏洞。

Upgrade lodash to version 4.17.13 or later. For example:
   lodash@^4.17.13:
      version "4.17.13"
Run Code Online (Sandbox Code Playgroud)

(CVE-2019-10744)

我没有 lodash 作为直接依赖项,它在我的package.json.

相反,它是一种间接/传递依赖——我的一些依赖项(或它们的依赖项)依赖于 lodash。其实有好几个。

我的yarn.lock包含这个:

"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.4, lodash@~4.17.10:
  version "4.17.11"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
  integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
Run Code Online (Sandbox Code Playgroud)

我认为这意味着我的依赖树中有 5 个东西需要 lodash。其中之一允许 lodash 3.5 和 4.x,其他四个允许 4.x 的各种范围。

我认为他们都会允许 4.17.13 而不发生冲突,但没有人要求它。

事实上,当前使用的 lodash 是 4.17.11,它小于 4.17.13,因此根据 github(和 CVE),这是一个易受攻击的版本。

我对处理这个问题的正确方法感到困惑,并升级我的 lodash。

手动添加lodash到我的 package.json 对我来说似乎是错误的——它实际上不是我关心的依赖项,它只是一个间接/传递依赖项。如果我将其显式添加到我的 package.json 中,我可能会添加一个现在可以正常工作的版本,但会与依赖树的某些未来部分发生冲突。这似乎是不必要的限制。

但这是我“应该”做的最佳实践吗?

我有点认为yarn upgrade lodash应该更新yarn.lock而不触及package.json. 但yarn upgrade lodash根本不改变任何文件,它保持yarn.lock不变。

我不确定这是否是因为yarn upgrade没有达到我的预期,或者我的依赖树中有其他东西阻止了升级lodash到 4.17.13 ——但如果有的话,我将如何发现它是什么?为什么它不在yarn.lock上面的摘录中体现?(或者是这样,我读的yarn.lock错了?)

我也许可以手动进入yarn.lock,并编辑 lodash 行来说明version "4.17.13"——我不清楚这是否是纱线期望我做的。(看起来很危险,如果我将其编辑为无法通过整体依赖树解析的内容怎么办?)

我有一个非常简单的package.json,但我仍然对我应该在这里做什么以确保我使用不易受攻击的 lodash 感到困惑。我不明白yarn/npm是如何工作的,足以知道要爬下哪个洞。

我非常感谢任何非常熟悉纱线的人提供关于处理这种情况的标准/最佳/正确/“正确”方法的建议。

更新看来确实没有办法在纱线中做到这一点?https://github.com/yarnpkg/yarn/issues/4986 这让我感到困惑,我不明白纱线用户没有它怎么办。

Tim*_*nko 5

看看选择性版本解析,其中一种情况正是您的:

\n\n
\n

您项目的子依赖项获得了重要的安全更新,并且您不想等待直接依赖项发布最低版本更新。

\n
\n\n
{\n  "resolutions": { "**/**/lodash": "4.17.13" }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

实际上,我认为你甚至不能将其推入 VCS,只需将其放入package.json,然后yarn install它应该生成新的yarn.lock,然后你可以resolutions从中删除package.json(我没有测试它,只是我的想法)

\n


小智 2

确定如何引入易受攻击的依赖项很容易成为一场噩梦。您想要查看您的依赖关系树,以确定如何使用yarn list( https://yarnpkg.com/lang/en/docs/cli/list/ ) 引入 lodash。

这将帮助您了解您最初是如何得到这个的。

现在问题的第二部分是修复漏洞。这可以通过使用 Snyk.io 等工具来实现,该工具将扫描您的依赖项并建议您升级哪些直接依赖项以注入不易受攻击的 lodash 版本。