CVE-2026-87080
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode.
The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label.
Net::IDN::Punycode uses this backend wherever the XS does not build.
The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
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
- High
- Integrity
- None
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.1
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode.
The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label.
Net::IDN::Punycode uses this backend wherever the XS does not build.
The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
- Record
CVE-2026-87080- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-1286
- Updated
- 2026-11-02
EUVDEUVD-2026-84293
9.1
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode.
The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label.
Net::IDN::Punycode uses this backend wherever the XS does not build.
The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
- Record
EUVD-2026-84293- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-m8c4-89qh-3j3f
9.1
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name...
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode.
The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label.
Net::IDN::Punycode uses this backend wherever the XS does not build.
The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
- Record
GHSA-m8c4-89qh-3j3f- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-1286
- Updated
- 2026-11-02
NVD
9.1
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode.
The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label.
Net::IDN::Punycode uses this backend wherever the XS does not build.
The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
- Record
CVE-2026-87080- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-1286
- Updated
- 2026-11-02
OSV
9.1
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode.
The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label.
Net::IDN::Punycode uses this backend wherever the XS does not build.
The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
- Record
CVE-2026-87080- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-1286
- Updated
- 2026-11-07
OSVDEBIAN-CVE-2026-87080
9.1
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode. The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label. Net::IDN::Punycode uses this backend wherever the XS does not build. The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
- Record
DEBIAN-CVE-2026-87080- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Updated
- 2026-11-03
OSVUBUNTU-CVE-2026-87080
9.1
Net::IDN::Punycode::PP versions before 2.590 for Perl decode a truncated label to a name containing a character it never encoded in decode_punycode. The pure-Perl decoder reads one digit at a time with four-argument substr and tests the result with defined to detect the end of the input. substr on an exhausted string returns the empty string rather than undef, so decoding continues past the end. The empty string converts to a digit value below the range, reducing the accumulator, and the decoder derives one extra code point and its position from it. The result is deterministic. The XS backend rejects the same label. Net::IDN::Punycode uses this backend wherever the XS does not build. The two backends disagree about what such a label means, so a sender can pick a label that one installation resolves to a name and another rejects.
- Record
UBUNTU-CVE-2026-87080- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Updated
- 2026-11-02
OSVopenSUSE-SU-2026:12468-1 No score
perl-Net-IDN-Encode-2.600.0-1.1 on GA media
These are all security issues fixed in the perl-Net-IDN-Encode-2.600.0-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:12468-1- Updated
- 2026-11-07
Affected packages
| Package | Affected | Fixed |
|---|---|---|
libnet-idn-encode-perlDebian:12 |
All versions, plus listed versions 2.500-32.500-52.502-12.600-1 |
None known |
libnet-idn-encode-perlDebian:13 |
All versions, plus listed versions 2.500-52.502-12.600-1 |
None known |
libnet-idn-encode-perlDebian:14 |
before 2.600-1, plus listed versions 2.500-52.502-1 |
2.600-1 |
libnet-idn-encode-perlUbuntu:16.04:LTS |
All versions, plus listed versions 2.202-12.300-12.300-1build1 |
None known |
libnet-idn-encode-perlUbuntu:18.04:LTS |
All versions, plus listed versions 2.400-1build1 |
None known |
libnet-idn-encode-perlUbuntu:20.04:LTS |
All versions, plus listed versions 2.500-12.500-1build1 |
None known |
libnet-idn-encode-perlUbuntu:22.04:LTS |
All versions, plus listed versions 2.500-1build22.500-22.500-2build1 |
None known |
libnet-idn-encode-perlUbuntu:24.04:LTS |
All versions, plus listed versions 2.500-32.500-3build12.500-3build22.500-5 |
None known |
libnet-idn-encode-perlUbuntu:26.10 |
All versions, plus listed versions 2.500-5build12.500-5build2 |
None known |
libnet-idn-encode-perlUbuntu:26.04:LTS |
All versions, plus listed versions 2.500-5build1 |
None known |
perl-Net-IDN-EncodeopenSUSE:Tumbleweed From an advisory covering 7 CVEs |
before 2.600.0-1.1 | 2.600.0-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, aliases, references | ||
| facts | OSV | |
| affected, facts | OSV | |
| 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-87080 is a critical vulnerability (CVSS 9.1) in libnet-idn-encode-perl, published September 22, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.39%, the 33rd percentile. Fixed in libnet-idn-encode-perl 2.600-1.
References
metacpan.org/release/PJCJ/Net-IDN-Encode-2.590-TRIAL/changes
github.com/robrwo/Net-IDN-Encode/commit/48436c7ad2c4d4c6398110e11133754fc476a783.patch
openwall.com/lists/oss-security/2026/09/22/15
nvd.nist.gov/vuln/detail/CVE-2026-87080
github.com/advisories/GHSA-m8c4-89qh-3j3f
cpan.org/modules
Show 13 moreShow less
github.com/CVEProject/cvelistV5/tree/main/cves/2026/87xxx/CVE-2026-87080.json
github.com/robrwo/Net-IDN-Encode
security-tracker.debian.org/tracker/CVE-2026-87080
ubuntu.com/security/CVE-2026-87080
cve.org/CVERecord?id=CVE-2026-87080
lists.security.metacpan.org/cve-announce/msg/43753025
suse.com/security/cve/CVE-2026-74765
suse.com/security/cve/CVE-2026-74766
suse.com/security/cve/CVE-2026-87078
suse.com/security/cve/CVE-2026-87079
suse.com/security/cve/CVE-2026-87080
suse.com/security/cve/CVE-2026-87081
suse.com/security/cve/CVE-2026-87082