TanStack Router: Unauthenticated reflected XSS in TanStack Start server-function responses
## Impact An unauthenticated attacker can craft a URL to a server function in an affected TanStack Start app. If someone opens the link, the app can return attacker-controlled HTML from its own origin and run the attacker's JavaScript there. The script can access same-origin data available to that visitor and make requests with their authority. ## Cause The server-function transport can pass request payload fields into internal middleware state instead of limiting them to public input fields. A malformed payload can leave an attacker-controlled result in the error path. Response handling can then treat a response-shaped object as an HTTP response. ## Affected versions Published versions of `@tanstack/start-server-core`, `@tanstack/react-start`, `@tanstack/solid-start`, and `@tanstack/vue-start` from `1.143.12` up to, but not including, their respective patched versions are affected. The patched versions are `@tanstack/start-server-core@1.169.39`, `@tanstack/react-start@1.168.60`, `@tanstack/solid-start@1.168.57`, and `@tanstack/vue-start@1.168.56`. ## Fix The fix limits client-supplied server-function input to public fields and validates responses at the server boundary. Upgrade to the corresponding patched package version. ## Temporary mitigations For the configured server-function path, usually `/_serverFn/*`, an edge or WAF rule can consider blocking requests without the literal `x-tsr-serverFn: true` header and browser document navigations such as `Sec-Fetch-Mode: navigat
- Products
- @tanstack/react-start, @tanstack/solid-start, @tanstack/start-server-core, @tanstack/vue-start
- Affected versions
- Not specified
- Fixed versions
- 1.168.56, 1.168.57, 1.168.60, 1.169.39
- CVEs
- CVE-2026-102989
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 30 Oct 2026, 19:14 UTC · Revision 1
Source evidence
TanStack Router: Unauthenticated reflected XSS in TanStack Start server-function responses
core-osv · Original sourcePublished 15 Oct 2026, 20:22 UTC
## Impact An unauthenticated attacker can craft a URL to a server function in an affected TanStack Start app. If someone opens the link, the app can return attacker-controlled HTML from its own origin and run the attacker's JavaScript there. The script can access same-origin data available to that visitor and make requests with their authority. ## Cause The server-function transport can pass request payload fields into internal middleware state instead of limiting them to public input fields. A malformed payload can leave an attacker-controlled result in the error path. Response handling can then treat a response-shaped object as an HTTP response. ## Affected versions Published versions of `@tanstack/start-server-core`, `@tanstack/react-start`, `@tanstack/solid-start`, and `@tanstack/vue-start` from `1.143.12` up to, but not including, their respective patched versions are affected. The patched versions are `@tanstack/start-server-core@1.169.39`, `@tanstack/react-start@1.168.60`, `@tanstack/solid-start@1.168.57`, and `@tanstack/vue-start@1.168.56`. ## Fix The fix limits client-supplied server-function input to public fields and validates responses at the server boundary. Upgrade to the corresponding patched package version. ## Temporary mitigations For the configured server-function path, usually `/_serverFn/*`, an edge or WAF rule can consider blocking requests without the literal `x-tsr-serverFn: true` header and browser document navigations such as `Sec-Fetch-Mode: navigat
osv:GHSA-qx66-fv34-fjm8
@tanstack/start-server-core
Fixed versions: 1.169.39
@tanstack/react-start
Fixed versions: 1.168.60
@tanstack/solid-start
Fixed versions: 1.168.57
@tanstack/vue-start
Fixed versions: 1.168.56
Complete source record
{
"id": "5017b8b3e390bfdc8f51e4f9c9f504366521b3c7ff69b111bfd99429ed83a09f",
"url": "https://osv.dev/vulnerability/GHSA-qx66-fv34-fjm8",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "TanStack Router: Unauthenticated reflected XSS in TanStack Start server-function responses",
"summary": "## Impact An unauthenticated attacker can craft a URL to a server function in an affected TanStack Start app. If someone opens the link, the app can return attacker-controlled HTML from its own origin and run the attacker's JavaScript there. The script can access same-origin data available to that visitor and make requests with their authority. ## Cause The server-function transport can pass request payload fields into internal middleware state instead of limiting them to public input fields. A malformed payload can leave an attacker-controlled result in the error path. Response handling can then treat a response-shaped object as an HTTP response. ## Affected versions Published versions of `@tanstack/start-server-core`, `@tanstack/react-start`, `@tanstack/solid-start`, and `@tanstack/vue-start` from `1.143.12` up to, but not including, their respective patched versions are affected. The patched versions are `@tanstack/start-server-core@1.169.39`, `@tanstack/react-start@1.168.60`, `@tanstack/solid-start@1.168.57`, and `@tanstack/vue-start@1.168.56`. ## Fix The fix limits client-supplied server-function input to public fields and validates responses at the server boundary. Upgrade to the corresponding patched package version. ## Temporary mitigations For the configured server-function path, usually `/_serverFn/*`, an edge or WAF rule can consider blocking requests without the literal `x-tsr-serverFn: true` header and browser document navigations such as `Sec-Fetch-Mode: navigat",
"evidence": "osv:GHSA-qx66-fv34-fjm8",
"products": [
{
"name": {
"value": "@tanstack/start-server-core",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.169.39",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
},
{
"name": {
"value": "@tanstack/react-start",
"evidence": "/affected/1/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.168.60",
"evidence": "/affected/1/ranges"
}
],
"affected_versions": []
},
{
"name": {
"value": "@tanstack/solid-start",
"evidence": "/affected/2/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.168.57",
"evidence": "/affected/2/ranges"
}
],
"affected_versions": []
},
{
"name": {
"value": "@tanstack/vue-start",
"evidence": "/affected/3/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.168.56",
"evidence": "/affected/3/ranges"
}
],
"affected_versions": []
}
],
"severity": "critical",
"structured": {
"id": "GHSA-qx66-fv34-fjm8",
"aliases": [
"CVE-2026-102989",
"GHSA-qx66-fv34-fjm8"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N"
}
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.143.12"
},
{
"fixed": "1.169.39"
}
]
}
],
"package": {
"name": "@tanstack/start-server-core",
"purl": "pkg:npm/%40tanstack/start-server-core",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-qx66-fv34-fjm8/GHSA-qx66-fv34-fjm8.json"
}
},
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.143.12"
},
{
"fixed": "1.168.60"
}
]
}
],
"package": {
"name": "@tanstack/react-start",
"purl": "pkg:npm/%40tanstack/react-start",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-qx66-fv34-fjm8/GHSA-qx66-fv34-fjm8.json"
}
},
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.143.12"
},
{
"fixed": "1.168.57"
}
]
}
],
"package": {
"name": "@tanstack/solid-start",
"purl": "pkg:npm/%40tanstack/solid-start",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-qx66-fv34-fjm8/GHSA-qx66-fv34-fjm8.json"
}
},
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.143.12"
},
{
"fixed": "1.168.56"
}
]
}
],
"package": {
"name": "@tanstack/vue-start",
"purl": "pkg:npm/%40tanstack/vue-start",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-qx66-fv34-fjm8/GHSA-qx66-fv34-fjm8.json"
}
}
],
"modified": "2026-10-15T20:30:04.544571974Z",
"provider": "osv",
"references": [
"https://github.com/TanStack/router/security/advisories/GHSA-qx66-fv34-fjm8",
"https://nvd.nist.gov/vuln/detail/CVE-2026-102989",
"https://github.com/TanStack/router/pull/8573",
"https://github.com/TanStack/router/commit/d521abd71c69f1ff010bb3def4d417cb5fa058cb",
"https://github.com/TanStack/router",
"https://github.com/TanStack/router/releases/tag/release-2026-09-30-1747"
],
"provider_metadata": {
"cwe_ids": [
"CWE-79"
],
"severity": "CRITICAL",
"github_reviewed": true,
"nvd_published_at": "2026-10-13T17:17:14Z",
"github_reviewed_at": "2026-10-15T20:22:20Z"
}
},
"related_cves": [
{
"value": "CVE-2026-102989",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/database_specific/severity"
},
"source_id": "core-osv",
"document_id": 336041,
"published_at": "2026-10-15T20:22:20+00:00"
}