Unescaped error message included on error page in SvelteKit
Description
SvelteKit is a framework for rapidly developing robust, performant web applications using Svelte. The static error.html template for errors contains placeholders that are replaced without escaping the content first. error.html is the page that is rendered when everything else fails. It can contain the following placeholders: %sveltekit.status% — the HTTP status, and %sveltekit.error.message% — the error message. This leads to possible injection if an app explicitly creates an error with a message that contains user controlled content. Only applications where user provided input is used in the Error message will be vulnerable, so the vast majority of applications will not be vulnerable This issue has been addressed in version 2.8.3 and all users are advised to upgrade. There are no known workarounds for this vulnerability.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
@sveltejs/kitnpm | < 2.8.3 | 2.8.3 |
Affected products
1Patches
1134e36343ef5fix: ensure error messages are escaped (#13050)
3 files changed · +9 −2
.changeset/fast-swans-perform.md+5 −0 added@@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: ensure error messages are escaped
packages/kit/src/exports/vite/dev/index.js+2 −1 modified@@ -18,6 +18,7 @@ import { compact } from '../../../utils/array.js'; import { not_found } from '../utils.js'; import { SCHEME } from '../../../utils/url.js'; import { check_feature } from '../../../utils/features.js'; +import { escape_html } from '../../../utils/escape.js'; const cwd = process.cwd(); @@ -508,7 +509,7 @@ export async function dev(vite, vite_config, svelte_config) { const error_template = ({ status, message }) => { return error_page .replace(/%sveltekit\.status%/g, String(status)) - .replace(/%sveltekit\.error\.message%/g, message); + .replace(/%sveltekit\.error\.message%/g, escape_html(message)); }; res.writeHead(500, {
packages/kit/src/runtime/server/utils.js+2 −1 modified@@ -5,6 +5,7 @@ import { negotiate } from '../../utils/http.js'; import { HttpError } from '../control.js'; import { fix_stack_trace } from '../shared-server.js'; import { ENDPOINT_METHODS } from '../../constants.js'; +import { escape_html } from '../../utils/escape.js'; /** @param {any} body */ export function is_pojo(body) { @@ -50,7 +51,7 @@ export function allowed_methods(mod) { * @param {string} message */ export function static_error_page(options, status, message) { - let page = options.templates.error({ status, message }); + let page = options.templates.error({ status, message: escape_html(message) }); if (DEV) { // inject Vite HMR client, for easier debugging
Vulnerability mechanics
Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
7- github.com/advisories/GHSA-mh2x-fcqh-fmqvghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2024-53262ghsaADVISORY
- github.com/sveltejs/kit/commit/134e36343ef57ed7e6e2b3bb9e7f05ad37865794ghsax_refsource_MISCWEB
- github.com/sveltejs/kit/pull/13050ghsaWEB
- github.com/sveltejs/kit/releases/tag/%40sveltejs%2Fkit%402.8.3ghsaWEB
- github.com/sveltejs/kit/security/advisories/GHSA-mh2x-fcqh-fmqvghsax_refsource_CONFIRMWEB
- kit.svelte.dev/docs/errorsghsax_refsource_MISCWEB
News mentions
0No linked articles in our index yet.