CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-54269

CVE-2026-54269: Runtime Property Shadowing and Denial of Service in protobufjs

Alon Barad
Alon Barad
Software Engineer

Jul 3, 2026·6 min read·24 visits

Executive Summary (TL;DR)

Untrusted protobuf schemas can define fields matching internal properties (such as 'hasOwnProperty' or 'rpcCall'), triggering uncaught runtime exceptions that crash the execution thread (Denial of Service).

A property shadowing vulnerability exists in protobufjs where schema-derived names can collide with and overwrite runtime-critical internal helper properties. This issue leads to uncaught runtime exceptions and crash-based Denial of Service.

Vulnerability Overview

The protobufjs library is a widely deployed JavaScript and TypeScript parser designed to handle Protocol Buffers. In standard implementations, the engine translates structured schema definitions into optimized runtime objects. This process involves dynamically compiling schemas into executable code paths to achieve high-performance serialization, deserialization, and validation operations.

The vulnerability, designated as CVE-2026-54269 (and tracked via GHSA-f38q-mgvj-vph7), stems from an unsafe assumption during this dynamic compilation phase. The compiler assumes that the field names defined in arbitrary user-supplied schemas will never collide with critical built-in methods or library properties. When a schema contains specific runtime-significant names, these identifiers shadow the underlying system properties.

This flaw exposes applications to unhandled exceptions and infinite loops, causing immediate runtime execution failures. The impact is particularly high for environments parsing untrusted schemas, multi-tenant registries, or microservice gateways that ingest external configurations dynamically.

Root Cause Analysis

The root cause of this vulnerability lies in how dynamically compiled JavaScript code interacts with standard prototypical inheritance. During schema processing, the library generates helper functions using string concatenation and compiles them via the Function constructor. When validating or converting objects, the generated methods check for field presence by evaluating expressions directly on the message instance, such as message.hasOwnProperty(fieldName).

If an untrusted schema contains a field explicitly named hasOwnProperty, the instantiated object is created with an own-property of the same name. Since native JavaScript objects resolve properties on the instance before traversing the prototype chain, the schema-derived property overrides the native Object.prototype.hasOwnProperty method. When the compiled validation logic subsequently executes, it attempts to call this shadowed property as a function, resulting in a type mismatch error.

In addition to property validation, service-level RPC bindings are vulnerable to helper method shadowing. When a service defines an RPC method named rpcCall, this identifier overrides the internal prototype method designed to orchestrate remote procedures. Invoking this service wrapper triggers an unintended self-referential call sequence, yielding uncontrolled recursion (CWE-674) and terminating the thread with a stack overflow.

Finally, metadata management is disrupted by field names starting with a dollar sign. The library relies on properties such as $type to manage serialization metadata. When schema-controlled structures define conflicting properties, the type resolution mappings break down, leading to structural failures during JSON serialization and translation.

Code Analysis

To understand the vulnerability and its remediation, we examine the compilation differences introduced in patch version 7.6.3.

Prior to the patch, the validator generator in src/verifier.js generated conditional checks using direct instance invocation:

// Vulnerable logic generation pattern
if (message.field != null && message.hasOwnProperty("field")) {
    // Validation logic execution
}

If the field hasOwnProperty was present on the message instance, this check threw a TypeError: message.hasOwnProperty is not a function. The patch in PR #2311 resolved this by forcing execution to bypass local overrides through the native prototype method:

// Patched logic generation pattern
if (message.field != null && Object.hasOwnProperty.call(message, "field")) {
    // Safe validation execution
}

Similar changes were implemented across other codegen paths including src/converter.js and src/decoder.js to eliminate all instance-direct calls.

For service generation in src/service.js, the original implementation assigned method handlers that assumed this.rpcCall was the safe helper:

// Vulnerable wrapper assignment
rpcService[methodName] = util.codegen(["r","c"], methodName)("return this.rpcCall(m,q,s,r,c)");

When methodName was equal to rpcCall, executing the method caused the function to endlessly call itself. The patched implementation utilizes an explicit closure to bind and call the prototype method securely:

// Patched service wrapper assignment
rpcService[methodName] = (function(method, requestType, responseType) {
    return function rpcMethod(request, callback) {
        return rpc.Service.prototype.rpcCall.call(this, method, requestType, responseType, request, callback);
    };
})(method, method.resolvedRequestType.ctor, method.resolvedResponseType.ctor);

Exploitation Methodology

An attacker can exploit this vulnerability by submitting a malformed Protocol Buffer schema designed to shadow runtime-critical properties. The following diagram illustrates the flow from schema submission to process termination:

To construct a proof of concept, an attacker crafts a .proto file that specifies a message structure where a field conflicts with native properties:

syntax = "proto3";
 
message ExploitPayload {
    string hasOwnProperty = 1;
    string standardField = 2;
}

When the system receives and processes this schema, it evaluates the compilation definitions dynamically. If the application subsequently executes ExploitPayload.verify(incomingData) or ExploitPayload.toObject(message), the validation routine attempts to run the overridden method.

Because the value assigned to message.hasOwnProperty is a string (representing the data payload) and not a callable function, the execution halts immediately. Since JavaScript environments are single-threaded, an uncaught exception in the main loop terminates the host process.

Impact Assessment

The practical impact of CVE-2026-54269 is limited to Denial of Service (DoS) conditions. Because the vulnerability does not bypass access control parameters, it cannot be leveraged to execute arbitrary shellcode or read sensitive data from the system memory space directly.

However, in Node.js architectures, process termination represents a high operational risk. If the target application lacks robust orchestrators (such as Kubernetes pods or PM2 process managers), a single malformed payload can permanently take down the service instance. Even with active process managers, continuous exploitation can trigger crash-loop backoffs, exhausting server resources.

