GHSA-qx66-fv34-fjm8: XSS
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: navigate or Accept: text/html. A restrictive Content Security Policy on server-function responses can provide another browser-side restriction. These are mitigation suggestions, not a complete fix. The header is client-controlled and is not authentication. Test rules against legitimate GET and POST server functions and use a matching version-specific backport where possible.
Credits
Lovable helped us discover and report this issue. We thank them for their help.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
npm/@tanstack/vue-startto a version that resolves this vulnerability.Fixed in 1.168.56 - Upgrade
Upgrade
npm/@tanstack/solid-startto a version that resolves this vulnerability.Fixed in 1.168.57 - Upgrade
Upgrade
npm/@tanstack/react-startto a version that resolves this vulnerability.Fixed in 1.168.60 - Upgrade
Upgrade
npm/@tanstack/start-server-coreto a version that resolves this vulnerability.Fixed in 1.169.39 - Upgrade
Upgrade
@tanstack/start-server-coreto a version that resolves this vulnerability.Fixed in 1.169.39 - Upgrade
Upgrade
@tanstack/react-startto a version that resolves this vulnerability.Fixed in 1.168.60 - Upgrade
Upgrade
@tanstack/solid-startto a version that resolves this vulnerability.Fixed in 1.168.57 - Upgrade
Upgrade
@tanstack/vue-startto a version that resolves this vulnerability.Fixed in 1.168.56 - Compensating control
For the configured server-function path, usually /_serverFn/*, use an edge or WAF rule to consider blocking requests without the literal x-tsr-serverFn: true header and browser document navigations such as Sec-Fetch-Mode: navigate or Accept: text/html; test the rule against legitimate GET and POST server functions.
- Compensating control
Apply a restrictive Content Security Policy to server-function responses as an additional browser-side restriction.
Event History
Frequently Asked Questions
What user interaction is required for exploitation?
An unauthenticated attacker must craft a URL to a server function in an affected application and convince a victim to open it. No attacker authentication is required, but exploitation depends on victim interaction.
What can an attacker do in a victim's browser after successful exploitation?
The application can return attacker-controlled HTML from its own origin and execute attacker JavaScript there. That script can access same-origin data available to the victim and make requests using the victim's authority.
Which package versions need to be upgraded?
Affected releases begin at version 1.143.12 and continue until the respective patched release: @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. Upgrade each affected package to its listed patched version or later.
What does the patch change?
The fix restricts client-supplied server-function input to public fields and validates responses at the server boundary. This prevents request payload fields from being introduced into internal middleware state and prevents response-shaped attacker-controlled objects from being handled as HTTP responses.