The vulnerability, CVE-2026-44289, is a denial-of-service issue in protobuf.js caused by uncontrolled recursion. The root cause is the lack of a depth check when processing nested protobuf data structures. An attacker can craft a binary protobuf payload with deeply nested messages or groups. When an application using a vulnerable version of protobuf.js attempts to process this payload, several functions can enter into a deep recursion, ultimately exhausting the JavaScript call stack and crashing the process.
The analysis of the security patch identified four primary functions that were vulnerable to this uncontrolled recursion:
Reader.skipType: This function, used for skipping unknown fields, would recursively call itself for nested group fields without any depth limit.
Type.decode: The dynamically generated decoder for each message type would recursively call itself to decode nested messages, lacking a recursion depth check.
Type.verify: The dynamically generated verifier function would recursively verify nested message objects, also without a depth limit.
Type.fromObject: The dynamically generated function to convert a plain object to a message instance would recursively process nested objects without a depth limit.
The patch addresses this vulnerability by introducing a global recursion limit (util.recursionLimit). The identified functions and their underlying code generators were modified to accept a depth parameter, increment it for each level of nesting, and throw an error if the depth exceeds the defined limit. This effectively prevents the call stack from being exhausted by malicious inputs.