A HEAD request can reach a page that your access_control rules or firewalls only protect for GET. The controller runs with no access check. The response has no body, but its headers can leak information, and any side effects of the controller still happen.
Symfony's router answers HEAD with the GET handler, but the request matchers behind these rules compared methods exactly. This is the same gap CVE-2026-45075 fixed for the #[IsGranted], #[IsSignatureValid] and #[IsCsrfTokenValid] attributes.
Who is affected
Apps on symfony/http-foundation (also part of symfony/symfony) with:
- an
access_controlentry undersecuritythat setsmethodsto includeGETbut notHEAD - a firewall with a
methodsoption set the same way - their own
RequestMatcherorMethodRequestMatcherused for a method-restricted decision
Rules without a methods option apply to every method and aren't affected. See the Symfony advisory.
What to do
Update to 5.4.56, 6.4.50, 7.4.23 or 8.1.11. If you're on 8.0, update to 8.1.11. The fix (5.4, 6.4) adds HEAD to any method list that has GET. If you had a separate rule for HEAD after a GET rule for the same path, move it first, as you would for routes.
Reported by Ivan Tse.