{"id":"CVE-2026-63402","kind":"vulnerability","aliases":["CVE-2026-63402"],"related":[],"title":"i18next: deep resource merge lets attacker corrupt JavaScript built-ins","description":"i18next is an internationalization framework for JavaScript. Prior to version 26.3.4, `deepExtend` in `src/utils.js` checks property existence with the in operator and recurses into inherited built-ins reached through `Object.prototype`. An application must explicitly pass attacker-controlled resource data to `addResourceBundle(lng, ns, data, deep, overwrite)` with both `deep: true` and `overwrite: true`. Source keys such as `hasOwnProperty`, `toString` and `valueOf` can then select shared inherited built-in function objects, and a nested value can overwrite a property of those objects process-wide. For example, making `Object.prototype.hasOwnProperty.call` non-callable causes subsequent uses, including i18next internals, to throw TypeError, resulting in unrecoverable denial of service and limited integrity impact. The `__proto__`/`constructor` guard does not prevent this mechanism because the corruption target is an inherited built-in function rather than the prototype object itself. Default calls without deep merging or with overwrite falsy are unaffected, and no standard i18next backend or integration uses the vulnerable configuration. This issue is distinct from the setPath/key-walking prototype-pollution flaws in i18next-fs-backend (CVE-2026-48713) and i18next-http-middleware (CVE-2026-48714). This issue is fixed in version 26.3.4.","summary":"i18next's deepExtend, reached through addResourceBundle with deep and overwrite both true, can follow inherited Object.prototype built-ins such as hasOwnProperty, so attacker-supplied resource data overwrites them process-wide. The result is denial of service through TypeErrors across the application, with limited integrity impact.","severity":"medium","cvss":5.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["browser","i18next","javascript","node","package"],"not_affected_if":["default-config","no-untrusted-resource-data","overwrite-off"],"how_to_check":"- Run `npm ls i18next` to find the installed version and whether it is below `26.3.4`.\n- Search the codebase for calls to `addResourceBundle(` that pass `deep` and `overwrite` as `true` with data that comes from users or external input.","fix":"- i18next: move to `26.3.4` or later.","status":"open","published_at":"2026-10-30T23:17:15+00:00","first_seen_at":"2026-10-30T23:26:12+00:00","triaged_at":"2026-10-30T23:28:10+00:00","updated_at":"2026-10-30T23:28:10+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-30T23:28:10Z","model":"claude-haiku-5-5","output":{"fix":"- i18next: move to `26.3.4` or later.","reach":"unknown","title":"i18next: deep resource merge lets attacker corrupt JavaScript built-ins","impact":"medium","summary":"i18next's deepExtend, reached through addResourceBundle with deep and overwrite both true, can follow inherited Object.prototype built-ins such as hasOwnProperty, so attacker-supplied resource data overwrites them process-wide. The result is denial of service through TypeErrors across the application, with limited integrity impact.","audience":"developers","category":"package","nicknames":[],"who_cares":["i18next","javascript","node","browser"],"confidence":0.8,"fix_status":"available","needs_auth":"unknown","worst_case":"process-wide built-in corruption causing denial of service","analyst_note":"","how_to_check":"- Run `npm ls i18next` to find the installed version and whether it is below `26.3.4`.\n- Search the codebase for calls to `addResourceBundle(` that pass `deep` and `overwrite` as `true` with data that comes from users or external input.","plain_action":"","needs_analyst":false,"not_affected_if":["default-config","no-untrusted-resource-data","overwrite-off"],"who_is_affected":"Only applications that call addResourceBundle with deep set to true and overwrite set to true, and pass attacker-controlled resource data into it. Default calls, calls without deep merging, and calls with overwrite off are unaffected, and no standard i18next backend or integration uses this configuration. Teams that load translations only from their own bundled files can skip it.","user_interaction":"unknown","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000738,"input_tokens":4471,"output_tokens":582,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-2026':13A,16A,249C,257C '-48713':250C '-48714':258C '-63402':14A,17A '26.3.4':81C,265C 'across':64B 'addresourcebundl':28B,113C 'applic':66B,103C 'attack':6A,47B,108C 'attacker-control':107C 'attacker-suppli':46B 'backend':225C,247C 'browser':18B 'built':10A,40B,97C,140C,201C 'built-in':9A,39B,96C,139C,200C 'call':211C 'callabl':164C 'caus':165C 'check':85C 'configur':231C 'constructor':186C 'control':109C 'corrupt':7A,195C 'cve':12A,15A,248C,256C 'data':50B,111C,116C 'deep':2A,30B,117C,121C,213C 'deepextend':25B,82C 'default':210C 'denial':59B,177C 'distinct':235C 'exampl':159C 'exist':87C 'explicit':105C 'falsi':218C 'fix':262C 'flaw':242C 'follow':36B 'framework':75C 'fs':246C 'function':142C,203C 'guard':187C 'hasownproperti':44B,130C 'http':254C 'i18next':1A,19B,23B,71C,169C,224C,245C,253C 'i18next-fs-backend':244C 'i18next-http-middleware':252C 'impact':70B,183C 'in':11A,41B,98C 'includ':168C 'inherit':37B,95C,138C,199C 'integr':69B,182C,227C 'intern':170C 'internation':74C 'issu':233C,260C 'javascript':8A,20B,77C 'key':127C 'let':5A 'limit':68B,181C 'lng':114C 'make':160C 'mechan':192C 'merg':4A,214C 'middlewar':255C 'must':104C 'nest':146C 'node':21B 'non':163C 'non-cal':162C 'ns':115C 'object':143C,154C,208C 'object.prototype':38B,101C 'object.prototype.hasownproperty.call':161C 'oper':91C 'overwrit':32B,51B,118C,124C,149C,217C 'packag':22B 'pass':106C 'pollut':241C 'prevent':190C 'prior':78C 'process':54B,156C 'process-wid':53B,155C 'properti':86C,151C 'proto':185C 'prototyp':207C,240C 'prototype-pollut':239C 'rather':204C 'reach':26B,99C 'recurs':93C 'resourc':3A,49B,110C 'result':57B,174C 'select':136C 'servic':61B,179C 'setpath/key-walking':238C 'share':137C 'sourc':126C 'src/utils.js':84C 'standard':223C 'subsequ':166C 'suppli':48B 'target':196C 'throw':172C 'tostr':131C 'true':34B,122C,125C 'typeerror':63B,173C 'unaffect':220C 'unrecover':176C 'use':167C,228C 'valu':147C 'valueof':133C 'version':80C,264C 'vulner':230C 'wide':55B,157C 'without':212C","nicknames":[],"mitigations":[],"who_affected":"Only applications that call addResourceBundle with deep set to true and overwrite set to true, and pass attacker-controlled resource data into it. Default calls, calls without deep merging, and calls with overwrite off are unaffected, and no standard i18next backend or integration uses this configuration. Teams that load translations only from their own bundled files can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"first_public_at":"2026-10-30T23:17:15+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-63402","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-63402","severity":null,"published_at":"2026-10-30T23:17:15+00:00","modified_at":"2026-10-30T23:17:15+00:00","first_seen_at":"2026-10-30T23:26:12+00:00","fetched_at":"2026-10-30T23:26:12+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"}