Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach oRPC procedure with object/record input
-
DeliverySend JSON payload containing __proto__ key
-
ExploitCoercion resolves shape keys via prototype chain
-
ExecutionInherited values reach request lookups or raise TypeError
-
ImpactRequest-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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
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.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Prototype pollution in oRPC before 1.13.6. PoC and patch available.
Prototype-chain manipulation in the oRPC @orpc/json-schema SmartCoercionPlugin (versions prior to 1.14.9) lets a remote,
Cache-key pollution in the @orpc/server CORS plugin (oRPC versions prior to 1.14.8) allows remote, unauthenticated clien
EUVD-2026-91793
GHSA-gcgf-fh7c-8gf2
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB