【问题标题】:How to fix npm vulnerabilities manually?如何手动修复 npm 漏洞?
【发布时间】:2018-12-24 21:44:23
【问题描述】:

当我运行npm install 时,它会显示found 33 vulnerabilities (2 low, 31 moderate) run `npm audit fix` to fix them, or `npm audit` for details

但是,npm audit fix 输出 up to date in 11s fixed 0 of 33 vulnerabilities in 24653 scanned packages 33 vulnerabilities required manual review and could not be updated

review 是否意味着它不应该由用户修复?

当我运行npm audit 时,它给了我表格列表,类似于:

┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low           │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ lodash                                                       │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in    │ >=4.17.5                                                     │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ browser-sync [dev]                                           │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ browser-sync > easy-extender > lodash                        │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/577                       │
└───────────────┴──────────────────────────────────────────────────────────────┘

在此示例中,链接页面的补救部分显示Update to version 4.17.5 or later.。但是,在/node_modules/browser-sync/package.json 中有几行:

"devDependencies": {
    "lodash-cli": "4.17.5",
}

并且不再有 lodash 依赖项。所以它应该已经是 v4.17.5。我还检查了具有var VERSION = '4.17.10'; 行的/node_modules/lodash/lodash.json。在/node_modules/lodash/package.json 中有这些行:

  "_from": "lodash@^4.17.4",
  "_id": "lodash@4.17.10",

我相信“_id”中显示的版本,而不是“_from”中显示的版本,所以版本是正确的,但漏洞仍然出现在审核列表中。

我还是 node.js 的新手,这些消息让我很困惑。有什么办法可以手动修复或删除这些消息,我无能为力?

【问题讨论】:

标签: node.js npm npm-audit


【解决方案1】:

你也可以像npm audit fix --force一样使用武力。

【讨论】:

    【解决方案2】:

    devDependencies 中的lodash-cli 不会影响browser-sync 在您的项目中的工作方式,当软件包作为依赖项安装时,devDependencies 会被忽略。

    audit 报告说的是 easy-extender 具有 lodash 依赖项:

    browser-sync > easy-extender > lodash        
    

    它是depends on Lodash 3,而问题在 Lodash 4 中得到了修复。这个问题可以通过分叉 easy-extender 来解决,更新并安装它而不是来自 NPM 公共注册表的包。但是这种依赖并没有真正的问题。

    audit 报告重要性应手动评估。即使嵌套依赖存在安全风险,但这并不意味着使用了引入此风险的功能。这也不意味着即使使用它,也会因为使用方式而带来真正的风险。

    browser-sync 是一个不用于生产的开发工具,它的漏洞可以被利用的场景并不多。而且原型污染根本不是漏洞,只是一个包没有遵循良好实践的通知,可以忽略。

    通常,这是修复报告的漏洞的方法:

    • 进行健全性检查
    • 如果这是一个真正的问题,请检查易受攻击的软件包的存储库中是否存在现有问题 PRs
    • 如果没有,请提交问题
    • fork 存储库或使用现有 PR 作为 git dependency,直到它在 NPM 版本中得到修复
    • 在嵌套依赖项的情况下,在多个嵌套级别执行此操作

    大多数情况下,您不会超越健全性检查,唯一的问题是“漏洞”会混淆审计报告并隐藏真正的漏洞。

    patch-package 可以帮助就地修补嵌套依赖项,但这不会影响报告。

    可以使用resolutions field 强制 Yarn 1 和 2 中嵌套依赖项中的特定依赖项版本,这将影响审计报告。将来可能会这样做natively in NPM。目前 NPM 中的替代方案是第三方 npm-force-resolutions 实用程序,它提供的控制较少,目前它强制解决 all dependencies, not a specific one

    请注意,通过强制依赖项使用嵌套依赖项,它并非设计用于使用它,它随时可能被破坏。这尤其适用于npm-force-resolutions,这是一个生硬的工具,可以同时影响许多嵌套的依赖项。

    【讨论】:

    • 我没有关注Path部分,它确实使用了lodash v3.10.1,谢谢。但是浏览器同步只是示例,列表的最后一个。那么,我可以忽略 2 个低级漏洞,但我可以忽略 31 个中等漏洞吗?我想我不应该修改node_modules 中的任何内容,所以分叉和修复是摆脱它们的唯一方法吗?作为新用户,我没有能力做到这一点?我应该向软件包开发者发布关于它们的问题吗?
    • 但我可以忽略 31 个中等的吗? - 这就是“健全性检查”的意义所在,请自行判断。你越关注这些报告的实际内容,你就可以成为更好的开发人员,在安全方面。 我应该向软件包开发人员发布关于他们的问题吗? - 你可能应该(至少关闭audit),答案回答了这个问题。人们以某种​​方式在没有npm audit 的情况下生活。它们对应用程序造成真正安全问题的可能性非常低,但不知道它们是什么以及它们在您的应用程序中的使用方式,我无法保证。
    • 谢谢!花时间写评论,所以在评论之前没有看到编辑的部分。
    【解决方案3】:

    我试过了,它对我有用,运行以​​下命令:

    > npm audit fix    
    > npm set audit false
    

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    【解决方案4】:

    使用这个

    npm 审计修复 --force --production

    或许能解决你的问题

    【讨论】:

      【解决方案5】:

      'npm audit fix' 将增加 package.json 中的依赖版本,这可能会导致代码中断。 所以更好的方法是打开 package-lock.json 并将依赖/子依赖版本更新为所需版本。维护仓库中的 package-lock.json。

      有时漏洞来自开发包,在这种情况下,请忽略这些漏洞,因为这些漏洞不会在生产中被发现。

      【讨论】:

      • 如何从 package.json 文件本身添加/更新开发包?这种方法有什么不便吗? docs.npmjs.com/…
      【解决方案6】:

      如果您确定要跳过审核,可以通过附加 --no-audit 来实现

       npm install --no-audit
      

      【讨论】:

        【解决方案7】:

        我的系统中出现的大部分问题是由于 npm 包引起的。 我试过了,

        npm un npm
        

        您不必重新安装。

        再次运行程序。它对我有用。

        【讨论】:

        • 这只是卸载本地 npm 安装,这会导致使用全局 npm 安装。
        猜你喜欢
        • 1970-01-01
        • 2021-08-14
        • 2021-08-25
        • 2019-01-12
        • 2020-02-15
        • 2021-09-06
        • 2021-06-30
        • 2021-08-27
        相关资源
        最近更新 更多