Investigate in your agent.

Turn this advisory into a focused investigation. Ask your agent to check your project’s versions, explain the evidence, and suggest a compatible fix.

Your agent needs remote MCP support and access to https://cve.new/mcp.

Read the setup guide

Skip to content
Check your stack
CVE-2026-118256low2.1

Vue I18n: `escapeParameter` does not escape named values when the same call also passes a list

Impact

When escapeParameter is enabled (escapeParameterHtml in the Legacy API), Vue I18n escapes the interpolation parameters before formatting a message. escapeParams() escapes either the list values or the named values, but not both: the two branches are joined by else. When a single call passes both, for example t(key, ['...'], { named: { ... } }), the named values reach the message without being escaped.

Source excerpt · OSV

Affected packages

Start with the recorded fix for your release branch. Check your installed version and test compatibility before upgrading. Fixing this advisory does not rule out other vulnerabilities in the release.

Affected range Recorded fix
From 9.0.0-beta.5 before 11.4.14Semantic versions11.4.14
From 12.0.0-alpha.1 before 12.0.0-alpha.5Semantic versions12.0.0-alpha.5

Version evidence: OSV · GHSA-8rc2-428q-7ww3

View original version evidence (0 explicit versions)
Affected range Recorded fix
From 9.0.0-beta.10 before 11.4.14Semantic versions11.4.14
From 12.0.0-alpha.1 before 12.0.0-alpha.5Semantic versions12.0.0-alpha.5

Version evidence: OSV · GHSA-8rc2-428q-7ww3

View original version evidence (0 explicit versions)
Affected range Recorded fix
From 9.0.0-beta.12 before 11.4.14Semantic versions11.4.14
From 12.0.0-alpha.1 before 12.0.0-alpha.5Semantic versions12.0.0-alpha.5

Version evidence: OSV · GHSA-8rc2-428q-7ww3

View original version evidence (0 explicit versions)
Affected range Recorded fix
From 9.2.0-alpha.7 before 11.4.14Semantic versions11.4.14
From 12.0.0-alpha.1 before 12.0.0-alpha.5Semantic versions12.0.0-alpha.5

Version evidence: OSV · GHSA-8rc2-428q-7ww3

View original version evidence (0 explicit versions)
Affected range Recorded fix
From 9.2.0-alpha.7 before 11.4.14Semantic versions11.4.14
From 12.0.0-alpha.1 before 12.0.0-alpha.5Semantic versions12.0.0-alpha.5

Version evidence: OSV · GHSA-8rc2-428q-7ww3

View original version evidence (0 explicit versions)

Affected products

Vendor version evidence. Product records are separate from automatic dependency matching.

intlify · GitHub_M

vue-i18n

2 ranges

Compare with this publisher’s ranges. This does not inspect your installation.

affected

>= 9.0.0-beta.5, < 11.4.14

>= 12.0.0-alpha.1, < 12.0.0-alpha.5

unaffected

unknown

Other versions: unknown

Original source description

Summary

When escapeParameter is enabled (escapeParameterHtml in the Legacy API), Vue I18n escapes the interpolation parameters before formatting a message. escapeParams() escapes either the list values or the named values, but not both: the two branches are joined by else. When a single call passes both, for example t(key, ['...'], { named: { ... } }), the named values reach the message without being escaped.

Details

escapeParams() in packages/core-base/src/translate.ts (v11.4.13):

function escapeParams(options: TranslateOptions) {
  if (isArray(options.list)) {
    options.list = options.list.map(item => (isString(item) ? escapeHtml(item) : item))
  } else if (isObject(options.named)) {
    // ...escapes the named values
  }
}

t(key, list, options) is a public overload, and TranslateOptions has a named field, so a call can carry both. The list is checked first, and the named values are then left as they are.

The translated string still goes through sanitizeTranslatedHtml() (added for CVE-2025-53892), which neutralizes event handler attributes and javascript: URLs. Other markup in the named values, such as links and forms, is inserted as is. Before the fix for GHSA-83rm-6c8r-g728, an <iframe srcdoc> in a named value also passes the sanitizer, and script runs. Versions without the sanitizer (before 9.14.5, 10.0.8 and 11.1.10, and 12.0.0-alpha.1 to alpha.3) insert the named values as HTML without any further check.

<i18n-t> is not affected: it passes either list or named values, never both, and it does not render translations as HTML.

PoC

import { createI18n } from 'vue-i18n'

const i18n = createI18n({
  legacy: false,
  locale: 'en',
  escapeParameter: true,
  messages: {
    en: { withList: '{0} {name}', withoutList: '{name}' }
  }
})
const t = i18n.global.t

t('withoutList', { name: '<b>x</b>' })
// &lt;b&gt;x&lt;&#x2F;b&gt;      escaped

t('withList', ['a'], { named: { name: '<b>x</b>' } })
// a <b>x</b>                   not escaped (v11.4.13)

Impact

Applications are affected when they enable escapeParameter, render translations as HTML (for example with v-html), and pass untrusted named values in the same call as a list. The named values are inserted as markup: phishing links, forms, or layout changes. Together with GHSA-83rm-6c8r-g728, or on versions without the sanitizer, this leads to script execution (DOM-based XSS).

Patches

Fixed in 11.4.14 and 12.0.0-alpha.5. escapeParams() now escapes both the list and the named values.

The fix also stops rewriting the named object that the caller passes. Before, the values of that object were replaced with their escaped form, so a second call with the same object escaped them twice.

v9 and v10 are no longer supported and will not be fixed. Please migrate to v11.

Workarounds

  • Do not pass list and named values in the same call when escapeParameter is enabled.
  • Do not render translations that can contain untrusted values with v-html. Use component interpolation (<i18n-t>) instead.

Inside the record

Evidence available

Package identity
Version evidence
Remediation guidance · not supplied
Weakness classification
Additional publishers

Describes the evidence in this view, not whether the product is safe.

Original records

CVE-2026-118256

View the latest unmodified CVE JSON from the official source. It may be newer than this imported page.

cve.new JSON →

Underlying weaknesses

The source’s classification of what caused the vulnerability.

CWE-79 ↗

CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

GitHub_M

Related →
CWE-116 ↗

CWE-116: Improper Encoding or Escaping of Output

GitHub_M

Related →
Contributing organizations · 2
GitHub_M

Assigning organization

2026-10-28
CISA-ADP

Additional data publisher

2026-10-30

What changed

Follow changes
  1. CVE · CVE-2026-118256

    Observed 2026-10-30T16:06:27.198Z · upstream updated 2026-10-30T14:19:32.716Z

    Prioritization updated

    before

    []

    after

    [
      {
        "source": "CISA-ADP",
        "type": "SSVC",
        "role": "CISA Coordinator",
        "timestamp": "2026-10-30T14:19:23.592827Z",
        "decisions": [
          {
            "name": "Exploitation",
            "value": "poc"
          },
          {
            "name": "Automatable",
            "value": "no"
          },
          {
            "name": "Technical Impact",
            "value": "partial"
          }
        ]
      }
    ]

Large field values are marked as truncated previews. Original source snapshots remain retained.

Showing up to 50 most recent observed changes.

References

6 sources