Vue 2 EOL 安全漏洞修复方案:CVE-2024-9506 / CVE-2024-6783 一键修复(开源安全分支 v2.7.16-security.1 接入教程)
一、你为什么搜到这篇
如果你正遇到以下任意一种情况,本文给出的方案可以直接套用:
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(几乎所有项目都需要)
⚠️ 本分支版本号是 prerelease(
2.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 / pnpm(package.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"
}
}
yarn(package.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 集成示例)。
五、为什么可以放心用(合规角度)
这是上线前合规评审最关心的部分,整理如下:
-
完全开源 + MIT 协议,沿用 Vue 原作者 Yuxi (Evan) You 授权,法务无障碍;
-
每个 tag 一一对应一个 commit hash,可直接 diff 上游
2.7.16给安全/合规同事审计; -
边界明确:只修已披露 CVE,不引入任何新特性、不修改任何 API;
-
修复粒度极小,以 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.json里dependencies以及overrides/resolutions中的#...security.<旧版本>tag 一并改成新版本号,再重装锁文件(即重跑上文步骤 3); - 欢迎在 GitHub issue 区上报漏洞、提交 PR 修复;
- 功能 PR 一律不收——这是这个分支能被信任、能被安全审计接受的边界。
九、参考资料
- 仓库地址:https://github.com/joygqz/vue
- 当前接入版本:
v2.7.16-security.1 - Vue 官方仓库(已 EOL):https://github.com/vuejs/vue
- Vue 3 官方仓库(新项目推荐):https://github.com/vuejs/core
- CVE-2024-9506 详情:搜索 NVD 数据库
CVE-2024-9506 - CVE-2024-6783 详情:搜索 NVD 数据库
CVE-2024-6783
觉得有用的话,欢迎收藏 + 点赞 + 关注,后续每修一个新 CVE 都会同步更新本文。也欢迎转发给身边还在维护 Vue 2 项目的同事。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)