{"id":"CVE-2026-87079","aliases":["DEBIAN-CVE-2026-87079","EUVD-2026-84292","GHSA-vx57-287r-4h84","UBUNTU-CVE-2026-87079","openSUSE-SU-2026:12468-1"],"status":"published","title":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode.\n\nThe XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost.\n\nNothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","severity":{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high","assessor":"adp","from":"cve"},"epss":{"day":"2026-11-12","score":0.00365,"percentile":0.30772,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-407"],"published":"2026-09-22T07:24:47Z","modified":"2026-11-07T17:27:13Z","fixes":[{"ecosystem":"Debian:14","package":"libnet-idn-encode-perl","fixed_in":["2.600-1"],"sources":["osv"]}],"affected":[{"source":"osv","ecosystem":"Debian:12","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.500-3","2.500-5","2.502-1","2.600-1"]},{"source":"osv","ecosystem":"Debian:13","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.500-5","2.502-1","2.600-1"]},{"source":"osv","ecosystem":"Debian:14","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.600-1"}]}],"versions":["2.500-5","2.502-1"]},{"source":"osv","ecosystem":"Ubuntu:16.04:LTS","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.202-1","2.300-1","2.300-1build1"]},{"source":"osv","ecosystem":"Ubuntu:18.04:LTS","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.400-1build1"]},{"source":"osv","ecosystem":"Ubuntu:20.04:LTS","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.500-1","2.500-1build1"]},{"source":"osv","ecosystem":"Ubuntu:22.04:LTS","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.500-1build2","2.500-2","2.500-2build1"]},{"source":"osv","ecosystem":"Ubuntu:24.04:LTS","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.500-3","2.500-3build1","2.500-3build2","2.500-5"]},{"source":"osv","ecosystem":"Ubuntu:26.10","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.500-5build1","2.500-5build2"]},{"source":"osv","ecosystem":"Ubuntu:26.04:LTS","package":"libnet-idn-encode-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.500-5build1"]},{"source":"osv","ecosystem":"openSUSE:Tumbleweed","package":"perl-Net-IDN-Encode","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.600.0-1.1"}]}],"bundled":7}],"references":[{"url":"https://metacpan.org/release/PJCJ/Net-IDN-Encode-2.590-TRIAL/changes","tags":["release-notes","advisory","report"]},{"url":"https://github.com/robrwo/Net-IDN-Encode/commit/00d723423b66810af26b88c552bedc61975b3078.patch","tags":["patch","fix","report"]},{"url":"https://github.com/robrwo/Net-IDN-Encode/commit/447c6b38ef5d4570329fa4f78690f4e14e09ba0c.patch","tags":["patch","fix","report"]},{"url":"http://www.openwall.com/lists/oss-security/2026/09/22/14","tags":["web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-87079","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-vx57-287r-4h84"},{"url":"https://cpan.org/modules","tags":["web"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/87xxx/CVE-2026-87079.json","tags":["advisory"]},{"url":"https://github.com/robrwo/Net-IDN-Encode","tags":["package"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-87079","tags":["advisory"]},{"url":"https://ubuntu.com/security/CVE-2026-87079","tags":["report"]},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-87079","tags":["report"]},{"url":"https://lists.security.metacpan.org/cve-announce/msg/43753023/","tags":["report"]},{"url":"","tags":["advisory"]},{"url":"https://www.suse.com/security/cve/CVE-2026-74765","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-74766","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-87078","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-87079","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-87080","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-87081","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-87082","tags":["web"]}],"sources":{"cve":[{"id":"CVE-2026-87079","title":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode.\n\nThe XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost.\n\nNothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","status":"published","published":"2026-09-22T07:24:47.784Z","modified":"2026-09-22T17:07:28.687Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high","assessor":"adp"}],"cwes":["CWE-407"],"updated_at":"2026-11-02T13:37:47.463822Z"}],"euvd":[{"id":"EUVD-2026-84292","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode.\n\nThe XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost.\n\nNothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","status":"published","published":"2026-09-22T07:24:47Z","modified":"2026-09-22T17:07:28Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"updated_at":"2026-11-02T17:28:02.601428Z"}],"ghsa":[{"id":"GHSA-vx57-287r-4h84","title":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion...","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode.\n\nThe XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost.\n\nNothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","status":"published","published":"2026-09-22T09:31:12Z","modified":"2026-09-22T18:34:35Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"cwes":["CWE-407"],"updated_at":"2026-11-02T15:12:18.539197Z"}],"nvd":[{"id":"CVE-2026-87079","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode.\n\nThe XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost.\n\nNothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","status":"published","published":"2026-09-22T08:16:40.637Z","modified":"2026-09-22T19:07:00.983Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high","assessor":"secondary"}],"cwes":["CWE-407"],"updated_at":"2026-11-02T14:12:50.368368Z"}],"osv":[{"id":"CVE-2026-87079","title":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode.\n\nThe XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost.\n\nNothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","status":"published","published":"2026-09-22T07:24:47.784Z","modified":"2026-11-07T17:27:13.061439936Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"cwes":["CWE-407"],"updated_at":"2026-11-07T17:50:02.333869Z"},{"id":"DEBIAN-CVE-2026-87079","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode.  The XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost.  Nothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","status":"published","published":"2026-09-22T08:16:40.637Z","modified":"2026-11-03T04:00:11.031691965Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"updated_at":"2026-11-03T04:20:33.401912Z"},{"id":"UBUNTU-CVE-2026-87079","description":"Net::IDN::Punycode versions before 2.590 for Perl allow CPU exhaustion via quadratic insertion cost when decoding a long label in decode_punycode. The XS backend inserts each decoded code point into a UTF-8 buffer and finds the insertion point by scanning that buffer from the start, one character at a time. The scan runs once per code point over the output built so far, so the cost is quadratic in the label length. The pure-Perl backend downgrades its input to bytes so that substr can index it directly, but takes its working copy before the downgrade, so when the input carries the UTF-8 flag every substr on the copy scans from the start, with the same quadratic cost. Nothing bounds the label length in the to-Unicode direction. The 63-byte DNS limit is checked only when converting to ASCII, so domain_to_unicode and uts46_to_unicode pass an attacker-supplied label of any length to the decoder.","status":"published","published":"2026-09-22T08:16:00Z","modified":"2026-10-17T13:01:14.177189133Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"updated_at":"2026-11-02T16:57:24.828975Z"},{"id":"openSUSE-SU-2026:12468-1","title":"perl-Net-IDN-Encode-2.600.0-1.1 on GA media","description":"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.","status":"published","published":"2026-11-06T00:00:00Z","modified":"2026-11-07T17:23:17.491063492Z","updated_at":"2026-11-07T17:50:39.727056Z"}]}}
