CVE-2026-49215: Symfony UX: CSRF Protection Bypass in symfony/ux-live-component — Accept Header is CORS-Safelisted
Description
When using symfony/ux-live-component, methods annotated with #[LiveAction] are invokable from the browser and mutate server-side state via AJAX. Symfony\UX\LiveComponent\EventListener\LiveComponentSubscriber::isLiveComponentRequest() gated these invocations on the presence of Accept: application/vnd.live-component+html, with a code comment stating that this acted as a CSRF protection.
The Accept header is a CORS-safelisted request header, so a cross-origin fetch() can set it without triggering a preflight. The header therefore provided no CSRF protection. Any #[LiveAction] could be forged cross-origin against a victim's session.
In practice the attack is mitigated by SameSite=Lax session cookies (Symfony's default), but applications using SameSite=None, credentials: 'include' with a permissive cookie policy, or that have been pivoted from another same-origin vector remained exposed.
Resolution
isLiveComponentRequest() now additionally requires the request header X-Requested-With: XMLHttpRequest. This header is not CORS-safelisted, so the browser issues a preflight OPTIONS request for any cross-origin attempt; Symfony does not advertise CORS for LiveComponent endpoints, the preflight fails, and the real request is blocked before it reaches the application. The bundled Stimulus client already sends X-Requested-With on every LiveComponent request (RequestBuilder.ts), so standard usage is unaffected. Cross-origin callers must add X-Requested-With to their CORS Access-Control-Allow-Headers allow-list.
The patch for this issue is available here for branch 2.x (and forward-ported to 3.x).
Credits
Symfony would like to thank Anthropic (via Project Glasswing) for reporting the issue and Hugo Alliaume for providing the fix.
Other sources
Symfony UX is a JavaScript ecosystem for Symfony. From 2.22.0 until 2.36.0 and 3.1.0, Symfony\UX\LiveComponent\EventListener\LiveComponentSubscriber::isLiveComponentRequest() gates #[LiveAction] invocations on Accept: application/vnd.live-component+html, but the Accept header is CORS-safelisted and cross-origin fetch() can set it without preflight, allowing forged cross-origin #[LiveAction] requests against a victim session when applications use SameSite=None, credentials: 'include', a permissive cookie policy, or a same-origin pivot. This issue is fixed in versions 2.36.0 and 3.1.0.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
composer/symfony/ux-live-componentto a version that resolves this vulnerability.Fixed in 3.1.0 - Upgrade
Upgrade
composer/symfony/ux-live-componentto a version that resolves this vulnerability.Fixed in 2.36.0 - Upgrade
Upgrade
symfony/ux-live-componentto a version that resolves this vulnerability.Fixed in 2.36.0 - Upgrade
Upgrade
symfony/ux-live-componentto a version that resolves this vulnerability.Fixed in 3.1.0 - Configuration
Ensure cross-origin callers include the request header X-Requested-With: XMLHttpRequest for requests that invoke #[LiveAction] (isLiveComponentRequest() now requires X-Requested-With: XMLHttpRequest in addition to the Accept gate).
Symfony UX LiveComponent (LiveComponentSubscriber::isLiveComponentRequest) X-Requested-With request header = XMLHttpRequest
Event History
Frequently Asked Questions
What is the severity of CVE-2026-49215?
The severity of CVE-2026-49215 is low with a CVSS score of 2.1.
How do I fix CVE-2026-49215?
To fix CVE-2026-49215, update to the latest version of the symfony/ux-live-component package that addresses the CSRF protection bypass.
What is the impact of CVE-2026-49215?
CVE-2026-49215 allows invokable methods annotated with #[LiveAction] to mutate server-side state, potentially leading to unauthorized actions.
Which software is affected by CVE-2026-49215?
CVE-2026-49215 affects the symfony/ux-live-component package used in Symfony UX applications.
When was CVE-2026-49215 published?
CVE-2026-49215 was published on June 19, 2026.