概述
CVE-2021-23337是lodash.template@4.5.0 中的高严重性命令注入漏洞,Vue 2.6、Vue 2.7 和 Nuxt 2 都依赖于lodash.template@4.5.0。 此依赖漏洞已在最新的 Vue NES 版本中得到解决。我们已测试并部署了 Vue core 及其所有相关子软件包(最重要的是 Nuxt 用户所依赖的vue-server-renderer)的新补丁版本。
缓解
NES Nuxt 客户采用新版vue-server-renderer 的说明可在NES Nuxt 文档中获取。
此 Lodash 漏洞不会影响 Vue 3 或 Nuxt 3 用户。不过,对于尚未完成向 Vue 3 或 Nuxt 3 迁移的 HeroDevs NES 客户,您需要安装这个新补丁。
自行修补这个问题可能比较棘手,因为直接依赖的lodash.template和lodash.uniq已不再作为单独的软件包发布在 NPM 上。因此,在不重建所有软件包的情况下覆盖依赖关系并不简单。旧版本的 Vue 必须重新构建才能使用 Lodash 的新打包结构。虽然我们 HeroDevs NES 团队拥有完成这项工作的基础架构,但许多团队并不愿意亲自动手。除了功能上的正确性,我们还会分析打补丁后的 Vue 版本,以验证是否重复了任何新的传递依赖关系,并优化应用程序的捆绑包大小。
NES Vue 和 Nuxt 用户说明
最新的使用说明和版本号,以及如何首次设置 NES Vue 和 Nuxt,都可以在Vue或Nuxt入门页面上找到。您只需更新 package.json 以指向新发布的版本即可。
验证补丁
要验证 Nuxt 或 Vue 不再依赖 lodash.template软件包,可以使用软件包管理器的 why 命令。通常是npm why、yarn why 或pnpm why。
npm why lodash.template # 不应打印出 "nuxt "或 "vue"。
现在,当运行npm why时,你应该会看到一个更新版本的 Lodash(而不是lodash.template@4.5.0)已被解析。
npm why lodash # 应返回成功响应,并解析为满足 ^4.17.21 的版本。
接近该补丁
在 NES 团队中,我们努力成为项目的管理者,并做出不破坏现有用户利益的修改。由于在 npm 上发布的lodash.template 软件包已不再发布,因此从技术上讲没有 "最新 "版本可供升级。
不过,Lodash 本身仍然得到了很好的维护。我们选择升级 Lodash,以接收所有当前的非破坏性更改和补丁修复。我们现在也直接依赖于它,并遵循他们推荐的现代(但向后兼容!)导入语法。
这有几个原因。
首先,最新版本的 Lodash 已经修补了不少漏洞。今后,可能还会有更多。由于我们选择使用公开维护的软件包,并定义了接受补丁更新的版本范围,因此在合并任何 Renovate 或 Dependabot 拉取请求(Pull Requests)时,你都能自动接收未来的补丁。这意味着,你无需明确触及项目的 Vue 依赖关系,就能自动接收未来的补丁!
其次,Vue 直接或临时依赖多个 Lodash 软件包。Lodash 项目及其众多子软件包、函数和模块被设计为一起构建,并在整个应用程序中固定为一个单一版本,这样就不会出现代码重复的情况。通过升级到最新的非破坏性 Lodash 版本,我们能够确保您的构建工具能够正确树形化您的依赖关系,而不会重复包含一些更基本的实用程序包。
摘要
我们对 Vue 和 Nuxt 进行了修补,以解决之前的大量 Lodash 问题,并扩大了版本范围,以包括未来的修补程序。我们在确保向后和向前兼容性、功能生产奇偶性和捆绑大小方面非常谨慎。
通过使用我们发布的版本更新package.json文件,您可以保持 Vue 和 Nuxt 应用程序的安全性、合规性和最新性。
- Vue 2.7 NES 用户:确保所有 Vue 核心软件包版本均解析为@neverendingsupport/vue2@2.7.21 以上的版本。
- Vue 2.6 NES 用户:确保所有 Vue 核心软件包版本解析到@neverendingsupport/vue2@>=2.6.19以上的版本(但注意不要更新到未打补丁的 Vue 2.7 版本)。
每当我们支持的开源软件修复了新的漏洞,我们就会发出警报。