{"id":"CVE-2026-46644","aliases":["CLSA-2026-1788334122","DEBIAN-CVE-2026-46644","EUVD-2026-44537","GHSA-2xf4-cg6j-vhgq","UBUNTU-CVE-2026-46644"],"status":"published","title":"symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload decodes to ASCII-only: insecure equivalence","description":"Symfony Polyfill backports PHP features and provides compatibility layers for extensions and functions. From 1.17.1 until 1.38.1, symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload is empty or decodes to ASCII-only code points because Idn::process() does not enforce the UTS #46 revision 33 requirement that decoded ACE labels contain at least one non-ASCII code point. Originally unequal domain names can be regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing, and server-side request forgery in applications using the polyfill to canonicalise or compare hostnames. This issue is fixed in version 1.38.1.","severity":{"version":"4.0","score":6.9,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-09","score":0.00538,"percentile":0.45564,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-1289"],"published":"2026-05-28T19:52:36Z","modified":"2026-10-28T02:30:32Z","fixes":[{"ecosystem":"Packagist","package":"symfony/polyfill","fixed_in":["1.38.1"],"sources":["ghsa","osv"]},{"ecosystem":"Packagist","package":"symfony/polyfill-intl-idn","fixed_in":["1.38.1"],"sources":["ghsa","osv"]},{"ecosystem":"TuxCare:Packagist","package":"symfony/polyfill-intl-idn","fixed_in":["v1.30.0-p1+tuxcare"],"sources":["osv"]},{"ecosystem":"Debian:14","package":"php-symfony-polyfill","fixed_in":["1.38.1-1"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"Packagist","package":"symfony/polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.17.1"},{"fixed":"1.38.1"}]}]},{"source":"ghsa","ecosystem":"Packagist","package":"symfony/polyfill-intl-idn","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.17.1"},{"fixed":"1.38.1"}]}]},{"source":"osv","ecosystem":"TuxCare:Packagist","package":"symfony/polyfill-intl-idn","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"v1.30.0"},{"fixed":"v1.30.0-p1+tuxcare"}]}],"versions":["v1.30.0"]},{"source":"osv","ecosystem":"Debian:12","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.27.0-2","1.28.0-1","1.29.0-1","1.29.0-2","1.29.0-3","1.30.0-1","1.31.0-1","1.31.0-2","1.31.0-3","1.31.0-4","1.31.0-5","1.32.0-1","1.33.0-1","1.33.0-2","1.33.0-3","1.33.0-4","1.33.0-5","1.33.0-6","1.36.0-1","1.37.0-1","1.38.1-1","1.40.0-1","1.40.0-2","1.41.0-1","1.41.0-2","1.42.0-1","1.42.0-2"]},{"source":"osv","ecosystem":"Debian:14","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"1.38.1-1"}]}],"versions":["1.1.0-1","1.1.1-1","1.17.0-1","1.17.0-2","1.17.1-1","1.18.0-1","1.18.1-1","1.2.0-1","1.21.0-1","1.21.0-2","1.22.0-1","1.22.0-1~exp1","1.22.0-2","1.22.0-3","1.22.1-1","1.23.0-1","1.23.1-1","1.23.1-2","1.24.0-1","1.25.0-1","1.25.0-2","1.25.0-3","1.25.0-4","1.26.0-1","1.26.0-2","1.26.0-3","1.27.0-1","1.27.0-1~new","1.27.0-2","1.28.0-1","1.29.0-1","1.29.0-2","1.29.0-3","1.30.0-1","1.31.0-1","1.31.0-2","1.31.0-3","1.31.0-4","1.31.0-5","1.32.0-1","1.33.0-1","1.33.0-2","1.33.0-3","1.33.0-4","1.33.0-5","1.33.0-6","1.36.0-1","1.37.0-1","1.5.0-1","1.6.0-1","1.6.0-2","1.7.0-1","1.8.0-1","1.9.0-1"]},{"source":"osv","ecosystem":"Packagist","package":"symfony/polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.17.1"},{"fixed":"1.38.1"}]}],"versions":["v1.17.1","v1.18.0","v1.18.1","v1.19.0","v1.20.0","v1.22.0","v1.22.1","v1.23.0","v1.23.1","v1.24.0","v1.25.0","v1.26.0","v1.27.0","v1.28.0","v1.29.0","v1.30.0","v1.31.0","v1.32.0","v1.33.0","v1.34.0","v1.35.0","v1.36.0","v1.37.0","v1.38.0"]},{"source":"osv","ecosystem":"Packagist","package":"symfony/polyfill-intl-idn","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.17.1"},{"fixed":"1.38.1"}]}],"versions":["v1.17.1","v1.18.0","v1.18.1","v1.19.0","v1.20.0","v1.22.0","v1.22.1","v1.23.0","v1.24.0","v1.25.0","v1.26.0","v1.27.0","v1.28.0","v1.29.0","v1.30.0","v1.31.0","v1.32.0","v1.33.0","v1.34.0","v1.35.0","v1.36.0","v1.37.0"]},{"source":"osv","ecosystem":"Ubuntu:18.04:LTS","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.2.0-1ubuntu1","1.6.0-1","1.6.0-2"]},{"source":"osv","ecosystem":"Ubuntu:22.04:LTS","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.22.1-1","1.23.1-1","1.24.0-1ubuntu1","1.24.0-1ubuntu2"]},{"source":"osv","ecosystem":"Ubuntu:24.04:LTS","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.27.0-2","1.28.0-1"]},{"source":"osv","ecosystem":"Ubuntu:25.10","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.31.0-4ubuntu1","1.31.0-5ubuntu1"]},{"source":"osv","ecosystem":"Ubuntu:26.10","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.33.0-6ubuntu1","1.37.0-1ubuntu1","1.40.0-2","1.41.0-2"]},{"source":"osv","ecosystem":"Ubuntu:26.04:LTS","package":"php-symfony-polyfill","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.31.0-5ubuntu1","1.33.0-4ubuntu1","1.33.0-5ubuntu1","1.33.0-6ubuntu1"]}],"products":[{"vendor":"symfony","product":"polyfill"},{"vendor":"symfony","product":"polyfill-intl-idn"}],"references":[{"url":"https://github.com/symfony/polyfill/security/advisories/GHSA-2xf4-cg6j-vhgq","tags":["x_refsource_CONFIRM","advisory","web","report"]},{"url":"https://github.com/symfony/polyfill/commit/1be936e2491ccebe152bd736dfc91eb1422c8bec","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/symfony/polyfill/releases/tag/v1.38.1","tags":["x_refsource_MISC","web"]},{"url":"https://github.com/FriendsOfPHP/security-advisories/blob/master/symfony/polyfill-intl-idn/CVE-2026-46644.yaml","tags":["web"]},{"url":"https://github.com/FriendsOfPHP/security-advisories/blob/master/symfony/polyfill/CVE-2026-46644.yaml","tags":["web"]},{"url":"https://symfony.com/cve-2026-46644","tags":["web"]},{"url":"https://github.com/advisories/GHSA-2xf4-cg6j-vhgq"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/46xxx/CVE-2026-46644.json","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-46644","tags":["advisory"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-46644","tags":["advisory"]},{"url":"https://github.com/symfony/polyfill","tags":["package"]},{"url":"https://ubuntu.com/security/CVE-2026-46644","tags":["report"]},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-46644","tags":["report"]},{"url":"https://symfony.com/blog/cve-2026-46644-insecure-equivalence-in-symfony-polyfill-intl-idn-for-ascii-only-xn-labels","tags":["report"]}],"sources":{"cve":[{"id":"CVE-2026-46644","title":"symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload decodes to ASCII-only: insecure equivalence","description":"Symfony Polyfill backports PHP features and provides compatibility layers for extensions and functions. From 1.17.1 until 1.38.1, symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload is empty or decodes to ASCII-only code points because Idn::process() does not enforce the UTS #46 revision 33 requirement that decoded ACE labels contain at least one non-ASCII code point. Originally unequal domain names can be regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing, and server-side request forgery in applications using the polyfill to canonicalise or compare hostnames. This issue is fixed in version 1.38.1.","status":"published","published":"2026-07-14T20:48:31.771Z","modified":"2026-07-15T12:52:31.603Z","cvss":[{"version":"4.0","score":6.9,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium","assessor":"cna"}],"cwes":["CWE-1289"],"updated_at":"2026-11-02T13:46:55.086623Z"}],"euvd":[{"id":"EUVD-2026-44537","description":"Symfony Polyfill backports PHP features and provides compatibility layers for extensions and functions. From 1.17.1 until 1.38.1, symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload is empty or decodes to ASCII-only code points because Idn::process() does not enforce the UTS #46 revision 33 requirement that decoded ACE labels contain at least one non-ASCII code point. Originally unequal domain names can be regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing, and server-side request forgery in applications using the polyfill to canonicalise or compare hostnames. This issue is fixed in version 1.38.1.","status":"published","published":"2026-07-14T20:48:31Z","modified":"2026-07-15T12:52:31Z","cvss":[{"version":"4.0","score":6.9,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium"}],"updated_at":"2026-11-02T18:19:53.226345Z"}],"ghsa":[{"id":"GHSA-2xf4-cg6j-vhgq","title":"symfony/polyfill-intl-idn: xn-- labels with ASCII-only Punycode payloads are treated as equivalent to their decoded form","description":"### Description\n\n`symfony/polyfill-intl-idn` provides a userland implementation of `idn_to_utf8()` and `idn_to_ascii()` for runtimes that lack the `intl` extension. Its `Idn::process()` method decodes labels prefixed with `xn--` using Punycode but never enforces the validity criterion added in UTS #46 revision 33 Section 4 step 4.1.2: after a successful Punycode decode, the result must contain at least one non-ASCII code point.\n\nAs a consequence, `xn--` labels whose Punycode payload is empty (`xn--`) or decodes to a string made of only ASCII code points (e.g. `xn--kc1zs4-`) are accepted by the polyfill while PHP's native `ext-intl` rejects them with `IDNA_ERROR_INVALID_ACE_LABEL`. Originally unequal domain names are therefore regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing and server-side request forgery (similar to CVE-2024-12224).\n\nExample with `IDNA_USE_STD3_RULES | IDNA_CHECK_BIDI | IDNA_CHECK_CONTEXTJ | IDNA_NONTRANSITIONAL_TO_ASCII`:\n\n| Input | Polyfill output | Native `ext-intl` output |\n| --- | --- | --- |\n| `poc.xn--kc1zs4-.com` | `poc.kc1zs4.com` | `false` (`errors=1024`) |\n| `poc.kc1zs4.xn--` | `poc.kc1zs4.` | `false` (`errors=1024`) |\n\nApplications using the polyfill to canonicalise or compare hostnames inherit the inconsistency.\n\n### Resolution\n\n`Idn::process()` now records `IDNA_ERROR_INVALID_ACE_LABEL` when a Punycode payload decodes to an empty string or to a string containing only ASCII code points, matching the native `ext-intl` behaviour and UTS #46 revision 33.\n\nThe patch for this issue is available [here](https://github.com/symfony/polyfill/commit/1be936e2491ccebe152bd736dfc91eb1422c8bec) for branch 1.x.\n\n### Credits\n\nSymfony would like to thank Nazy Mad for reporting the issue and Nicolas Grekas for providing the fix.","status":"published","published":"2026-05-28T19:52:36Z","modified":"2026-05-28T19:52:37Z","cvss":[{"version":"4.0","score":2.7,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N/E:U","level":"low"}],"cwes":["CWE-1289"],"updated_at":"2026-11-02T14:40:14.666177Z"}],"nvd":[{"id":"CVE-2026-46644","description":"Symfony Polyfill backports PHP features and provides compatibility layers for extensions and functions. From 1.17.1 until 1.38.1, symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload is empty or decodes to ASCII-only code points because Idn::process() does not enforce the UTS #46 revision 33 requirement that decoded ACE labels contain at least one non-ASCII code point. Originally unequal domain names can be regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing, and server-side request forgery in applications using the polyfill to canonicalise or compare hostnames. This issue is fixed in version 1.38.1.","status":"published","published":"2026-07-14T21:16:55.85Z","modified":"2026-07-15T18:16:22.887Z","cvss":[{"version":"4.0","score":6.9,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"medium","assessor":"secondary"}],"cwes":["CWE-1289"],"updated_at":"2026-11-02T14:12:29.879716Z"}],"osv":[{"id":"CVE-2026-46644","title":"symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload decodes to ASCII-only: insecure equivalence","description":"Symfony Polyfill backports PHP features and provides compatibility layers for extensions and functions. From 1.17.1 until 1.38.1, symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload is empty or decodes to ASCII-only code points because Idn::process() does not enforce the UTS #46 revision 33 requirement that decoded ACE labels contain at least one non-ASCII code point. Originally unequal domain names can be regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing, and server-side request forgery in applications using the polyfill to canonicalise or compare hostnames. This issue is fixed in version 1.38.1.","status":"published","published":"2026-07-14T20:48:31.771Z","modified":"2026-10-28T02:30:32.832843667Z","cvss":[{"version":"4.0","score":6.9,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium"}],"cwes":["CWE-1289"],"updated_at":"2026-11-02T15:45:06.231145Z"},{"id":"DEBIAN-CVE-2026-46644","description":"Symfony Polyfill backports PHP features and provides compatibility layers for extensions and functions. From 1.17.1 until 1.38.1, symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload is empty or decodes to ASCII-only code points because Idn::process() does not enforce the UTS #46 revision 33 requirement that decoded ACE labels contain at least one non-ASCII code point. Originally unequal domain names can be regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing, and server-side request forgery in applications using the polyfill to canonicalise or compare hostnames. This issue is fixed in version 1.38.1.","status":"published","published":"2026-07-14T21:16:55.85Z","modified":"2026-10-01T03:03:15.812214086Z","cvss":[{"version":"4.0","score":6.9,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"medium"}],"updated_at":"2026-11-02T15:45:56.444225Z"},{"id":"GHSA-2xf4-cg6j-vhgq","title":"symfony/polyfill-intl-idn: xn-- labels with ASCII-only Punycode payloads are treated as equivalent to their decoded form","description":"### Description\n\n`symfony/polyfill-intl-idn` provides a userland implementation of `idn_to_utf8()` and `idn_to_ascii()` for runtimes that lack the `intl` extension. Its `Idn::process()` method decodes labels prefixed with `xn--` using Punycode but never enforces the validity criterion added in UTS #46 revision 33 Section 4 step 4.1.2: after a successful Punycode decode, the result must contain at least one non-ASCII code point.\n\nAs a consequence, `xn--` labels whose Punycode payload is empty (`xn--`) or decodes to a string made of only ASCII code points (e.g. `xn--kc1zs4-`) are accepted by the polyfill while PHP's native `ext-intl` rejects them with `IDNA_ERROR_INVALID_ACE_LABEL`. Originally unequal domain names are therefore regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing and server-side request forgery (similar to CVE-2024-12224).\n\nExample with `IDNA_USE_STD3_RULES | IDNA_CHECK_BIDI | IDNA_CHECK_CONTEXTJ | IDNA_NONTRANSITIONAL_TO_ASCII`:\n\n| Input | Polyfill output | Native `ext-intl` output |\n| --- | --- | --- |\n| `poc.xn--kc1zs4-.com` | `poc.kc1zs4.com` | `false` (`errors=1024`) |\n| `poc.kc1zs4.xn--` | `poc.kc1zs4.` | `false` (`errors=1024`) |\n\nApplications using the polyfill to canonicalise or compare hostnames inherit the inconsistency.\n\n### Resolution\n\n`Idn::process()` now records `IDNA_ERROR_INVALID_ACE_LABEL` when a Punycode payload decodes to an empty string or to a string containing only ASCII code points, matching the native `ext-intl` behaviour and UTS #46 revision 33.\n\nThe patch for this issue is available [here](https://github.com/symfony/polyfill/commit/1be936e2491ccebe152bd736dfc91eb1422c8bec) for branch 1.x.\n\n### Credits\n\nSymfony would like to thank Nazy Mad for reporting the issue and Nicolas Grekas for providing the fix.","status":"published","published":"2026-05-28T19:52:36Z","modified":"2026-09-10T03:51:04.192819875Z","cvss":[{"version":"4.0","score":2.7,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N/E:U","level":"low"}],"cwes":["CWE-1289"],"updated_at":"2026-11-02T15:46:35.050232Z"},{"id":"UBUNTU-CVE-2026-46644","description":"Symfony Polyfill backports PHP features and provides compatibility layers for extensions and functions. From 1.17.1 until 1.38.1, symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload is empty or decodes to ASCII-only code points because Idn::process() does not enforce the UTS #46 revision 33 requirement that decoded ACE labels contain at least one non-ASCII code point. Originally unequal domain names can be regarded as equal, which can lead to blacklist bypassing, inconsistent URL parsing, and server-side request forgery in applications using the polyfill to canonicalise or compare hostnames. This issue is fixed in version 1.38.1.","status":"published","published":"2026-07-14T21:16:00Z","modified":"2026-10-17T13:00:14.409543429Z","cvss":[{"version":"4.0","score":6.9,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N","level":"medium"}],"updated_at":"2026-11-02T16:56:30.797112Z"},{"id":"CLSA-2026-1788334122","title":"TuxCare security update for symfony/polyfill-intl-idn (1 CVE)","description":"TuxCare rebuilt symfony/polyfill-intl-idn to address 1 CVE. Fixed in v1.30.0-p1+tuxcare.","status":"published","published":"2026-09-02T07:28:42Z","modified":"2026-10-15T09:48:00.460356873Z","updated_at":"2026-11-02T15:43:47.591214Z"}]}}
