{"id":"CVE-2026-119186","kind":"vulnerability","aliases":["CVE-2026-119186"],"related":[],"title":"node-forge: AES-GCM decryption accepts unauthenticated ciphertext when tagLength is zero","description":"Forge (also called node-forge) is a native implementation of Transport Layer Security in JavaScript. Prior to 1.4.1, node-forge did not validate the AES-GCM tagLength option passed to start() during decryption through forge.cipher.createDecipher(). When an application derived tagLength from received data or used an unset or zero-like configuration value, a value that converted to zero together with an empty or missing authentication tag caused the calculated and supplied tags to compare as empty, so decipher.finish() accepted unauthenticated ciphertext. Applications that omit tagLength to use the 128-bit default or pass a fixed valid tag length are unaffected. This issue is fixed in version 1.4.1.","summary":"node-forge is a JavaScript TLS and crypto library. Before 1.4.1, an AES-GCM decryption with a tagLength that converts to zero and an empty tag lets an attacker's modified ciphertext pass as authentic.","severity":"medium","cvss":5.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["javascript","node-forge","npm","package"],"not_affected_if":["default-tag-length","fixed-tag-length"],"how_to_check":"- Run `npm ls node-forge` to find the installed version.\n- Search the code for `forge.cipher.createDecipher` and check whether `tagLength` is taken from received data or may be unset or zero.","fix":"- node-forge: move to `1.4.1`","status":"open","published_at":"2026-10-29T20:17:29+00:00","first_seen_at":"2026-10-29T20:26:50+00:00","triaged_at":"2026-10-29T20:28:09+00:00","updated_at":"2026-10-29T20:28:09+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-29T20:28:09Z","model":"claude-haiku-5-5","output":{"fix":"- node-forge: move to `1.4.1`","reach":"unknown","title":"node-forge: AES-GCM decryption accepts unauthenticated ciphertext when tagLength is zero","impact":"medium","summary":"node-forge is a JavaScript TLS and crypto library. Before 1.4.1, an AES-GCM decryption with a tagLength that converts to zero and an empty tag lets an attacker's modified ciphertext pass as authentic.","audience":"developers","category":"package","nicknames":[],"who_cares":["node-forge","javascript","npm"],"confidence":0.7,"fix_status":"available","needs_auth":"no","worst_case":"unauthenticated ciphertext is accepted as valid decrypted data","analyst_note":"","how_to_check":"- Run `npm ls node-forge` to find the installed version.\n- Search the code for `forge.cipher.createDecipher` and check whether `tagLength` is taken from received data or may be unset or zero.","plain_action":"","needs_analyst":false,"not_affected_if":["default-tag-length","fixed-tag-length"],"who_is_affected":"Applications that call node-forge's AES-GCM decryption with a tagLength value taken from received data, or one that is unset or zero, are exposed. Applications that omit tagLength to use the 128-bit default or pass a fixed valid tag length are not affected, according to the description.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.000683,"input_tokens":4251,"output_tokens":516,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-119186':17A,20A '-2026':16A,19A '1.4.1':38B,82C,174C '128':156C 'accept':8A,146C 'ae':5A,41B,91C 'aes-gcm':4A,40B,90C 'also':65C 'applic':104C,149C 'attack':57B 'authent':63B,132C 'bit':157C 'calcul':136C 'call':66C 'caus':134C 'ciphertext':10A,60B,148C 'compar':141C 'configur':118C 'convert':48B,123C 'crypto':35B 'cve':15A,18A 'data':109C 'decipher.finish':145C 'decrypt':7A,43B,99C 'default':158C 'deriv':105C 'empti':53B,129C,143C 'fix':162C,171C 'forg':3A,24B,29B,64C,69C,85C 'forge.cipher.createdecipher':101C 'gcm':6A,42B,92C 'implement':73C 'issu':169C 'javascript':21B,32B,79C 'layer':76C 'length':165C 'let':55B 'librari':36B 'like':117C 'miss':131C 'modifi':59B 'nativ':72C 'node':2A,23B,28B,68C,84C 'node-forg':1A,22B,27B,67C,83C 'npm':25B 'omit':151C 'option':94C 'packag':26B 'pass':61B,95C,160C 'prior':80C 'receiv':108C 'secur':77C 'start':97C 'suppli':138C 'tag':54B,133C,139C,164C 'taglength':12A,46B,93C,106C,152C 'tls':33B 'togeth':126C 'transport':75C 'unaffect':167C 'unauthent':9A,147C 'unset':113C 'use':111C,154C 'valid':88C,163C 'valu':119C,121C 'version':173C 'zero':14A,50B,116C,125C 'zero-lik':115C","nicknames":[],"mitigations":[],"who_affected":"Applications that call node-forge's AES-GCM decryption with a tagLength value taken from received data, or one that is unset or zero, are exposed. Applications that omit tagLength to use the 128-bit default or pass a fixed valid tag length are not affected, according to the description.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"first_public_at":"2026-10-29T20:17:29+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-119186","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-119186","severity":null,"published_at":"2026-10-29T20:17:29+00:00","modified_at":"2026-10-29T20:17:29+00:00","first_seen_at":"2026-10-29T20:26:50+00:00","fetched_at":"2026-10-29T20:26:50+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}