CVE-2026-48736: Symfony: IpUtils::PRIVATE_SUBNETS Omits IPv6 Transition Forms (6to4, NAT64, Teredo, IPv4-compatible): SSRF Bypass in NoPrivateNetworkHttpClient
Description
Symfony\Component\HttpClient\NoPrivateNetworkHttpClient is documented as a decorator that blocks requests to private networks by default. The list of blocked subnets (Symfony\Component\HttpFoundation\IpUtils::PRIVATESUBNETS on 6.4+, a private constant in NoPrivateNetworkHttpClient on 5.4) enumerates RFC1918, loopback, link-local and IPv4-mapped IPv6 (::ffff:0:0/96) prefixes, but omits the remaining IPv6 transition forms that can embed a private IPv4 destination: 6to4 (2002::/16, RFC 3056), Teredo (2001::/32, RFC 4380), NAT64 (64:ff9b::/96, RFC 6052 and 64:ff9b:1::/48, RFC 8215) and IPv4-compatible IPv6 (::/96, RFC 4291 §2.5.5.1).
IpUtils::checkIp6() is a pure bitwise CIDR comparison against the constants list and never extracts the embedded IPv4, so an attacker who can supply a URL writes the loopback / RFC1918 IPv4 target as e.g. http://[2002:7f00:1::]/ (6to4 → 127.0.0.1), http://[64:ff9b::7f00:1]/ (NAT64 → 127.0.0.1), http://[::7f00:1]/ (IPv4-compatible → 127.0.0.1) or http://[2001::1]/ (Teredo). IpUtils::isPrivateIp() returns false and NoPrivateNetworkHttpClient dispatches the request.
Real-world reachability of the embedded IPv4 depends on the deploy's IPv6 routing (6to4 tunnel interface, upstream NAT64 gateway, kernel handling of IPv4-compatible addresses), but the security boundary the decorator promises — the dispatch decision — is crossed regardless of whether the packet ultimately lands on the embedded IPv4.
Resolution
The private-subnet list now includes ::/96, 2002::/16, 2001::/32, 64:ff9b::/96 and 64:ff9b:1::/48. Blanket blocking of these prefixes matches the policy applied by Chromium and Mozilla's Private Network Access; server-side HTTPS APIs are not legitimately published on these prefixes.
The patches for this issue are available here for branch 5.4 and here for branch 6.4 (and forward-ported to 7.4, 8.0 and 8.1).
Credits
Symfony would like to thank tonghuaroot for reporting the issue and Nicolas Grekas for providing the fix.
Other sources
Symfony is a PHP framework for web and console applications and a set of reusable PHP components. From 5.4.0 to 5.4.53, 6.4.41, 7.4.13, and 8.0.13, NoPrivateNetworkHttpClient and IpUtils::PRIVATESUBNETS omitted IPv6 transition prefixes such as 6to4, NAT64, Teredo, and IPv4-compatible IPv6, allowing attacker-supplied URLs to represent private IPv4 targets in forms that IpUtils::isPrivateIp() did not block. This issue is fixed in versions 5.4.53, 6.4.41, 7.4.13, and 8.0.13.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
composer/symfony/symfonyto a version that resolves this vulnerability.Fixed in 8.0.13 - Upgrade
Upgrade
composer/symfony/symfonyto a version that resolves this vulnerability.Fixed in 7.4.13 - Upgrade
Upgrade
composer/symfony/symfonyto a version that resolves this vulnerability.Fixed in 6.4.41 - Upgrade
Upgrade
composer/symfony/symfonyto a version that resolves this vulnerability.Fixed in 5.4.53 - Upgrade
Upgrade
composer/symfony/http-foundationto a version that resolves this vulnerability.Fixed in 8.0.13 - Upgrade
Upgrade
composer/symfony/http-foundationto a version that resolves this vulnerability.Fixed in 7.4.13 - Upgrade
Upgrade
composer/symfony/http-foundationto a version that resolves this vulnerability.Fixed in 6.4.41 - Upgrade
Upgrade
composer/symfony/http-clientto a version that resolves this vulnerability.Fixed in 5.4.53 - Upgrade
Upgrade
Symfonyto a version that resolves this vulnerability.Fixed in 5.4.53 - Upgrade
Upgrade
Symfonyto a version that resolves this vulnerability.Fixed in 6.4.41 - Upgrade
Upgrade
Symfonyto a version that resolves this vulnerability.Fixed in 7.4.13 - Upgrade
Upgrade
Symfonyto a version that resolves this vulnerability.Fixed in 8.0.13 - Configuration
Update the blocked private-subnet list used by IpUtils::PRIVATE_SUBNETS (6.4+) and the private constant in NoPrivateNetworkHttpClient (5.4) to include the IPv6 transition prefixes ::/96, 2002::/16, 2001::/32, 64:ff9b::/96, and 64:ff9b:1::/48 to prevent SSRF bypass via embedded IPv4 destinations.
Symfony\Component\HttpFoundation\IpUtils::PRIVATE_SUBNETS / Symfony\Component\HttpClient\NoPrivateNetworkHttpClient PRIVATE_SUBNETS list (blocked subnets) = Add IPv6 transition forms: ::/96, 2002::/16, 2001::/32, 64:ff9b::/96, 64:ff9b:1::/48
Event History
Frequently Asked Questions
What is the severity of CVE-2026-48736?
The severity of CVE-2026-48736 is rated as risk 65.
What does CVE-2026-48736 affect?
CVE-2026-48736 affects components of the Symfony framework, including Symfony HttpClient and HttpFoundation.
How can I mitigate the risks associated with CVE-2026-48736?
To mitigate the risks of CVE-2026-48736, ensure that you are using the latest version of Symfony where the vulnerability is patched.
What type of vulnerability is CVE-2026-48736 classified as?
CVE-2026-48736 is classified as a Server-Side Request Forgery (SSRF) vulnerability.
How does the NoPrivateNetworkHttpClient relate to CVE-2026-48736?
The NoPrivateNetworkHttpClient in Symfony is designed to block requests to private networks, which is crucial in preventing exploitation related to CVE-2026-48736.