Skip to main content

oRPC json-schema EUVDEUVD-2026-91791

| CVE-2026-103036 MEDIUM
Improperly Controlled Modification of Dynamically-Determined Object Attributes (CWE-915)
2026-10-02 GitHub_M
6.5
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach oRPC object-input procedure
  2. Delivery
    Send JSON with __proto__/constructor keys
  3. Exploit
    Coercer treats inherited values as sub-schemas
  4. Execution
    Poison single request object properties
  5. Impact
    Skew handler/config lookups for that request

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V4 - API and Web Service Object attribute protection
Exploitation Conditions

Exploitation requires the target application to use the @orpc/json-schema SmartCoercionPlugin (JsonSchemaCoercer) and to expose at least one procedure with an OBJECT input schema reachable by the remote client; the attacker then supplies '__proto__' or Object.prototype member names (e.g. 'constructor', 'toString') in the request body. Limiting factors that reduce real-world risk: the manipulation is scoped to the single coerced request object only - global Object.prototype, other objects, concurrent requests, and other users are unaffected; legitimate '__proto__' own-properties are dropped; and downstream schema validation still runs after coercion, constraining how far poisoned values propagate into handler, Object.assign, or configuration logic. Deployments not using SmartCoercionPlugin, or using only non-object input schemas, are not exposed.

Impact

This is a moderate, not high-priority, issue despite a reasonable CVSS 6.5. The vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N confirms a remote, unauthenticated, low-complexity reach against any procedure exposing an object input schema, which is why the base score is non-trivial. However, the real-world severity is materially bounded by the vulnerability's own description: this is a SCOPED prototype manipulation, not classic global prototype pollution - the global Object.prototype, unrelated objects, concurrent requests, and other users are explicitly NOT affected, and downstream schema validation still executes. The impact is therefore limited to attacker-controlled inherited properties influencing the single coerced request object's handler, Object.assign, or configuration lookups (C:L/I:L, A:N), consistent with an SSVC 'partial' technical impact rather than total. No EPSS score, no CISA KEV listing, and no public POC were provided in the intelligence set, so there is no signal of active or probable near-term exploitation - this reads as a defensively-disclosed GitHub advisory (reporter GitHub_M, GHSA-4h5r-cv8j-4456) with a vendor patch already shipped. There is no conflict between signals; the main caveat is that EPSS/KEV/POC data is simply absent rather than contradictory, so exploitation likelihood cannot be quantified and should be treated as low-to-unknown.

Exploit ScenarioDerived

An attacker reaches an oRPC procedure whose input is an object schema and is coerced by the @orpc/json-schema SmartCoercionPlugin. They submit a JSON payload containing '__proto__' or Object.prototype member names such as 'constructor' or 'toString', causing inherited values to be treated as sub-schemas and influencing the handler's subsequent property, Object.assign, or configuration lookups for that request. No public exploit code was identified at time of analysis, and the manipulation is confined to that single request object rather than the global prototype.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 02, 2026

Prototype-chain manipulation in the oRPC @orpc/json-schema SmartCoercionPlugin (versions prior to 1.14.9) lets a remote, unauthenticated client inject __proto__ or Object.prototype member names such as constructor and toString into a request body handled by any procedure that declares an object input schema. Abused successfully, this can steer the single coerced request object so attacker-controlled inherited values are treated as sub-schemas and satisfy the coercer's check, potentially influencing handler logic, Object.assign calls, or configuration lookups, with a secondary information-disclosure angle noted in vendor metadata. Impact is strictly bounded - the global Object.prototype, concurrent requests, other users, and unrelated objects are not modified, legitimate own-property __proto__ fields are dropped, and downstream schema validation still runs - and no public exploit code has been identified at time of analysis; the issue is not listed in CISA KEV.

RemediationAI

