{"id":"CVE-2026-124016","kind":"vulnerability","aliases":["CVE-2026-124016"],"related":[],"title":"postal-mime: crafted email causes CPU exhaustion and event loop blocking","description":"postal-mime before 4.2.1 contains an algorithmic complexity denial of service vulnerability that allows unauthenticated remote attackers to cause excessive CPU consumption in the PostalMime.processLine() function by crafting deeply nested multipart email messages with boundary lines sharing long prefixes with open boundaries. Attackers can deliver a malicious email with nesting up to the default maxNestingDepth of 256, causing per-line parsing cost to scale as O(depth x shared prefix length) and blocking the Node.js event loop for seconds per message.","summary":"postal-mime, a JavaScript email parser, becomes very slow on specially crafted multipart emails with deeply nested boundaries. An unauthenticated remote sender can block the Node.js event loop for seconds per message, causing denial of service.","severity":"medium","cvss":6.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["email-parsing","node.js","package","postal-mime"],"not_affected_if":["no-untrusted-email-input","trusted-mail-only"],"how_to_check":"- Check the installed version with `npm ls postal-mime`\n- Look for `postal-mime` in `package.json` and lockfiles for any version below `4.2.1`\n- Find where the parser runs on inbound mail, such as a mail-receiving service or webhook, since only that path is exposed","fix":"- `postal-mime` `4.2.1` (fixed version, per the vulnerability record; the product data lists no ranges)","status":"open","published_at":"2026-11-10T20:19:04+00:00","first_seen_at":"2026-11-10T20:46:04+00:00","triaged_at":"2026-11-10T20:47:58+00:00","updated_at":"2026-11-10T20:47:58+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-10T20:47:58Z","model":"claude-haiku-5-5","output":{"fix":"- `postal-mime` `4.2.1` (fixed version, per the vulnerability record; the product data lists no ranges)","reach":"internet","title":"postal-mime: crafted email causes CPU exhaustion and event loop blocking","impact":"low","summary":"postal-mime, a JavaScript email parser, becomes very slow on specially crafted multipart emails with deeply nested boundaries. An unauthenticated remote sender can block the Node.js event loop for seconds per message, causing denial of service.","audience":"developers","category":"package","nicknames":[],"who_cares":["node.js","postal-mime","email-parsing"],"confidence":0.7,"fix_status":"available","needs_auth":"no","worst_case":"Event loop blocked for seconds per message, causing denial of service","analyst_note":"","how_to_check":"- Check the installed version with `npm ls postal-mime`\n- Look for `postal-mime` in `package.json` and lockfiles for any version below `4.2.1`\n- Find where the parser runs on inbound mail, such as a mail-receiving service or webhook, since only that path is exposed","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["no-untrusted-email-input","trusted-mail-only"],"who_is_affected":"Applications that parse untrusted inbound email with postal-mime in Node.js are exposed, because a single malicious message can stall the event loop. Apps that only parse trusted mail or never handle inbound messages can skip it.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"medium"},"cost_usd":0.000742,"input_tokens":4692,"output_tokens":546,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-124016':15A,18A '-2026':14A,17A '256':121C '4.2.1':68C 'algorithm':71C 'allow':78C 'attack':81C,107C 'becom':34B 'block':12A,51B,138C 'boundari':45B,99C,106C 'caus':6A,60B,83C,122C 'complex':72C 'consumpt':86C 'contain':69C 'cost':127C 'cpu':7A,85C 'craft':4A,39B,92C 'cve':13A,16A 'deepli':43B,93C 'default':118C 'deliv':109C 'denial':61B,73C 'depth':132C 'email':5A,20B,32B,41B,96C,112C 'email-pars':19B 'event':10A,54B,141C 'excess':84C 'exhaust':8A 'function':90C 'javascript':31B 'length':136C 'line':100C,125C 'long':102C 'loop':11A,55B,142C 'malici':111C 'maxnestingdepth':119C 'messag':59B,97C,146C 'mime':3A,26B,29B,66C 'multipart':40B,95C 'nest':44B,94C,114C 'node.js':22B,53B,140C 'o':131C 'open':105C 'packag':23B 'pars':21B,126C 'parser':33B 'per':58B,124C,145C 'per-lin':123C 'postal':2A,25B,28B,65C 'postal-mim':1A,24B,27B,64C 'postalmime.processline':89C 'prefix':103C,135C 'remot':48B,80C 'scale':129C 'second':57B,144C 'sender':49B 'servic':63B,75C 'share':101C,134C 'slow':36B 'special':38B 'unauthent':47B,79C 'vulner':76C 'x':133C","nicknames":[],"mitigations":[],"who_affected":"Applications that parse untrusted inbound email with postal-mime in Node.js are exposed, because a single malicious message can stall the event loop. Apps that only parse trusted mail or never handle inbound messages can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["emailparsing","medium","nodejs","package","postalmime"],"campaign_type":null,"search_a":"'-124016':15A,18A '-2026':14A,17A 'block':12A 'caus':6A 'cpu':7A 'craft':4A 'cve':13A,16A 'email':5A 'event':10A 'exhaust':8A 'loop':11A 'mime':3A 'postal':2A 'postal-mim':1A","search_b":"'becom':34B 'block':51B 'boundari':45B 'caus':60B 'craft':39B 'deepli':43B 'denial':61B 'email':20B,32B,41B 'email-pars':19B 'event':54B 'javascript':31B 'loop':55B 'messag':59B 'mime':26B,29B 'multipart':40B 'nest':44B 'node.js':22B,53B 'packag':23B 'pars':21B 'parser':33B 'per':58B 'postal':25B,28B 'postal-mim':24B,27B 'remot':48B 'second':57B 'sender':49B 'servic':63B 'slow':36B 'special':38B 'unauthent':47B","search_c":"'256':121C '4.2.1':68C 'algorithm':71C 'allow':78C 'attack':81C,107C 'block':138C 'boundari':99C,106C 'caus':83C,122C 'complex':72C 'consumpt':86C 'contain':69C 'cost':127C 'cpu':85C 'craft':92C 'deepli':93C 'default':118C 'deliv':109C 'denial':73C 'depth':132C 'email':96C,112C 'event':141C 'excess':84C 'function':90C 'length':136C 'line':100C,125C 'long':102C 'loop':142C 'malici':111C 'maxnestingdepth':119C 'messag':97C,146C 'mime':66C 'multipart':95C 'nest':94C,114C 'node.js':140C 'o':131C 'open':105C 'pars':126C 'per':124C,145C 'per-lin':123C 'postal':65C 'postal-mim':64C 'postalmime.processline':89C 'prefix':103C,135C 'remot':80C 'scale':129C 'second':144C 'servic':75C 'share':101C,134C 'unauthent':79C 'vulner':76C 'x':133C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-10T08:12:34+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/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","cvss_by":"disclosure@vulncheck.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-124016","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-124016","severity":null,"published_at":"2026-11-10T20:19:04+00:00","modified_at":"2026-11-10T20:19:04+00:00","first_seen_at":"2026-11-10T20:46:04+00:00","fetched_at":"2026-11-10T20:46:04+00:00","note":null}],"documents":[{"id":116132,"url":"https://github.com/postalsys/postal-mime/releases/tag/v4.2.1","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":118140,"url":"https://github.com/postalsys/postal-mime/security/advisories/GHSA-q8wm-54mj-r36p","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-10T08:12:34+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"},{"id":118141,"url":"https://www.vulncheck.com/advisories/postal-mime-algorithmic-complexity-dos-via-processline","title":"Third-party advisory: www.vulncheck.com","kind":"advisory","source":"nvd","publisher":"research","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Third-party advisory: www.vulncheck.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}