{"id":"CVE-2026-90776","revision":null,"records":[{"revision":"1dfdd0031e1f4bc1936d2880aa41c60e","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2026-90776","aliases":[],"title":"Nodemailer 9.1.0 through 10.0.4 Denial of Service via Quadratic Address Parsing","description":"Nodemailer versions 9.1.0 through 10.0.4 contain a quadratic time complexity vulnerability in the addressparser component when parsing email addresses with RFC 5322 comments. Attackers can craft malicious email headers with comment-separated atoms to consume excessive CPU and block the Node.js event loop for several seconds, causing denial of service.","state":0,"publishedAt":"2026-09-13T11:42:26.391+00:00","modifiedAt":"2026-09-24T14:21:56.169+00:00","affected":[{"ecosystem":"Vendor product","name":"nodemailer","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"nodemailer\",\n                    \"product\": \"nodemailer\",\n                    \"defaultStatus\": \"unaffected\",\n                    \"packageURL\": \"pkg:npm/nodemailer\",\n                    \"versions\": [\n                        {\n                            \"version\": \"9.1.0\",\n                            \"status\": \"affected\",\n                            \"versionType\": \"semver\",\n                            \"lessThan\": \"10.0.5\"\n                        },\n                        {\n                            \"version\": \"10.0.5\",\n                            \"status\": \"unaffected\",\n                            \"versionType\": \"semver\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 4.0","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","score":8.7,"severity":"HIGH"},{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":7.5,"severity":"HIGH"}],"references":["https://github.com/nodemailer/nodemailer/security/advisories/GHSA-prgh-xp8r-p3m5","https://github.com/nodemailer/nodemailer/commit/c07f17518d25aca8ab2ad66968dcbca538c24b89","https://github.com/nodemailer/nodemailer/blob/v10.0.4/src/addressparser/index.ts#L251","https://github.com/nodemailer/nodemailer/releases/tag/v10.0.5","https://github.com/nodemailer/nodemailer","https://www.vulncheck.com/advisories/nodemailer-9.1.0-through-10.0.4-denial-of-service-via-quadratic-address-parsing"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-90776","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-90776","identifiers":["CVE-2026-90776"]},"retained":false,"historicalAffected":[]},{"revision":"b236db2ee6404660b2ce53c3430a1a1f","observedAt":"2026-11-11T17:03:50.019+00:00","statement":{"source":"euvd","id":"EUVD-2026-77000","aliases":["CVE-2026-90776","GHSA-vm5r-23w9-m8hx"],"title":"Nodemailer versions 9.1.0 through 10.0.4 contain a quadratic time complexity vulnerability in the addressparser component when parsing email addresses with RFC 5322 comments. Attackers can craft malicious email headers with comment-separate…","description":"Nodemailer versions 9.1.0 through 10.0.4 contain a quadratic time complexity vulnerability in the addressparser component when parsing email addresses with RFC 5322 comments. Attackers can craft malicious email headers with comment-separated atoms to consume excessive CPU and block the Node.js event loop for several seconds, causing denial of service.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 4.0","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","score":8.7,"severity":null}],"references":["https://github.com/nodemailer/nodemailer/security/advisories/GHSA-prgh-xp8r-p3m5","https://github.com/nodemailer/nodemailer/commit/c07f17518d25aca8ab2ad66968dcbca538c24b89","https://github.com/nodemailer/nodemailer/blob/v10.0.4/src/addressparser/index.ts#L251","https://github.com/nodemailer/nodemailer/releases/tag/v10.0.5","https://github.com/nodemailer/nodemailer","https://www.vulncheck.com/advisories/nodemailer-9.1.0-through-10.0.4-denial-of-service-via-quadratic-address-parsing"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-77000","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Sep 13, 2026, 11:42:26 AM","dateUpdated":"Sep 24, 2026, 2:21:56 PM"},"relatedAdvisories":[{"id":"WID-SEC-W-2026-4410","title":"IBM App Connect Enterprise: Mehrere Schwachstellen","vulnerabilityIds":["CVE-2026-100699","CVE-2026-100700","CVE-2026-100701","CVE-2026-100702","CVE-2026-101898","CVE-2026-101900","CVE-2026-101901","CVE-2026-101902","CVE-2026-101903","CVE-2026-101904","CVE-2026-101905","CVE-2026-101906","CVE-2026-101907","CVE-2026-101908","CVE-2026-101909","CVE-2026-101915","CVE-2026-101916","CVE-2026-104850","CVE-2026-106444","CVE-2026-106445","CVE-2026-106446","CVE-2026-110869","CVE-2026-111767","CVE-2026-15187","CVE-2026-33937","CVE-2026-83745","CVE-2026-84003","CVE-2026-86535","CVE-2026-90776","CVE-2026-91863","CVE-2026-91864","CVE-2026-91865","CVE-2026-91866","CVE-2026-91867","CVE-2026-93687","CVE-2026-93749","CVE-2026-94645","CVE-2026-94646","CVE-2026-96294"]}],"note":"EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON."},"key":"euvd:EUVD-2026-77000","identifiers":["EUVD-2026-77000","CVE-2026-90776","GHSA-vm5r-23w9-m8hx"]},"retained":false,"historicalAffected":[]},{"revision":"87a70d73386e4cfbb3792836521b5802","observedAt":"2026-10-25T16:19:22.228+00:00","statement":{"source":"nvd","id":"CVE-2026-90776","aliases":[],"title":"Nodemailer versions 9.1.0 through 10.0.4 contain a quadratic time complexity vulnerability in the addressparser component when parsing email addresses with RFC 5322 comments. Attackers can craft malicious email headers with comment-separate…","description":"Nodemailer versions 9.1.0 through 10.0.4 contain a quadratic time complexity vulnerability in the addressparser component when parsing email addresses with RFC 5322 comments. Attackers can craft malicious email headers with comment-separated atoms to consume excessive CPU and block the Node.js event loop for several seconds, causing denial of service.","state":0,"publishedAt":"2026-09-13T12:17:16.547+00:00","modifiedAt":"2026-09-24T20:47:31.797+00:00","affected":[],"metrics":[{"system":"CVSS 4.0 · disclosure@vulncheck.com · Secondary","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","score":8.7,"severity":"HIGH"},{"system":"CVSS 3.1 · disclosure@vulncheck.com · Secondary","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":7.5,"severity":"HIGH"}],"references":["https://github.com/nodemailer/nodemailer","https://github.com/nodemailer/nodemailer/blob/v10.0.4/src/addressparser/index.ts#L251","https://github.com/nodemailer/nodemailer/commit/c07f17518d25aca8ab2ad66968dcbca538c24b89","https://github.com/nodemailer/nodemailer/releases/tag/v10.0.5","https://github.com/nodemailer/nodemailer/security/advisories/GHSA-prgh-xp8r-p3m5","https://www.vulncheck.com/advisories/nodemailer-9.1.0-through-10.0.4-denial-of-service-via-quadratic-address-parsing"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2026-90776","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Awaiting Analysis","weaknesses":["CWE-407"],"productCriteria":[],"sourceDates":{"published":"2026-09-13T12:17:16.547","lastModified":"2026-09-24T20:47:31.797"},"relatedAdvisories":[],"note":"NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON."},"key":"nvd:CVE-2026-90776","identifiers":["CVE-2026-90776"]},"retained":false,"historicalAffected":[]},{"revision":"34723716d77449a2aeae73adbbd0746a","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"GHSA-prgh-xp8r-p3m5","aliases":["CVE-2026-90776"],"title":"Nodemailer addressparser: O(n^2) on comment-joined addresses enables a remote DoS (reachable via mailparser)","description":"### Summary\n\n`nodemailer/lib/addressparser` parses one shape of address in O(n^2) time. A single ~640 KB address value blocks the Node.js event loop for roughly 7 seconds. And it is reachable without auth: mailparser feeds inbound email headers straight into this parser, so one crafted email is enough to stall a service that parses mail.\n\n### Details\n\nThe parser builds a single address by accumulating its atoms into one string. When the atoms are separated by RFC 5322 comments, like `a@b(c)@b(c)@b(c)...`, every atom re-joins that same growing string.\n\nThe join check in `src/addressparser/index.ts`:\n\n```js\nconst joins =\n    prevToken &&\n    prevToken.noBreak &&\n    parts.length &&\n    (prevToken.value !== ')' || parts[parts.length - 1].slice(-1) === '@' || token.value.charAt(0) === '@');\n```\n\nThe issue is the order of the last two operands. `parts[parts.length - 1].slice(-1)` runs before the cheap `token.value.charAt(0)`. `slice(-1)` has to flatten the accumulator to read its last character → O(current length) → and that runs on every token → O(n^2) over the whole value. Since `||` is left to right, the cheap `charAt(0)` that would short-circuit never gets the chance.\n\nThe chain: long comment-joined address → one growing accumulator → `slice(-1)` re-flattens it on every token → quadratic parse time.\n\n### PoC\n\nIsolated, just the parser (`npm i nodemailer@10.0.3`):\n\n```js\nconst addressparser = require('nodemailer/lib/addressparser');\nconst s = Date.now();\naddressparser('a' + '@b(c)'.repeat(130000));\nconsole.log(Date.now() - s, 'ms'); // ~7000 ms, blocking\n```\n\nEnd to end through mailparser, the remote path (`npm i mailparser@3.9.24`):\n\n```js\nconst { simpleParser } = require('mailparser');\n(async () => {\n  const to = 'a' + '@b(c)'.repeat(130000);\n  const eml = `From: a@b.com\\r\\nTo: ${to}\\r\\nSubject: x\\r\\n\\r\\nhi\\r\\n`;\n  const s = Date.now();\n  await simpleParser(eml);\n  console.log(Date.now() - s, 'ms'); // ~7000 ms, blocking\n})();\n```\n\nTimings measured on 10.0.3:\n\n| Address value | Parse time |\n| --- | --- |\n| 390 KB | 1.3 s |\n| 585 KB | 5.6 s |\n| 640 KB | 6.7 s |\n| 976 KB | 18 s |\n\nIt survives RFC 5322 folding: fold the header at offsets that are a multiple of the atom length and every `)`+`@` junction stays intact, so the payload is a standards-compliant email with lines under 998 octets and still triggers it.\n\n### Impact\n\nAlgorithmic-complexity DoS. Node is single threaded, so the block stalls everything else in the process, and a handful of these back to back keeps a service down.\n\nAffected: anything that runs `addressparser` on attacker-controlled input, either the public export directly or address headers built from user input. The unauthenticated remote case is mailparser. 3.9.24 pins nodemailer 10.0.3 and calls the parser on inbound `To`/`From`/`Cc` with no length cap, so any service parsing inbound mail with it can be frozen by a single email.\n\n### Suggested fix\n\nSwap the last two operands so the cheap check runs first:\n\n```js\n(prevToken.value !== ')' || token.value.charAt(0) === '@' || parts[parts.length - 1].slice(-1) === '@')\n```\n\nPure boolean commutation, so the parse output is identical. Verified byte for byte on the test inputs, and the full 1276-test suite passes.","state":0,"publishedAt":"2026-09-30T14:41:01+00:00","modifiedAt":"2026-10-05T23:45:08.2484273+00:00","affected":[{"ecosystem":"npm","name":"nodemailer","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"9.1.0"},{"kind":"fixed","version":"10.0.5"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/nodemailer/nodemailer/security/advisories/GHSA-prgh-xp8r-p3m5","https://nvd.nist.gov/vuln/detail/CVE-2026-90776","https://github.com/nodemailer/nodemailer/commit/c07f17518d25aca8ab2ad66968dcbca538c24b89","https://github.com/nodemailer/nodemailer","https://github.com/nodemailer/nodemailer/releases/tag/v10.0.5","https://www.vulncheck.com/advisories/nodemailer-9.1.0-through-10.0.4-denial-of-service-via-quadratic-address-parsing"],"sourceUrl":"https://github.com/advisories/GHSA-prgh-xp8r-p3m5","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-prgh-xp8r-p3m5","identifiers":["GHSA-prgh-xp8r-p3m5","CVE-2026-90776"]},"retained":false,"historicalAffected":[]},{"revision":"b9bb05f9ff0744d684041d0b2c484dc3","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"GHSA-vm5r-23w9-m8hx","aliases":[],"title":"Duplicate Advisory: Nodemailer addressparser: O(n^2) on comment-joined addresses enables a remote DoS (reachable via mailparser)","description":"## Duplicate Advisory\n\nThis advisory has been withdrawn because it is a duplicate of\u00A0GHSA-prgh-xp8r-p3m5. This link is maintained to preserve external references.\n\n## Original Description\nNodemailer versions 9.1.0 through 10.0.4 contain a quadratic time complexity vulnerability in the addressparser component when parsing email addresses with RFC 5322 comments. Attackers can craft malicious email headers with comment-separated atoms to consume excessive CPU and block the Node.js event loop for several seconds, causing denial of service.","state":2,"publishedAt":"2026-09-13T12:31:12+00:00","modifiedAt":"2026-10-05T23:45:08.1778872+00:00","affected":[{"ecosystem":"npm","name":"nodemailer","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"9.1.0"},{"kind":"last_affected","version":"10.0.4"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":null,"severity":null},{"system":"CVSS_V4","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/nodemailer/nodemailer/security/advisories/GHSA-prgh-xp8r-p3m5","https://nvd.nist.gov/vuln/detail/CVE-2026-90776","https://github.com/nodemailer/nodemailer/commit/c07f17518d25aca8ab2ad66968dcbca538c24b89","https://github.com/nodemailer/nodemailer","https://github.com/nodemailer/nodemailer/blob/v10.0.4/src/addressparser/index.ts#L251","https://github.com/nodemailer/nodemailer/releases/tag/v10.0.5","https://www.vulncheck.com/advisories/nodemailer-9.1.0-through-10.0.4-denial-of-service-via-quadratic-address-parsing"],"sourceUrl":"https://github.com/advisories/GHSA-vm5r-23w9-m8hx","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-vm5r-23w9-m8hx","identifiers":["GHSA-vm5r-23w9-m8hx"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-11T18:57:20.2923258+00:00","complete":true,"records":1779,"lastAttemptAt":"2026-11-11T18:57:20.2923258+00:00","lastSuccessAt":"2026-11-11T18:57:20.5900147+00:00","error":null,"lastVerifiedAt":"2026-11-11T18:57:20.5900175+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-de3b77103708811b6494d2ff7c979037d73ae579742cd1649a5c765137ae5083-3c00b79c9391131991e27b9943a0dadf4eaae3bedbca1cd8e56798cb05f5baee","complete":true,"records":424226,"lastAttemptAt":"2026-11-11T18:57:17.9650425+00:00","lastSuccessAt":"2026-11-11T18:57:17.3257068+00:00","error":null,"lastVerifiedAt":"2026-11-11T18:57:17.9650425+00:00","snapshotPublishedAt":"2026-11-11T18:28:25+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-151835c633b847cdbe04eb3670f18ec8","complete":false,"records":13759,"lastAttemptAt":"2026-11-11T19:07:41.1040307+00:00","lastSuccessAt":"2026-11-11T19:07:41.096+00:00","error":"82 identifier lookups failed; latest failures include AccessDenied (HTTP 403). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-11T19:07:41.096+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13500,"expectedIdentifiers":13813,"failedIdentifiers":82},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-11T18:57:20.2923258+00:00","complete":true,"records":1097,"lastAttemptAt":"2026-11-11T18:57:20.2923258+00:00","lastSuccessAt":"2026-11-11T18:57:24.3127212+00:00","error":null,"lastVerifiedAt":"2026-11-11T18:57:24.3127229+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-ac7d350109df40bdb6ae654767d5a7ea","complete":false,"records":13753,"lastAttemptAt":"2026-11-11T18:57:50.2198185+00:00","lastSuccessAt":"2026-11-11T18:57:50.212+00:00","error":"100 identifier lookups failed; latest failures include request timeout. Other identifiers were checked independently.","lastVerifiedAt":"2026-11-11T18:57:50.212+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13713,"expectedIdentifiers":13813,"failedIdentifiers":100},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-3562b6c78fd1bd0f0b55daf66a0926ae24f65e462df7f6d928caad458fc696bf","complete":true,"records":9947,"lastAttemptAt":"2026-11-11T18:57:19.8584027+00:00","lastSuccessAt":"2026-11-11T04:27:43.6877707+00:00","error":null,"lastVerifiedAt":"2026-11-11T18:57:19.8584027+00:00","snapshotPublishedAt":"2026-11-11T03:32:46+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-456002455e0ab94bb92c95476d4e6d175c104cd594749982afd96c893728ecbc","complete":true,"records":2010,"lastAttemptAt":"2026-11-11T18:57:18.9614553+00:00","lastSuccessAt":"2026-11-11T02:36:58.1276999+00:00","error":null,"lastVerifiedAt":"2026-11-11T18:57:18.9614553+00:00","snapshotPublishedAt":"2026-11-11T01:17:51+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-baa8362b4daf9e5f39d5563775a55935e7b442c0735d33274a921579ce4a0d66","complete":true,"records":3093,"lastAttemptAt":"2026-11-11T18:57:20.1156075+00:00","lastSuccessAt":"2026-11-11T13:00:02.5446881+00:00","error":null,"lastVerifiedAt":"2026-11-11T18:57:20.1156075+00:00","snapshotPublishedAt":"2026-11-11T12:47:47+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-757d3692f9a7b34792dad960197f3cc953a54db59b7d0ffe3835a0ed9926f76b","complete":true,"records":231690,"lastAttemptAt":"2026-11-11T18:57:19.1723839+00:00","lastSuccessAt":"2026-11-11T17:59:27.5166432+00:00","error":null,"lastVerifiedAt":"2026-11-11T18:57:19.1723839+00:00","snapshotPublishedAt":"2026-11-11T17:48:14+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}