Vendor-released patch: oRPC 1.14.9 (and later) contains the complete fix - upgrade @orpc/json-schema and the related oRPC packages to 1.14.9 or newer via your package manager and redeploy, verifying against the release notes at https://github.com/middleapi/orpc/releases/tag/v1.14.9 and the advisory at https://github.com/middleapi/orpc/security/advisories/GHSA-4h5r-cv8j-4456. If an immediate upgrade is not possible, the most effective compensating control is to stop using SmartCoercionPlugin on any procedure that accepts an object input schema (or disable it globally), accepting the loss of automatic type coercion and the resulting need to coerce and validate inputs manually in handlers. A second option is to reject or strip request-body keys named __proto__, constructor, and prototype at the edge (reverse proxy, gateway, or custom request middleware) before JSON reaches the coercer; this neutralizes the attack path but will break legitimate payloads that genuinely use those field names, and it must be applied to every entry point to be effective. Relying on downstream schema validation alone is not a sufficient fix, since the malicious values must already pass the coercer to reach that stage; it does limit how far poisoned values propagate into handler, Object.assign, or configuration logic, but it is a defense-in-depth measure rather than a remedy. No vendor-released patch regression or backport for older major lines is documented in the supplied data.

Affected VersionsENISA

orpc < 1.14.9

Affected Packages

euvd orpc fix: 1.14.9

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw sits in JsonSchemaCoercer, the coercion engine inside the @orpc/json-schema package's SmartCoercionPlugin, which pre-processes incoming request payloads against an OpenAPI/JSON Schema definition before the oRPC handler runs. The coercer accumulated coerced object properties in an ordinary {} object and resolved sub-schemas via schema.properties?.[key], so both operations traversed the JavaScript prototype chain: a client-supplied __proto__ key could replace the prototype of the coerced request object rather than becoming an own property, and names inherited from Object.prototype (for example constructor, toString) resolved to inherited function values that were accepted as sub-schemas and passed the coercer's satisfaction check. This maps to CWE-915, Improperly Controlled Modification of Dynamically-Determined Object Attributes - classic client-side/JavaScript prototype pollution, here scoped to a single request-scoped object rather than the global Object.prototype. The vendor fix (PR #1726, commit 8a35262) allocates the accumulator with a null-prototype object (NullProtoObj) so coercedItems[key] = value can never reach Object.prototype members, and gates sub-schema lookup with Object.hasOwn(schema.properties, key) so only genuine own properties are treated as schemas; the accompanying test asserts that __proto__ remains an own property, that polluted never appears on the coerced object or on {}, and that constructor/toString are coerced as ordinary boolean values. Per the authoritative assessment, the CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N vector confirms an unauthenticated, network-reachable attack with low confidentiality and integrity impact and no availability impact.

Know when Orpc gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 6.5 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
vuln.today AI 6.5 MEDIUM

Remote unauthenticated client can trigger coercion with no special conditions (AV:N/AC:L/PR:N/UI:N); impact is scoped to the request object with partial C/I and no availability loss (S:U/C:L/I:L/A:N).

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Oct 02, 2026 - 21:03 EUVD

DescriptionCVE.org

oRPC is a tool that helps build APIs that are end-to-end type-safe and adhere to OpenAPI standards. Prior to 1.14.9, the @orpc/json-schema SmartCoercionPlugin uses JsonSchemaCoercer to collect object properties in a plain object and to resolve schema.properties entries through the prototype chain. A remote client that can reach a procedure with an object input schema can supply __proto__ to replace the prototype of the single coerced request object, or supply Object.prototype member names such as constructor and toString so inherited values are treated as sub-schemas and pass the coercer's satisfaction check. Attacker-controlled inherited properties can consequently affect handler, Object.assign, or configuration lookups, while legitimate __proto__ properties are dropped. The global Object.prototype, unrelated objects, other requests, and other users are not modified, and downstream schema validation still runs. This issue is fixed in version 1.14.9.

Threat Intelligence Overview

EPSS Score
0.2%
Top 87% exploitable
Prevalence
Low
niche TypeScript/Node RPC library, limited and non-ubiquitous production footprint
Data Quality
6 sources
Confidence: High

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

32
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy