Skip to content

Latest commit

 

History

History
185 lines (126 loc) · 6.61 KB

File metadata and controls

185 lines (126 loc) · 6.61 KB

solution

安全事件来源及参考解决方案

https://www.cve.org/

https://www.cve.org/CVERecord/SearchResults?query=vue

https://security.snyk.io/package/npm/vue

https://www.herodevs.com/support/nes-vue

https://www.herodevs.com/vulnerability-directory?4496ac32_Technology_equal=%5B%22Vue+2%22%5D

security issue list

Low CVE-2024-9506(ReDoS 漏洞)

https://www.cve.org/CVERecord?id=CVE-2024-9506

https://www.herodevs.com/vulnerability-directory/cve-2024-9506?nes-for-vue-2

https://security.snyk.io/vuln/SNYK-JS-VUE-8219889

漏洞概述 CVE-2024-9506是Vue 2中的一个正则表达式拒绝服务(ReDoS)漏洞,影响Vue 2编译器。该漏洞在处理特定模板字符串时,可能导致应用程序性能显著下降。 影响范围

  • 受影响的版本:>= 2.0.0 < 3.0.0
  • 受影响的组件:compiler-sfc, server-renderer, template-compiler, vue-template-compiler, vue-server-renderer 4 漏洞详情 该漏洞存在于Vue的parseHTML()函数中,当模板字符串包含 <script><style><textarea> 标签但没有匹配的闭合标签时,会触发有缺陷的正则表达式处理,导致模板解析过程中出现显著延迟。

修复说明

  • 修复位置:src/compiler/parser/html-parser.ts
  • 修复策略:移除明文标签分支中基于整段模板的正则替换,改为使用 indexOf 线性查找闭合标签,避免缺失闭合标签时触发正则回溯退化。
  • 回归测试:test/unit/modules/compiler/parser.spec.ts
  • 覆盖链路:vue 主包编译器、packages/template-compilerpackages/compiler-sfcpackages/server-renderer 均复用该解析逻辑,构建后会一并带上修复。

多项目落地操作

目标:仅维护 Vue 2.7 版本,用 patch-package 方式支持多个现有 Vue 2 项目,便于快速整改和通过安全评测。

维护原则

  • 只维护 2.7 版本线。
  • 2.7 项目先升级到 2.7.16,再接入安全补丁。
  • 默认采用 patch-package,因为补丁文件可以直接入库,便于审计、送检和复核。
  • 统一 fork 仓库继续作为补丁源码来源,但项目侧优先消费 patch 文件,而不是优先切私有包。

推荐流程

  1. 盘点项目当前 Vue 版本和构建链。
  2. 2.7 项目先升级到 2.7.16
  3. 按项目生成 patch-package 补丁并提交。
  4. 重新安装依赖,自动回放 patch。
  5. 进行安全扫描复验并保留扫描结果。

第一步:先统一升级到 Vue 2.7

升级原则

  • 2.6.x 项目不单独维护,直接升级到 2.7.16
  • 升级时保持 vue 与编译器包版本严格一致。
  • 先完成版本升级,再做安全 patch;不要把“版本升级”和“漏洞 patch”混成一次大改,方便回归和审计。

常见依赖对应关系

  • Webpack / Vue CLI 项目
    • vue: 2.7.16
    • vue-template-compiler: 2.7.16
  • Vue 2.7 + 新版 SFC 工具链项目
    • vue: 2.7.16
    • @vue/compiler-sfc: 2.7.16
  • SSR 项目
    • 额外检查 vue-server-renderer 是否与 vue 同版本

第二步:按项目生成 patch-package

适用原因

  • 补丁文件直接进入业务项目仓库,审计人员可以直接看到改动内容。
  • 不依赖内部 npm 镜像解释,安全评测时更容易说明“修了哪里、怎么修的”。
  • 后续项目重新安装依赖时,通过 postinstall 自动生效。

项目内操作步骤

  1. 安装 patch-package
  2. 修改 node_modules 中对应包的编译器文件。
  3. 生成 patch 文件。
  4. 提交 patches/*.patchpackage.json 脚本改动。

安装示例

npm i -D patch-package

package.json

{
  "scripts": {
    "postinstall": "patch-package"
  }
}

需要 patch 的典型文件

  • Webpack / Vue CLI 项目
    • node_modules/vue-template-compiler/build.js
  • Vue 2.7 + SFC 工具链项目
    • node_modules/@vue/compiler-sfc/dist/compiler-sfc.js
  • SSR 项目
    • node_modules/vue-server-renderer/build.dev.js
    • node_modules/vue-server-renderer/build.prod.js

说明

  • 大多数预编译模板项目,重点是 vue-template-compiler
  • 使用 @vue/compiler-sfc 的项目,需要同步 patch compiler-sfc
  • 使用 SSR 的项目,需要同步 patch vue-server-renderer 的编译产物。
  • 是否 patch vue 本体,取决于项目是否在运行时使用“带编译器的完整构建”。

生成 patch 示例

单包项目

npx patch-package vue-template-compiler

多包项目

npx patch-package vue-template-compiler @vue/compiler-sfc vue-server-renderer

推荐提交内容

  • package.json 中的 postinstall
  • patches/vue-template-compiler+2.7.16.patch
  • patches/@vue+compiler-sfc+2.7.16.patch
  • patches/vue-server-renderer+2.7.16.patch
  • 一份内部整改说明,标记对应漏洞编号

验收检查

  • 锁定 vuevue-template-compiler@vue/compiler-sfc 的版本对应关系。
  • 构建一次生产包,确认编译链无版本不匹配错误。
  • 对 SAST / SCA 扫描结果做一次复扫,确认漏洞编号消失,或在补丁证明材料中可说明已修复。
  • 对使用 SFC、SSR、运行时模板编译的项目各选一个样板项目做回归验证。

安全评测建议材料

  • 漏洞编号:CVE-2024-9506 / SNYK-JS-VUE-8219889
  • 受影响包列表
  • patch 文件
  • patch 前后 diff
  • 对应测试记录或构建记录
  • 一份整改说明,说明“项目已升级至 Vue 2.7.16,并通过 patch-package 修复编译器 ReDoS 漏洞”

标准模板

  • 可直接复用的模板目录:templates/vue2-security-patch-package/
  • 包含 package.json 片段、patch 生成步骤、整改说明模板和验收清单

Medium CVE-2024-6783(XSS 漏洞)

https://www.cve.org/CVERecord?id=CVE-2024-6783

https://www.herodevs.com/vulnerability-directory/cve-2024-6783?nes-for-vue-2

漏洞概述 CVE-2024-6783是Vue 2中的一个跨站脚本(XSS)漏洞,影响Vue 2模板编译器的"完整构建"版本。这是自2018年以来Vue 2发现的第一个CVE漏洞。 6 影响范围

  • 受影响的版本:>= 2.0.0 < 3.0.0
  • 受影响的组件:vue-template-compiler 8 漏洞详情 该漏洞存在于Vue 2的浏览器内模板编译器中,该编译器负责创建代码字符串以执行,使组件模板如 <div>{{ variables }}</div> 能被解析并转换为渲染函数。这些渲染函数随后在字符串化的eval语句中被Vue执行,从而允许第三方脚本运行任意代码。

只有某些属性在扩展Object.prototype时容易受到客户端XSS漏洞的影响。其中一个属性是staticClass,当模板字符串使用具有非动态类的class属性时,在AST构建阶段会检索该属性。

仅影响2.6特定版本,升级到2.7新版本即可。