一、你为什么搜到这篇

如果你正遇到以下任意一种情况,本文给出的方案可以直接套用:

  • pnpm audit / npm audit 报出 vue / vue-template-compiler / @vue/compiler-sfc 相关高危漏洞;
  • Snyk、Dependabot、绿盟、奇安信等扫描工具针对 CVE-2024-9506(ReDoS)CVE-2024-6783(XSS / 原型污染) 告警;
  • 公司合规要求提交"Vue 2 漏洞处理方案",但你知道 Vue 2 已 EOL,官方不会再发版
  • 项目还在用 Vue 2.7.16,短期内升不到 Vue 3

下面给出可直接照抄的解决方案。


二、解决方案速览

接入一个只修 CVE、不改 API的开源 Vue 2.7.16 安全分支:

  • 仓库https://github.com/joygqz/vue
  • 当前版本v2.7.16-security.1
  • 接入成本:改 package.json(直接依赖 + overrides),业务代码零修改
  • 协议:MIT(沿用原作者 Yuxi You 授权)

⚠️ 一句话避坑:本分支版本号是 prerelease,普通 semver 范围匹配不到它,所以几乎所有项目都必须配 overrides / resolutions 强制 dedup,否则会装出两份 Vue、补丁失效。这是接入的关键一步,详见第四节。


三、已修复的漏洞清单

CVE 编号 漏洞类型 影响模块 危害
CVE-2024-9506 ReDoS(正则灾难性回溯) 模板编译器 html-parser 恶意输入下模板编译卡死
CVE-2024-6783 XSS / 原型污染 codegen(class / style / SSR) 生成代码可被注入
多项传递依赖 CVE 多种 构建链依赖 SCA 工具报红、合规过不去

pnpm audit 结果:装上该分支后仅剩 1 个 low(elliptic,上游未修,全 npm 生态无法消除)——等于红灯转绿


四、接入步骤(可直接照抄)

整个接入是三步:替换直接依赖 → 配 overrides 强制 dedup → 重装并验证。

步骤 1:替换直接依赖

package.json dependencies 里用到的 Vue 相关项改成 git tag(只装用得到的即可):

{
  "dependencies": {
    "vue": "git+https://github.com/joygqz/vue.git#v2.7.16-security.1",
    "vue-template-compiler": "git+https://github.com/joygqz/vue.git#template-compiler-v2.7.16-security.1",
    "vue-server-renderer": "git+https://github.com/joygqz/vue.git#server-renderer-v2.7.16-security.1",
    "@vue/compiler-sfc": "git+https://github.com/joygqz/vue.git#compiler-sfc-v2.7.16-security.1"
  }
}

npm / pnpm / yarn 都支持 git+url 协议,没用到的子包不写即可。

步骤 2:强制 dedup(几乎所有项目都需要

⚠️ 本分支版本号是 prerelease2.7.16-security.1)。按 semver 规则,prerelease 不会匹配普通范围(^2.7.16^2.7.0>=2.5.0 全部不命中)。

因此,凡是间接依赖 vue 的包(UI 组件库、被工具链拉取的 vue-template-compiler / vue-server-renderer、把 vue 写进 dependencies 的库),其范围匹配不到本补丁版,包管理器会从 registry 另装一份未打补丁的 vue——导致双份 Vue 实例(响应式 / instanceof 失效)且漏洞依然存在,补丁等于白打。

除非你的项目完全没有任何间接 vue 依赖(极少见),否则必须用 overrides / resolutions 把所有 vue 引用强制指向本补丁版。

npm / pnpmpackage.json 顶层):

{
  // pnpm
  "pnpm": {
    "overrides": {
      "vue": "git+https://github.com/joygqz/vue.git#v2.7.16-security.1",
      "vue-template-compiler": "git+https://github.com/joygqz/vue.git#template-compiler-v2.7.16-security.1",
      "vue-server-renderer": "git+https://github.com/joygqz/vue.git#server-renderer-v2.7.16-security.1",
      "@vue/compiler-sfc": "git+https://github.com/joygqz/vue.git#compiler-sfc-v2.7.16-security.1"
    }
  },
  // npm(顶层同级,与 pnpm 按所用包管理器二选一)
  "overrides": {
    "vue": "git+https://github.com/joygqz/vue.git#v2.7.16-security.1",
    "vue-template-compiler": "git+https://github.com/joygqz/vue.git#template-compiler-v2.7.16-security.1",
    "vue-server-renderer": "git+https://github.com/joygqz/vue.git#server-renderer-v2.7.16-security.1",
    "@vue/compiler-sfc": "git+https://github.com/joygqz/vue.git#compiler-sfc-v2.7.16-security.1"
  }
}

yarnpackage.json 顶层):

