{"id":"CVE-2026-59876","aliases":["EUVD-2026-42311","GHSA-jfj6-75fj-8934"],"status":"published","title":"protobufjs: Text Format string map parsing can mutate returned map object prototype","description":"protobufjs compiles protobuf definitions into JavaScript (JS) functions. From 8.2.0 until 8.6.5, the protobufjs Text Format extension parsed string-keyed map entries using ordinary property assignment, allowing a map entry with key __proto__ to change the prototype of the returned map object instead of creating an own map entry in protobufjs/ext/textformat. This issue is fixed in version 8.6.5.","severity":{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-09","score":0.00349,"percentile":0.28788,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-1321"],"published":"2026-07-08T15:31:11Z","modified":"2026-10-28T02:31:08Z","fixes":[{"ecosystem":"npm","package":"protobufjs","fixed_in":["8.6.5"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"npm","package":"protobufjs","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"8.2.0"},{"last_affected":"8.6.4"},{"fixed":"8.6.5"}]}]},{"source":"osv","ecosystem":"npm","package":"protobufjs","ranges":[{"type":"SEMVER","events":[{"introduced":"8.2.0"},{"fixed":"8.6.5"}]}]}],"products":[{"vendor":"protobufjs","product":"protobuf.js"},{"vendor":"protobufjs_project","product":"protobufjs"}],"references":[{"url":"https://github.com/protobufjs/protobuf.js/security/advisories/GHSA-jfj6-75fj-8934","tags":["x_refsource_CONFIRM","Mitigation","Vendor Advisory","advisory","web"]},{"url":"https://github.com/protobufjs/protobuf.js/pull/2335","tags":["x_refsource_MISC","Issue Tracking","Patch","fix","web"]},{"url":"https://github.com/protobufjs/protobuf.js/commit/9f97fe413072d3beb52c74e62d88ea8adc9444d8","tags":["x_refsource_MISC","Patch","fix","web"]},{"url":"https://github.com/protobufjs/protobuf.js/releases/tag/protobufjs-v8.6.5","tags":["x_refsource_MISC","Product","Release Notes","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-59876","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-jfj6-75fj-8934"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/59xxx/CVE-2026-59876.json","tags":["advisory"]},{"url":"https://github.com/protobufjs/protobuf.js","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-59876","title":"protobufjs: Text Format string map parsing can mutate returned map object prototype","description":"protobufjs compiles protobuf definitions into JavaScript (JS) functions. From 8.2.0 until 8.6.5, the protobufjs Text Format extension parsed string-keyed map entries using ordinary property assignment, allowing a map entry with key __proto__ to change the prototype of the returned map object instead of creating an own map entry in protobufjs/ext/textformat. This issue is fixed in version 8.6.5.","status":"published","published":"2026-07-08T15:31:11.421Z","modified":"2026-07-09T14:41:45.107Z","cvss":[{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-1321"],"updated_at":"2026-11-02T14:19:58.560602Z"}],"euvd":[{"id":"EUVD-2026-42311","description":"protobufjs compiles protobuf definitions into JavaScript (JS) functions. From 8.2.0 until 8.6.5, the protobufjs Text Format extension parsed string-keyed map entries using ordinary property assignment, allowing a map entry with key __proto__ to change the prototype of the returned map object instead of creating an own map entry in protobufjs/ext/textformat. This issue is fixed in version 8.6.5.","status":"published","published":"2026-07-08T15:31:11Z","modified":"2026-07-09T14:41:45Z","cvss":[{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T18:20:04.126011Z"}],"ghsa":[{"id":"GHSA-jfj6-75fj-8934","title":"protobufjs: Text Format string map parsing can mutate returned map object prototype","description":"## Summary\n\nThe protobuf.js text format extension parsed string-keyed map entries using ordinary property assignment. A text-format map entry with key `__proto__` could therefore change the prototype of the returned map object instead of creating an own map entry.\n\nThis affected the optional Text Format extension. Other protobufjs input paths, including binary decode, `fromObject`, and ProtoJSON conversion, are not affected.\n\n## Impact\n\nAn attacker who can provide protobuf text-format input parsed by an application using `protobufjs/ext/textformat` may be able to create message objects whose string-keyed map fields have attacker-controlled prototypes.\n\nThis is per-object prototype mutation, not global `Object.prototype` pollution. Impact depends on downstream application logic treating inherited properties as meaningful, for example by using `in`, truthiness checks, or direct property access on parsed map objects instead of own-property checks.\n\nApplications that do not parse untrusted Text Format input, or that do not use inherited properties from parsed map objects in security-relevant logic, are not directly affected.\n\n## Preconditions\n\n* The application must parse attacker-controlled protobuf Text Format input with `protobufjs/ext/textformat`.\n* The target schema must contain a string-keyed map field.\n* The crafted input must provide a map entry with key `__proto__`.\n* Downstream application logic must treat inherited properties on the returned map object as meaningful for impact beyond malformed output.\n\n## Workarounds\n\nUpgrade to protobufjs 8.6.5 or newer.\n\nIf immediate upgrade is not possible, do not parse untrusted protobuf Text Format input with affected versions. Applications can also reject string map keys named `__proto__` before or during Text Format parsing, and should use own-property checks such as `Object.hasOwnProperty.call(map, key)` when consuming parsed map objects.","status":"published","published":"2026-07-20T22:04:07Z","modified":"2026-07-20T22:04:09Z","cvss":[{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-1321"],"updated_at":"2026-11-02T14:40:48.410776Z"}],"nvd":[{"id":"CVE-2026-59876","description":"protobufjs compiles protobuf definitions into JavaScript (JS) functions. From 8.2.0 until 8.6.5, the protobufjs Text Format extension parsed string-keyed map entries using ordinary property assignment, allowing a map entry with key __proto__ to change the prototype of the returned map object instead of creating an own map entry in protobufjs/ext/textformat. This issue is fixed in version 8.6.5.","status":"published","published":"2026-07-08T16:16:34.233Z","modified":"2026-10-25T17:10:00.197Z","cvss":[{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium","assessor":"secondary"},{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium","assessor":"primary"}],"cwes":["CWE-1321"],"updated_at":"2026-11-02T14:12:28.040501Z"}],"osv":[{"id":"CVE-2026-59876","title":"protobufjs: Text Format string map parsing can mutate returned map object prototype","description":"protobufjs compiles protobuf definitions into JavaScript (JS) functions. From 8.2.0 until 8.6.5, the protobufjs Text Format extension parsed string-keyed map entries using ordinary property assignment, allowing a map entry with key __proto__ to change the prototype of the returned map object instead of creating an own map entry in protobufjs/ext/textformat. This issue is fixed in version 8.6.5.","status":"published","published":"2026-07-08T15:31:11.421Z","modified":"2026-10-28T02:31:08.459120334Z","cvss":[{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-1321"],"updated_at":"2026-11-02T15:45:12.496548Z"},{"id":"GHSA-jfj6-75fj-8934","title":"protobufjs: Text Format string map parsing can mutate returned map object prototype","description":"## Summary\n\nThe protobuf.js text format extension parsed string-keyed map entries using ordinary property assignment. A text-format map entry with key `__proto__` could therefore change the prototype of the returned map object instead of creating an own map entry.\n\nThis affected the optional Text Format extension. Other protobufjs input paths, including binary decode, `fromObject`, and ProtoJSON conversion, are not affected.\n\n## Impact\n\nAn attacker who can provide protobuf text-format input parsed by an application using `protobufjs/ext/textformat` may be able to create message objects whose string-keyed map fields have attacker-controlled prototypes.\n\nThis is per-object prototype mutation, not global `Object.prototype` pollution. Impact depends on downstream application logic treating inherited properties as meaningful, for example by using `in`, truthiness checks, or direct property access on parsed map objects instead of own-property checks.\n\nApplications that do not parse untrusted Text Format input, or that do not use inherited properties from parsed map objects in security-relevant logic, are not directly affected.\n\n## Preconditions\n\n* The application must parse attacker-controlled protobuf Text Format input with `protobufjs/ext/textformat`.\n* The target schema must contain a string-keyed map field.\n* The crafted input must provide a map entry with key `__proto__`.\n* Downstream application logic must treat inherited properties on the returned map object as meaningful for impact beyond malformed output.\n\n## Workarounds\n\nUpgrade to protobufjs 8.6.5 or newer.\n\nIf immediate upgrade is not possible, do not parse untrusted protobuf Text Format input with affected versions. Applications can also reject string map keys named `__proto__` before or during Text Format parsing, and should use own-property checks such as `Object.hasOwnProperty.call(map, key)` when consuming parsed map objects.","status":"published","published":"2026-07-20T22:04:07Z","modified":"2026-09-10T03:50:12.269296263Z","cvss":[{"version":"3.1","score":4.8,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-1321"],"updated_at":"2026-11-02T15:46:50.336262Z"}]}}
