GIVE YOUR AGENT THE EVIDENCE

Set up in your agent.

One prompt to get started. Paste it into your coding agent to connect cve.new through MCP and bring vulnerability context into your workflow.

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

Read the setup guide

GIVE YOUR AGENT THE EVIDENCE

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

GHSA-4m4j-hmqq-3gxmlow2.1

symfony/ux-live-component: CSRF Protection Bypass — Accept Header is CORS-Safelisted

Check your stack

The advisory, in context

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.

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.

Ecosystem versions

From 2.22.0 before 2.36.0

Fixed in 2.36.0

22 explicitly affected versions

v2.22.0, v2.22.1, v2.23.0, v2.24.0, v2.25.0, v2.25.1, v2.25.2, v2.26.0, v2.26.1, v2.27.0, v2.28.0, v2.28.1, v2.28.2, v2.29.0, v2.29.1, v2.29.2, v2.30.0, v2.31.0, v2.32.0, v2.33.0, v2.34.0, v2.35.0

View affected-version evidence
{
  "ranges": [
    {
      "events": [
        {
          "introduced": "2.22.0"
        },
        {
          "fixed": "2.36.0"
        }
      ],
      "type": "ECOSYSTEM"
    }
  ],
  "versions": [
    "v2.22.0",
    "v2.22.1",
    "v2.23.0",
    "v2.24.0",
    "v2.25.0",
    "v2.25.1",
    "v2.25.2",
    "v2.26.0",
    "v2.26.1",
    "v2.27.0",
    "v2.28.0",
    "v2.28.1",
    "v2.28.2",
    "v2.29.0",
    "v2.29.1",
    "v2.29.2",
    "v2.30.0",
    "v2.31.0",
    "v2.32.0",
    "v2.33.0",
    "v2.34.0",
    "v2.35.0"
  ]
}
Ecosystem versions

From 3.0.0 before 3.1.0

Fixed in 3.1.0

1 explicitly affected versions

v3.0.0

View affected-version evidence
{
  "ranges": [
    {
      "events": [
        {
          "introduced": "3.0.0"
        },
        {
          "fixed": "3.1.0"
        }
      ],
      "type": "ECOSYSTEM"
    }
  ],
  "versions": [
    "v3.0.0"
  ]
}

References