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.
Published: 2026-09-22
Score: 9.1 Critical
EPSS: < 1% Very Low
KEV: No
Impact: Domain spoofing and inconsistent DNS name resolution
Action: Patch Immediately
AI Analysis

Impact

The vulnerability in versions of Net::IDN::Punycode::PP before 2.590 causes the pure‑Perl Punycode decoder to read past the end of a label. When the decoder slices an exhausted string it receives an empty string instead of undefined, which is treated as an invalid digit and reduces the accumulated value. This logic produces an extra Unicode code point, leading the decoder to return a hostname that contains a character it never encoded. The XS backend does not exhibit this behaviour; it rejects the problematic label. The discrepancy makes the result deterministic but inconsistent between installations that use the pure‑Perl decoder and those that use the XS backend.

Affected Systems

The affected product is the Perl module Net::IDN::Punycode::PP. Versions earlier than 2.590 are impacted because the pure‑Perl decoder is used when the XS backend cannot be built. Systems that rely on this module for Punycode decoding – for example, web applications, DNS libraries, or any software that performs IDN validation – are susceptible to inconsistent hostname resolution.

Risk and Exploitability

Because the flaw lies in how Punycode is decoded, an attacker can craft a Punycode label that will resolve to one name on a vulnerable system while resolving to a different name on a system that has the fixed parser or the XS backend. This discrepancy can be exploited to bypass hostname checks, impersonate domains, or facilitate phishing and social‑engineering attacks. The CVSS score is 9.1, and the EPSS score is < 1%, indicating limited publicly known exploitation. The flaw is not listed in CISA KEV, but the deterministic nature of the bug means the risk is primarily in environments where hostname consistency is critical.

Generated by OpenCVE AI on September 22, 2026 at 17:46 UTC.

Remediation

Vendor Solution

Upgrade to Net-IDN-Encode 2.590-TRIAL or later.


OpenCVE Recommended Actions

  • Upgrade Net‑IDN‑Encode to version 2.590‑TRIAL or later, which corrects the Punycode decoding logic.
  • Verify that all components using Net::IDN::Punycode::PP are updated to the newer release or that the XS backend is installed and used exclusively.
  • After updating, test hostname resolution for known domain aliases to confirm consistency, especially across authentication and TLS certificate validation flows.

Generated by OpenCVE AI on September 22, 2026 at 17:46 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Tue, 22 Sep 2026 18:30:00 +0000

Type Values Removed Values Added
References
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'none', 'Technical Impact': 'total'}, 'version': '2.0.3'}


Tue, 22 Sep 2026 16:30:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

{'score': 9.1, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H'}


Tue, 22 Sep 2026 07:30:00 +0000

Type Values Removed Values Added
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.
Title 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
Weaknesses CWE-1286
References

Subscriptions

No data.

cve-icon MITRE

Status: PUBLISHED

Assigner: CPANSec

Published:

Updated: 2026-09-22T17:07:30.035Z

Reserved: 2026-09-08T19:22:20.005Z

Link: CVE-2026-87080

cve-icon Vulnrichment

Updated: 2026-09-22T17:07:30.035Z

cve-icon NVD

Status : Deferred

Published: 2026-09-22T08:16:40.750

Modified: 2026-09-22T19:07:00.983

Link: CVE-2026-87080

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-22T18:00:17Z

Weaknesses
  • CWE-1286

    Improper Validation of Syntactic Correctness of Input