{
  "resolutions": {
    "vue": "git+https://github.com/joygqz/vue.git#v2.7.16-security.1",
    "vue-template-compiler": "git+https://github.com/joygqz/vue.git#template-compiler-v2.7.16-security.1",
    "vue-server-renderer": "git+https://github.com/joygqz/vue.git#server-renderer-v2.7.16-security.1",
    "@vue/compiler-sfc": "git+https://github.com/joygqz/vue.git#compiler-sfc-v2.7.16-security.1"
  }
}

override 列表同样只保留用得到的几项即可。

步骤 3:重装并验证

重装锁文件以确保 dedup 生效:

rm -rf node_modules pnpm-lock.yaml   # 或 package-lock.json / yarn.lock
pnpm install                         # npm install / yarn install

验证版本号,并确认全树只有一份 vue

node -p "require('vue/package.json').version"
# 输出:2.7.16-security.1

pnpm why vue        # npm ls vue / yarn why vue
# 应只出现 git 补丁版,无 registry 副本

再跑一次安全扫描确认:

pnpm audit
# 预期:仅剩 1 个 low(elliptic),其它高危漏洞已修复

业务代码里所有 import Vue from 'vue' 一行都不用动,组件、路由、Vuex 全部正常工作。可参考仓库内 demo-vue/(webpack + vue-loader@15 集成示例)。


五、为什么可以放心用(合规角度)

这是上线前合规评审最关心的部分,整理如下:

  1. 完全开源 + MIT 协议,沿用 Vue 原作者 Yuxi (Evan) You 授权,法务无障碍;

  2. 每个 tag 一一对应一个 commit hash,可直接 diff 上游 2.7.16 给安全/合规同事审计;

  3. 边界明确:只修已披露 CVE,不引入任何新特性、不修改任何 API

  4. 修复粒度极小,以 CVE-2024-9506 为例,核心修复就一行——给正则加个 ^ 锚点:

    - new RegExp('([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i')
    + new RegExp('^([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i')
    

    diff 干净到可以一眼看完,不存在夹带私货的空间。

可以把上面四条直接复制进你的"漏洞处理方案"文档作为答复证据。


六、常见问题排查

Q1:pnpm install 卡在 clone 仓库

git+url 首次安装需要 clone 一次仓库,比 npm 镜像慢。可配置 git 走代理或使用国内镜像加速,CI 缓存命中后基本无感。

Q2:CI 环境 git clone 失败

需要确保 CI 容器内有 git 命令,并且能访问 github.com企业内网建议:把仓库镜像到公司 GitLab,把 git+https://github.com/joygqz/vue.git 改成内网地址即可,依赖关系不变。

Q3:装完发现有两份 vue / 版本号不对

最常见原因是漏配了步骤 2 的 overrides。先确认顶层 overrides(或 pnpm.overrides / resolutions)已加上,再清缓存重装:

pnpm store prune        # 或 npm cache clean --force
rm -rf node_modules pnpm-lock.yaml
pnpm install
pnpm why vue            # 确认全树只剩 git 补丁版

Q4:webpack + vue-loader@15 项目能用吗

可以。仓库内附了一个 demo-vue/ 集成 demo(webpack + vue-loader@15),clone 下来能直接跑通。

Q5:@vue/compiler-sfc 我没用过,需要装吗

按需。只有你的构建链/单元测试链直接依赖 @vue/compiler-sfc 时才装到 dependencies,overrides 里也按需保留。


七、适用范围

适用:

  • 跑在生产、短期内无法升级到 Vue 3 的老项目;
  • pnpm audit / Snyk / Dependabot 等 SCA 工具卡住合规上线的团队;
  • 政企/银行/医疗等交付项目,甲方要求"必须有明确维护方";
  • 国企内网项目,需要一份可镜像到内网 GitLab 的私有 fork。

不适用:

  • 新项目(请直接使用 Vue 3 + Vite);
  • 希望持续拿到新特性的项目(这里永远不会有新特性,这是设计);
  • 期望"官方背书"的项目(这是个人维护的安全分支,非官方产物)。

八、后续维护

  • 新披露、影响 Vue 2.7.16 的 CVE 会持续跟进,发布 v2.7.16-security.2.3 …… 升级时,把 package.jsondependencies 以及 overrides / resolutions 中的 #...security.<旧版本> tag 一并改成新版本号,再重装锁文件(即重跑上文步骤 3);
  • 欢迎在 GitHub issue 区上报漏洞、提交 PR 修复;
  • 功能 PR 一律不收——这是这个分支能被信任、能被安全审计接受的边界。

九、参考资料


觉得有用的话,欢迎收藏 + 点赞 + 关注,后续每修一个新 CVE 都会同步更新本文。也欢迎转发给身边还在维护 Vue 2 项目的同事。

更多推荐