Skip to main content

Net::IDN::UTS46 CVE-2026-87081

| EUVDEUVD-2026-84294 HIGH
Inefficient Algorithmic Complexity (CWE-407)
2026-09-22 CPANSec GHSA-653x-rhrr-h9h8
7.5
CVSS 3.1 · Vendor: CPANSec
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Submit crafted domain or email to Perl app
  2. Exploit
    Overlong non-ASCII label reaches to_ascii
  3. Execution
    Quadratic punycode encoding runs before length check
  4. Impact
    CPU exhaustion stalls worker/service

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V2 - Validation and Business Logic Algorithmic complexity limits
Exploitation Conditions

Exploitable when a Perl application passes attacker-controlled hostnames or email addresses into Net::IDN::UTS46 to_ascii or the wrappers domain_to_ascii / email_to_ascii (Net::IDN::Encode) for IDN normalization. The trigger is a single DNS label longer than 63 bytes composed of many distinct non-ASCII code points, which forces the RFC 3492 encoder into quadratic work before the length check rejects it. No authentication, user interaction, or non-default configuration is required (AV:N/PR:N/UI:N); the practical limiting factor is that the application must actually feed untrusted input through these normalization functions on a reachable code path, and versions before 2.590 must be installed.

Impact

This is a genuine but bounded availability risk. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, base 7.5) correctly scopes it as a network-reachable, unauthenticated, no-interaction denial-of-service with no confidentiality or integrity impact - the 'HIGH' rating comes entirely from A:H. Corroborating signals point away from urgency rather than toward it: EPSS is 0.15% (5th percentile), there is no CISA KEV listing, and SSVC records Exploitation=none with Technical Impact=partial. The one signal that raises priority is SSVC Automatable=yes - the quadratic-complexity trigger is cheap and scriptable, so an attacker who can reach a vulnerable code path can reliably burn CPU. Net assessment: a real but not emergency-priority DoS; patch on a normal cadence unless the affected Perl code is on a hot untrusted-input path. Note a metadata conflict: the input Tag says 'Information Disclosure,' but the CVSS vector, CWE-407 (Algorithmic Complexity), and the description all describe CPU-exhaustion DoS with C:N - the tag is mislabeled and should not drive triage.

Exploit ScenarioDerived

An attacker submits a single overlong domain label or email address composed of many distinct non-ASCII code points to a Perl service that normalizes hostnames or emails via Net::IDN::UTS46 (e.g. through domain_to_ascii or email_to_ascii). Because to_ascii punycode-encodes the label before applying the 63-byte DNS length check, the RFC 3492 encoder does O(n²) work before rejecting the input, spiking CPU and stalling the worker. No public weaponized exploit is identified - the fix commit ships only regression tests (uts46_quadratic-pp/xs.t), not an attack tool - and exploitation needs no authentication or user interaction given AV:N/PR:N/UI:N.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 22, 2026

CPU exhaustion in Net::IDN::UTS46 before version 2.590 lets a single crafted overlong IDN label consume disproportionate CPU, because to_ascii punycode-encodes each label before applying the 63-byte DNS length check and the RFC 3492 encoder's outer loop runs once per distinct non-ASCII code point while rescanning the whole label each pass. Remote, unauthenticated attackers (CVSS:3.1/AV:N/AC:L/PR:N/UI:N, availability-only impact A:H) who can reach Perl code that normalizes untrusted hostnames or email addresses through to_ascii, domain_to_ascii, or email_to_ascii can stall a request or worker with one input string. No public exploit code has been identified at time of analysis, the vulnerability is not in CISA KEV, and EPSS is low at 0.15% (5th percentile), so this is a genuine but bounded availability risk rather than a broadly exploited one.

RemediationAI

