IDN Label Mismatch Vulnerability in Perl Punycode Decoder
CVSS 3.1
9.1critical
EPSS
—
Published
()
Modified
AI analysis
CVE-2026-87080 is a logic flaw in the pure-Perl Punycode decoder (Net::IDN::Punycode::PP) that processes truncated IDN labels incorrectly, reading past the end of the input string and deriving an extra character. This leads to a deterministic but incorrect decoding result. An attacker can craft a malicious IDN label that resolves successfully on systems using the vulnerable Perl backend but is rejected by systems using the XS backend, potentially causing inconsistencies in security-critical name resolution. The flaw is in the 'PP' backend, which is used when the XS backend fails to compile. As of the report, there is no known public exploit or exploitation in the wild.
What to do: Update Net::IDN::Punycode::PP to version 2.590 or later. Check your system's Perl modules for the installed version. Systems using the XS backend are not vulnerable.
Affected
Perl CPAN Net::IDN::Punycode::PP
before 2.590
Estimated exposure
—No basis for an estimate.
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
Description
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.
Net::IDN::Punycode::PP Perl module before 2.590 decodes truncated punycode labels into names containing characters that were never encoded.
CVE-2026-87080 affects the pure-Perl punycode decoder in Net::IDN::Encode versions before 2.590. Truncated labels decode to names containing characters that were never encoded, which could enable IDN homograph-style spoofing in software relying on the module. The disclosure was posted to oss-security by Paul Johnson on September 22, 2026.