Skip to main content

oRPC EUVDEUVD-2026-91793

| CVE-2026-103918 MEDIUM
Improperly Controlled Modification of Dynamically-Determined Object Attributes (CWE-915)
2026-10-02 GitHub_M GHSA-gcgf-fh7c-8gf2
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 procedure with object/record input
  2. Delivery
    Send JSON payload containing __proto__ key
  3. Exploit
    Coercion resolves shape keys via prototype chain
  4. Execution
    Inherited values reach request lookups or raise TypeError
  5. Impact
    Request-scoped info disclosure or crafted-request failure

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

The target application must use the @orpc/zod ZodSmartCoercionPlugin or experimental_ZodSmartCoercionPlugin at a version prior to 1.14.10, and must expose at least one procedure whose Zod input schema is an object or record type (z.object / z.record). A remote client only needs to be able to reach such a procedure and submit a crafted input (e.g. a __proto__ key, or object keys like constructor/toString); no authentication (PR:N) and no user interaction (UI:N) are required. Limiting factors that reduce real-world impact: the effect is confined to the attacker's own crafted request object - it does not modify the global Object.prototype, other requests, other users, or persistent process state - so there is no cross-tenant or persistent availability impact, and the attacker must know of a procedure that accepts object/record input and relies on the smart-coercion plugin.

Impact

This is a genuine but moderate-priority vulnerability (CWE-915, prototype injection) in the @orpc/zod ZodSmartCoercionPlugin. The provided CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N, base 6.5) is internally consistent with the description: a remote, unauthenticated client reaching any procedure that accepts object or record input can send a __proto__ payload during input coercion. The exploitation status is 'no public exploit identified at time of analysis' - no KEV listing, no POC flag, and no EPSS probability were supplied, so there is no evidence of active or at-scale exploitation. The SSVC/impact signals argue against treating this as critical: the advisory and description explicitly scope the damage - the global Object.prototype, unrelated objects, other requests, and other users are NOT modified, and the availability impact is limited to the single crafted request (an unhandled TypeError before validation), not persistent process-wide denial of service, which is why A:N is appropriate. The realistic risk is therefore request-scoped: attacker-controlled inherited values reaching that one request's application lookups (the C:L / I:L basis). Net: a real issue worth patching promptly for anyone running the affected plugin, but not a drop-everything emergency absent active-exploitation signals. No EPSS/KEV/POC data was provided, so exploitation likelihood cannot be quantified from the input.

Exploit ScenarioDerived

An attacker with network reach to an oRPC API procedure that validates object or record input via the ZodSmartCoercionPlugin sends a JSON body containing a __proto__ key (e.g. {"a":"123","__proto__":{"polluted":"true"}}). During smart coercion the library builds a plain object and resolves shape keys through the prototype chain, so the crafted prototype or inherited members (constructor, toString) feed back into the request object's lookups or trigger an unhandled TypeError before validation. No public exploit code is identified, but the fix PR (#1727) includes a working reproduction test demonstrating the payload.

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 injection in oRPC's @orpc/zod smart-coercion plugin (versions prior to 1.14.10) allows a remote, unauthenticated client that can reach any procedure accepting object or record input to supply a crafted __proto__ key, causing attacker-controlled inherited properties to surface in subsequent application lookups, or to trigger an unhandled TypeError when keys such as constructor or toString are treated as inherited Zod schemas before validation. The impact is bounded: only the attacker's own crafted request object is affected - the global Object.prototype, other requests, other users, and persistent process state are untouched - which keeps this a moderate-severity information-disclosure and integrity issue (CVSS 3.1 base 6.5, AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N) rather than a cross-tenant compromise. No public exploit code or confirmed active exploitation was identified at time of analysis; the fix is a public upstream change shipped in oRPC 1.14.10.

RemediationAI

Vendor-released patch: upgrade @orpc/zod and the oRPC packages to version 1.14.10 or later, which allocates coerced objects with a null prototype and uses Object.hasOwn when resolving schema shape keys (commit 26314dfb443237c495116c5794d3d30a7a22c570, PR https://github.com/middleapi/orpc/pull/1727, release https://github.com/middleapi/orpc/releases/tag/v1.14.10, advisory https://github.com/middleapi/orpc/security/advisories/GHSA-gcgf-fh7c-8gf2). If immediate upgrading is not possible, temporary mitigations include: disabling ZodSmartCoercionPlugin / experimental_ZodSmartCoercionPlugin entirely, at the cost of losing automatic type coercion for all procedures that used it; rejecting or stripping client input keys named __proto__, constructor, prototype, and toString at the API gateway or before the plugin runs, with the trade-off that any legitimate procedure field with one of those names will stop accepting data; or narrowing exposure by ensuring procedures that take object/record input are only reachable by trusted internal callers, which reduces the attack surface but does not fix the underlying coercer. Applications should also verify that handler logic does not perform property lookups on coerced input in a way that could trust inherited values, and after patching should re-confirm that __proto__, constructor, and toString inputs are handled as ordinary own properties.

Affected VersionsENISA

orpc < 1.14.10

Affected Packages

npm @orpc/zod fix: 1.14.10
euvd orpc fix: 1.14.10

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in npm, euvd

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

Technical ContextAI · show details

oRPC is an end-to-end type-safe RPC/API framework, and its @orpc/zod package provides ZodSmartCoercionPlugin (and the experimental_ZodSmartCoercionPlugin for Zod 4) which coerce incoming client input to match declared Zod input schemas. Internally, the coercer built the coerced result by assigning untrusted keys into plain object literals (newObj[key] = value) and resolved the sub-schema for each key via the prototype chain (schema_.shape[k]). Because JavaScript objects inherit from Object.prototype, a client-supplied __proto__ key overwrote the returned object's prototype, and keys like constructor or toString resolved to inherited members instead of Zod schemas - an instance of CWE-915, improperly controlled modification of dynamically-determined object attributes. The upstream fix in commit 26314dfb443237c495116c5794d3d30a7a22c570 (PR #1727) allocates the result with a null-prototype object (NullProtoObj) so key assignment cannot reach Object.prototype, and replaces the prototype-chain lookup with Object.hasOwn(shape, k) ? shape[k] : undefined before falling back to catchall, so inherited members are never used as sub-schemas. The accompanying tests confirm that __proto__ remains an own property, that {} is not polluted, and that constructor/toString inputs are coerced normally. The affected CPE is cpe:2.3:a:middleapi:orpc:*:*:*:*:*:*:*:* (all versions before 1.14.10).

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 reaches an object/record procedure (AV:N/AC:L/PR:N/UI:N); impact is request-scoped prototype injection (C:L/I:L) with no persistent process-wide denial of service, so 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.10, the @orpc/zod ZodSmartCoercionPlugin and experimental_ZodSmartCoercionPlugin collect object and record properties in plain objects and resolve shape keys through the prototype chain. A remote client that can reach a procedure with an object or record input can supply __proto__ to replace the prototype of the returned request object, allowing attacker-controlled inherited values to reach application lookups. For object schemas, keys such as constructor, toString, and __proto__ can instead resolve inherited members as Zod schemas and cause an unhandled TypeError before validation. The global Object.prototype, unrelated objects, other requests, and other users are not modified, and the availability effect is limited to crafted requests rather than persistent process-wide state. This issue is fixed in version 1.14.10.

Threat Intelligence Overview

EPSS Score
0.2%
Top 87% exploitable
Prevalence
Low
niche TypeScript RPC library, developer tool with limited production footprint
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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 Yes
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

52
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: +20
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