The primary fix is to upgrade to Net::IDN::Encode / Net::IDN::UTS46 2.590, which adds the pre-encoding length check; note that the MetaCPAN reference supplied is labelled a TRIAL release, so confirm a stable release of 2.590 (or later) is available in your CPAN mirror before deploying. The exact changes are visible in the upstream commits https://github.com/robrwo/Net-IDN-Encode/commit/5ac3315131264670efcd3a29857b651506dfee8e.patch and https://github.com/robrwo/Net-IDN-Encode/commit/ea34f812d7dc67f3b211f4d92e74c6a7e24d764a.patch. If upgrading is not immediately possible, apply an application-level guard that rejects any hostname label longer than 63 bytes (or an entire hostname beyond 253 bytes) before it reaches to_ascii, domain_to_ascii, email_to_ascii, or uts46_to_ascii; this is cheap and safe because such labels would be rejected anyway, though the trade-off is that naive length checks may reject some inputs on a different criterion than the library's UTS #46 validation and must be kept consistent with the 63-minus-IDNA-prefix boundary the patch uses. Additional compensating controls: wrap IDN normalization in a timeout or run it in a forked/out-of-process worker with alarm() so a quadratic input cannot pin a request handler - at the cost of some latency and complexity; and rate-limit or cap request body fields that carry hostnames and email addresses, which slows but does not eliminate repeated-trigger attempts. If your code calls Net::IDN::Punycode::encode_punycode directly, no version of that function limits its input, so enforce an explicit maximum label length in your own wrapper before calling it.

Affected ProductsAI

Net::IDN::UTS46 versions before 2.590, as shipped in the Net::IDN::Encode distribution, are affected on any platform running Perl; both the XS backend (Net::IDN::Punycode) and the pure-Perl fallback (Net::IDN::Punycode::PP) exhibit the quadratic behavior. The exposure surface extends to every ASCII conversion in the distribution that routes through to_ascii, explicitly including domain_to_ascii, email_to_ascii, and uts46_to_ascii, so applications performing IDN normalization of untrusted hostnames or email addresses are in scope, while Net::IDN::Punycode::encode_punycode called directly remains unbounded at any version unless the caller enforces its own limit. No CPE strings were supplied in the input data; the product identity is derived from the description, the CPANSec report, and the upstream repository commits. Version and changelog information is available at https://metacpan.org/release/PJCJ/Net-IDN-Encode-2.590-TRIAL/changes, with the corresponding EUVD/NVD advisory entry at https://nvd.nist.gov/vuln/detail/CVE-2026-87081.

Affects your stack

Find out whether the stacks and servers you run are on an affected version.

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The affected library implements UTS #46 / IDNA processing for Perl, converting Unicode labels to ASCII (A-label) form using the punycode algorithm of RFC 3492; CWE-407 (Inefficient Algorithmic Complexity) is the correct root-cause class, and the assessed vector carries C:N/I:N/A:H, i.e. denial of service with no confidentiality or integrity impact. In to_ascii the label is punycode-encoded first and only afterwards checked against the 63-byte DNS limit; because the RFC 3492 sample implementation's outer loop iterates once per distinct non-ASCII code point and rescans the entire input on every iteration, encoding cost grows quadratically with label length, so an overlong label of many distinct non-ASCII code points burns quadratic time before being rejected. Both backends are exposed: the XS (C) implementation and the pure-Perl Net::IDN::Punycode::PP fallback share the same algorithm, and the patch adds parallel regression tests (t/uts46_quadratic-xs.t and t/uts46_quadratic-pp.t) that fork a child, alarm(10), and feed a label built from every UTS #46-valid assigned code point in Unicode 10.0 repeated three times. The upstream fix in lib/Net/IDN/UTS46.pm short-circuits this in _process by croaking "label too long [A4_2]" when the label contains non-ASCII and length exceeds 63 minus the IDNA prefix length, since punycode never shortens a label. Notably, lib/Net/IDN/Punycode.pm changed only in documentation: encode_punycode still imposes no input length limit, so any code calling it directly with untrusted data remains exposed and must apply its own bound. One metadata inconsistency should be noted: the feed tag reads "Information Disclosure", which does not match the C:N/I:N/A:H vector or the CWE-407 root cause - the technical evidence supports denial of service only.

Know when Perl gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (CPANSec) PRIMARY 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
vuln.today AI 7.5 HIGH

