CVE-2026-46644
symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload decodes to ASCII-only: insecure equivalence
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.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.9
symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload decodes to ASCII-only: insecure equivalence
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.
- Record
CVE-2026-46644- CVSS 4.0
- 6.9 Medium
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 - Weakness
- CWE-1289
- Updated
- 2026-11-02
EUVDEUVD-2026-44537
6.9
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.
- Record
EUVD-2026-44537- CVSS 4.0
- 6.9 Medium
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 - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-2xf4-cg6j-vhgq
2.7
symfony/polyfill-intl-idn: xn-- labels with ASCII-only Punycode payloads are treated as equivalent to their decoded form
Description
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.
As 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).
Example with IDNA_USE_STD3_RULES | IDNA_CHECK_BIDI | IDNA_CHECK_CONTEXTJ | IDNA_NONTRANSITIONAL_TO_ASCII:
| Input | Polyfill output | Native ext-intl output |
| --- | --- | --- |
| poc.xn--kc1zs4-.com | poc.kc1zs4.com | false (errors=1024) |
| poc.kc1zs4.xn-- | poc.kc1zs4. | false (errors=1024) |
Applications using the polyfill to canonicalise or compare hostnames inherit the inconsistency.
Resolution
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.
The patch for this issue is available here for branch 1.x.
Credits
Symfony would like to thank Nazy Mad for reporting the issue and Nicolas Grekas for providing the fix.
- Record
GHSA-2xf4-cg6j-vhgq- CVSS 4.0
- 2.7 Low
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 - Weakness
- CWE-1289
- Updated
- 2026-11-02
NVD
6.9
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.
- Record
CVE-2026-46644- CVSS 4.0
- 6.9 Medium
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 - Weakness
- CWE-1289
- Updated
- 2026-11-02
OSV
6.9
symfony/polyfill-intl-idn accepts xn-- labels whose Punycode payload decodes to ASCII-only: insecure equivalence
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.
- Record
CVE-2026-46644- CVSS 4.0
- 6.9 Medium
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 - Weakness
- CWE-1289
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-46644
6.9
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.
- Record
DEBIAN-CVE-2026-46644- CVSS 4.0
- 6.9 Medium
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 - Updated
- 2026-11-02
OSVGHSA-2xf4-cg6j-vhgq
2.7
symfony/polyfill-intl-idn: xn-- labels with ASCII-only Punycode payloads are treated as equivalent to their decoded form
Description
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.
As 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).
Example with IDNA_USE_STD3_RULES | IDNA_CHECK_BIDI | IDNA_CHECK_CONTEXTJ | IDNA_NONTRANSITIONAL_TO_ASCII:
| Input | Polyfill output | Native ext-intl output |
| --- | --- | --- |
| poc.xn--kc1zs4-.com | poc.kc1zs4.com | false (errors=1024) |
| poc.kc1zs4.xn-- | poc.kc1zs4. | false (errors=1024) |
Applications using the polyfill to canonicalise or compare hostnames inherit the inconsistency.
Resolution
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.
The patch for this issue is available here for branch 1.x.
Credits
Symfony would like to thank Nazy Mad for reporting the issue and Nicolas Grekas for providing the fix.
- Record
GHSA-2xf4-cg6j-vhgq- CVSS 4.0
- 2.7 Low
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 - Weakness
- CWE-1289
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-46644
6.9
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.
- Record
UBUNTU-CVE-2026-46644- CVSS 4.0
- 6.9 Medium
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 - Updated
- 2026-11-02
OSVCLSA-2026-1788334122 No score
TuxCare security update for symfony/polyfill-intl-idn (1 CVE)
TuxCare rebuilt symfony/polyfill-intl-idn to address 1 CVE. Fixed in v1.30.0-p1+tuxcare.
- Record
CLSA-2026-1788334122- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
symfony/polyfillPackagist |
1.17.1 up to 1.38.1 | 1.38.1 |
symfony/polyfill-intl-idnPackagist |
1.17.1 up to 1.38.1 | 1.38.1 |
symfony/polyfill-intl-idnTuxCare:Packagist |
v1.30.0 up to v1.30.0-p1+tuxcare | v1.30.0-p1+tuxcare |
php-symfony-polyfillDebian:12 |
All versions, plus listed versions 1.27.0-21.28.0-11.29.0-11.29.0-21.29.0-3 Show 22 moreShow less1.30.0-11.31.0-11.31.0-21.31.0-31.31.0-41.31.0-51.32.0-11.33.0-11.33.0-21.33.0-31.33.0-41.33.0-51.33.0-61.36.0-11.37.0-11.38.1-11.40.0-11.40.0-21.41.0-11.41.0-21.42.0-11.42.0-2 |
None known |
php-symfony-polyfillDebian:14 |
before 1.38.1-1, plus listed versions 1.1.0-11.1.1-11.17.0-11.17.0-21.17.1-1 Show 45 moreShow less1.18.0-11.18.1-11.2.0-11.21.0-11.21.0-21.22.0-11.22.0-1~exp11.22.0-21.22.0-31.22.1-11.23.0-11.23.1-11.23.1-21.24.0-11.25.0-11.25.0-21.25.0-31.25.0-41.26.0-11.26.0-21.26.0-31.27.0-11.27.0-1~new1.27.0-21.28.0-11.29.0-11.29.0-21.29.0-31.30.0-11.31.0-11.31.0-21.31.0-31.31.0-41.31.0-51.32.0-11.33.0-11.33.0-21.33.0-31.33.0-41.33.0-51.33.0-61.36.0-11.37.0-11.5.0-11.6.0-1 |
1.38.1-1 |
symfony/polyfillPackagist |
1.17.1 up to 1.38.1, plus listed versions v1.17.1v1.18.0v1.18.1v1.19.0v1.20.0 Show 19 moreShow lessv1.22.0v1.22.1v1.23.0v1.23.1v1.24.0v1.25.0v1.26.0v1.27.0v1.28.0v1.29.0v1.30.0v1.31.0v1.32.0v1.33.0v1.34.0v1.35.0v1.36.0v1.37.0v1.38.0 |
1.38.1 |
symfony/polyfill-intl-idnPackagist |
1.17.1 up to 1.38.1, plus listed versions v1.17.1v1.18.0v1.18.1v1.19.0v1.20.0 Show 17 moreShow lessv1.22.0v1.22.1v1.23.0v1.24.0v1.25.0v1.26.0v1.27.0v1.28.0v1.29.0v1.30.0v1.31.0v1.32.0v1.33.0v1.34.0v1.35.0v1.36.0v1.37.0 |
1.38.1 |
php-symfony-polyfillUbuntu:18.04:LTS |
All versions, plus listed versions 1.2.0-1ubuntu11.6.0-11.6.0-2 |
None known |
php-symfony-polyfillUbuntu:22.04:LTS |
All versions, plus listed versions 1.22.1-11.23.1-11.24.0-1ubuntu11.24.0-1ubuntu2 |
None known |
php-symfony-polyfillUbuntu:24.04:LTS |
All versions, plus listed versions 1.27.0-21.28.0-1 |
None known |
php-symfony-polyfillUbuntu:25.10 |
All versions, plus listed versions 1.31.0-4ubuntu11.31.0-5ubuntu1 |
None known |
php-symfony-polyfillUbuntu:26.10 |
All versions, plus listed versions 1.33.0-6ubuntu11.37.0-1ubuntu11.40.0-21.41.0-2 |
None known |
php-symfony-polyfillUbuntu:26.04:LTS |
All versions, plus listed versions 1.31.0-5ubuntu11.33.0-4ubuntu11.33.0-5ubuntu11.33.0-6ubuntu1 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-46644 is a medium vulnerability (CVSS 6.9) in Symfony Polyfill, published May 28, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.54%, the 45th percentile. Fixed in symfony/polyfill 1.38.1.
References
github.com/symfony/polyfill/security/advisories/GHSA-2xf4-cg6j-vhgq
github.com/symfony/polyfill/commit/1be936e2491ccebe152bd736dfc91eb1422c8bec
github.com/symfony/polyfill/releases/tag/v1.38.1
github.com/FriendsOfPHP/security-advisories/blob/master/symfony/polyfill-intl-idn/CVE-2026-46644.yaml
github.com/FriendsOfPHP/security-advisories/blob/master/symfony/polyfill/CVE-2026-46644.yaml
symfony.com/cve-2026-46644
Show 8 moreShow less
github.com/advisories/GHSA-2xf4-cg6j-vhgq
github.com/CVEProject/cvelistV5/tree/main/cves/2026/46xxx/CVE-2026-46644.json
nvd.nist.gov/vuln/detail/CVE-2026-46644
security-tracker.debian.org/tracker/CVE-2026-46644
github.com/symfony/polyfill
ubuntu.com/security/CVE-2026-46644
cve.org/CVERecord?id=CVE-2026-46644
symfony.com/blog/cve-2026-46644-insecure-equivalence-in-symfony-polyfill-intl-idn-for-ascii-only-xn-labels
Left out here: 4 versions. The JSON record has them.