The CVSS v3.1 rating is 5.3 (Medium), with the vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L. This score reflects that while the execution barrier is low and requires no administrative privileges, the overall scope remains isolated to the affected component.

Remediation and Hardening

To fully remediate CVE-2026-54269, development teams must update the affected dependencies across all service boundaries. For deployments using the 7.x release stream, update protobufjs to version 7.6.3 or later. For services on the 8.x branch, transition to 8.6.0 or higher. Applications compiling schemas statically must also update protobufjs-cli to versions 1.3.3 or 2.5.1 respectively, and regenerate all static assets.

If patching cannot be executed immediately, apply input validation filters to the schema ingestion path. Block any schemas that define properties named hasOwnProperty or declare service actions named rpcCall.

Additionally, implement validation rules to reject any fields or object definitions that begin with the dollar sign character ($). This configuration prevents attackers from corrupting internal metadata parameters and protects the execution integrity of json-to-protobuf translation utilities.

Fix Analysis (1)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
EPSS Probability
0.24%
Top 85% most exploited

Affected Systems

protobufjsprotobufjs-cli

Affected Versions Detail

Product
Affected Versions
Fixed Version
protobufjs
protobufjs
< 7.6.37.6.3
protobufjs
protobufjs
>= 8.0.0, < 8.6.08.6.0
protobufjs-cli
protobufjs
< 1.3.31.3.3
protobufjs-cli
protobufjs
>= 2.0.0, < 2.5.12.5.1
AttributeDetail
CWE IDCWE-754, CWE-674
Attack VectorNetwork
CVSS Score5.3 (Medium)
EPSS Score0.0024 (Percentile: 14.70%)
ImpactDenial of Service (DoS)
Exploit StatusProof of Concept available
KEV StatusNot listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1499.004Application Exhaustion
Impact
CWE-754
Improper Check for Unusual or Exceptional Conditions

The software does not check or incorrectly checks for unusual or exceptional conditions that can occur during operation, leading to unexpected behavior or resource exhaustion.

References & Sources

  • [1]GitHub Security Advisory (GHSA-f38q-mgvj-vph7)
  • [2]NVD CVE Record (CVE-2026-54269)
  • [3]CVE.org CVE Record (CVE-2026-54269)
  • [4]Pull Request #2311: Avoid shadowing prototype properties

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•3 days ago•CVE-2026-53653
8.7

CVE-2026-53653: Unauthenticated Denial of Service via Unbounded Image Derivative Dimensions in Grav CMS

Grav CMS prior to version 1.7.53 and 2.0.0-rc.8 is vulnerable to an unauthenticated remote denial of service (DoS) vulnerability. By supplying crafted query parameters with extremely large dimensions to image assets, remote unauthenticated attackers can force the server to allocate massive amounts of system memory, leading to kernel Out-Of-Memory (OOM) termination of web worker processes.

Amit Schendel
Amit Schendel
11 views•7 min read
•3 days ago•CVE-2026-53657
8.2

CVE-2026-53657: Privilege Escalation via Overly Permissive Unix Domain Socket in Lima Guest Agent

CVE-2026-53657 is a local privilege escalation vulnerability in Lima (lima-vm/lima) affecting versions prior to 2.1.3 when configured with the QEMU driver. The guest agent daemon, running as root, creates its communication socket `/run/lima-guestagent.sock` with world-writable permissions (0777). This allows unprivileged local users to command the agent to establish arbitrary tunnels, including to privileged local UNIX sockets (like D-Bus). Because the target daemon authenticates the incoming connection using the credentials of the root-owned guest agent (via SO_PEERCRED), unprivileged users can perform root operations, resulting in complete guest VM compromise.

Amit Schendel
Amit Schendel
6 views•9 min read
•3 days ago•CVE-2026-10740
5.3

CVE-2026-10740: Denial of Service in s2n-quic CryptoStream Reassembly

An unauthenticated Denial of Service vulnerability exists in the s2n-quic library's CryptoStream reassembler due to a lack of buffer limits on out-of-order cryptographic frames. An attacker can transmit a crafted CRYPTO frame with an extremely high offset and nominal payload, forcing the receiver to execute unbounded memory allocations and causing service crashes.

Amit Schendel
Amit Schendel
6 views•7 min read
•3 days ago•CVE-2026-55153
7.1

CVE-2026-55153: JNDI Injection and Deserialization Gadget Abuse in mchange-commons-java

A JNDI Injection and Deserialization Gadget vulnerability exists in mchange-commons-java prior to version 0.6.0. The com.mchange.v2.naming.JavaBeanObjectFactory component permits arbitrary class instantiation and setter invocation, allowing attackers to perform Server-Side Request Forgery (SSRF) and remote class loading.

Alon Barad
Alon Barad
7 views•5 min read
•3 days ago•GHSA-8RW6-P7M8-63JP
6.5

GHSA-8RW6-P7M8-63JP: Array Element-Level SELECT Permissions Leak in SurrealDB

SurrealDB versions supporting element-level SELECT permissions on arrays are vulnerable to a logical authorization bypass. Due to an index-shifting error during array filtration, restricted elements can skip permission checks and leak to unauthorized record users.

Alon Barad
Alon Barad
10 views•6 min read
•4 days ago•CVE-2026-12243
7.5

CVE-2026-12243: Incomplete Path Traversal Validation and Percent-Encoding Bypass in NLTK

CVE-2026-12243 is a path traversal vulnerability in the Natural Language Toolkit (NLTK) version 3.9.4. The flaw exists because the input validation routine fails to account for percent-encoded directory traversal sequences like '..%2f' before passing them to urllib.request.url2pathname(), which decodes them into active traversal sequences.

Amit Schendel
Amit Schendel
8 views•8 min read