Untrusted input reaches the encoder over the network with no auth or interaction (AV:N/AC:L/PR:N/UI:N); impact is pure CPU-exhaustion DoS so C:N/I:N/A:H.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (CPANSec).

CVSS VectorVendor: CPANSec

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

3
CVSS changed
Sep 22, 2026 - 16:22 NVD
7.5 (HIGH)
CVE Published
Sep 22, 2026 - 07:25 cve.org
HIGH 7.5
CVE Published
Sep 22, 2026 - 07:25 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

Net::IDN::UTS46 versions before 2.590 for Perl allow CPU exhaustion via quadratic punycode encoding of an overlong label before the length check in to_ascii.

to_ascii punycode encodes each label and only then applies the 63-byte DNS limit. encode_punycode in both backends follows the sample implementation in RFC 3492, whose outer loop runs once per distinct non-ASCII code point and scans the whole input each round, so a label of distinct non-ASCII characters costs the square of its length before the limit rejects it. Every ASCII conversion in the distribution, including domain_to_ascii and email_to_ascii, goes through to_ascii.

Executive ViewAI

Why It Matters

Net::IDN::UTS46 versions before 2.590 can be forced to consume disproportionate CPU by a single crafted overlong IDN label, allowing unauthenticated remote attackers to stall Perl applications that normalize untrusted hostnames or email addresses. This creates a bounded availability risk for internet-facing or shared services using the affected library, and leadership should ensure affected deployments are patched because a vendor fix is available. No public exploit identified at time of analysis, so near-term response can focus on rapid inventory and remediation rather than incident response.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 95% exploitable
Prevalence
Low
Standard CPAN IDN library but only within the shrinking Perl ecosystem
Data Quality
6 sources
Confidence: High

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
Medium
Technical Impact
Partial

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Perl

View all
CVE-2012-6329 HIGH POC
7.5 Jan 04

The _compile function in Maketext.pm in the Locale::Maketext implementation in Perl before 5.17.7 does not properly hand

CVE-2017-12814 CRITICAL POC
9.8 Sep 28

Stack-based buffer overflow in the CPerlHost::Add method in win32/perlhost.h in Perl before 5.24.3-RC1 and 5.26.x before

CVE-2015-8608 CRITICAL POC
9.8 Feb 07

The VDir::MapPathA and VDir::MapPathW functions in Perl 5.22 allow remote attackers to cause a denial of service (out-of

CVE-2018-18314 CRITICAL POC
9.8 Dec 07

Perl before 5.26.3 has a buffer overflow via a crafted regular expression that triggers invalid write operations. Rated

CVE-2018-18312 CRITICAL POC
9.8 Dec 05

Perl before 5.26.3 and 5.28.0 before 5.28.1 has a buffer overflow via a crafted regular expression that triggers invalid

CVE-2018-18313 CRITICAL POC
9.1 Dec 07

Perl before 5.26.3 has a buffer over-read via a crafted regular expression that triggers disclosure of sensitive informa

CVE-2016-2381 HIGH
7.5 Apr 08

Perl might allow context-dependent attackers to bypass the taint protection mechanism in a child process via duplicate e

CVE-2023-31484 HIGH POC
8.1 Apr 29

CPAN.pm before 2.35 does not verify TLS certificates when downloading distributions over HTTPS. Rated high severity (CVS

CVE-2016-6185 HIGH POC
7.8 Aug 02

The XSLoader::load method in XSLoader in Perl does not properly locate .so files when called in a string eval, which mig

CVE-2018-12015 HIGH POC
7.5 Jun 07

In Perl through 5.26.2, the Archive::Tar module allows remote attackers to bypass a directory-traversal protection mecha

CVE-2020-10543 HIGH
8.2 Jun 05

Perl before 5.30.3 on 32-bit platforms allows a heap-based buffer overflow because nested regular expression quantifiers

CVE-2015-8853 HIGH
7.5 May 25

The (1) S_reghop3, (2) S_reghop4, and (3) S_reghopmaybe3 functions in regexec.c in Perl before 5.24.0 allow context-depe

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy