What Is Prototype Pollution? How to Prevent It
Prototype pollution is an attacker adding uncontrolled properties to the prototype all objects inherit from. A table of client and server impact, why it is hard to notice, dangerous key rejection defense and evidence based scanning with KAOS.
Quick answer: Prototype pollution is when an attacker adds properties in an uncontrolled way to the shared prototype object that all objects inherit from in JavaScript applications. The attacker uses special keys in user input (for example keys that reach the object prototype) to inject a default value that applies to every object in the application. The result can range from bypassing security checks and denial of service to cross site scripting on the client and, in some cases, remote code execution on the server. The root fix is to reject dangerous keys when merging user input into an object, use safe merge methods and make the prototype immutable.
Prototype pollution is an abuse of JavaScript's object inheritance model and appears both in the browser and on the server. A seemingly harmless merge operation can change the behavior of the whole application. This article explains how prototype pollution happens, its impact and the correct defense.
How prototype pollution works
In JavaScript every object inherits properties from a shared prototype object. When an application deeply merges data from the user into an existing object, the attacker can put a special key into the data that reaches the prototype. This key writes the data not directly to the object but to the prototype shared by all objects. So a property never defined before suddenly exists on every object in the application.
That is the real danger: the attacker changes not their own object but the shared behavior of all the application's objects.
Impact depends on context
| Environment | Possible impact | Example |
|---|---|---|
| Client (browser) | XSS, security bypass | Triggering XSS with the injected property |
| Server (Node.js) | DoS, logic bypass, RCE | Overwriting a config field to run a command |
| Business logic | Authorization and control bypass | A non default privilege being assumed |
Prototype pollution is not always critical on its own, but its impact grows dramatically when combined with a suitable gadget. So it must be assessed together with context.
Why it is hard to notice
Prototype pollution does not look like a visible bug in the code. The merge operation works correctly in most cases, the flaw only triggers when the attacker sends the special key. Also, the effect of the pollution can appear not where the pollution happens but at a very different point in the application. Like insecure deserialization, this is a class that requires tracing the data flow.
The correct defense
1. Reject dangerous keys
When merging user input into an object, special keys that reach the prototype must be explicitly rejected. Input validation must be done with an allow list that permits only expected keys.
2. Safe data structures and merging
Using data structures without prototype inheritance isolates user data from the prototype. Deep merge operations must use safe methods that prevent writing to the prototype.
3. Freezing the prototype
By making the application's critical object prototypes immutable, writing to the prototype at runtime can be prevented.
4. Keeping dependencies up to date
Prototype pollution often stems from merge functions in the libraries used. Dependencies must be kept up to date and known vulnerable versions avoided.
Prototype pollution scanning with KAOS
DSET's local AI security engine KAOS tests prototype pollution vectors with an evidence first approach. It injects special keys reaching the prototype at input points, observes whether the pollution actually changes application behavior and verifies in a controlled way whether it combines with a gadget into an exploitable result. It reports only findings that genuinely produce impact without false positive noise. So as part of your web application penetration testing you make this silent flaw class visible.
Frequently asked questions
Is prototype pollution always critical? No. On its own it is often medium, but if there is a suitable gadget in the application it can escalate to XSS on the client and remote code execution on the server. The severity depends on where the pollution reaches and must be assessed with context.
Is input validation alone enough? Input validation is a strong defense but should not be considered sufficient alone. Rejecting dangerous keys, using safe data structures and keeping dependencies up to date must be applied together.
Is this only a Node.js problem? No. Prototype pollution appears both in the browser and on the server. It can lead to XSS and security bypass on the client and logic bypass and code execution on the server.
Sources
- PortSwigger Web Security Academy, Prototype pollution: https://portswigger.net/web-security/prototype-pollution
- OWASP, Prototype Pollution Prevention: https://cheatsheetseries.owasp.org
To test your web application against prototype pollution and OWASP Top 10 flaws with a working proof, contact DSET. We provide penetration testing and secure code review from our Ankara Hacettepe Teknokent laboratory.
Kimliğinizi doğrulayın
Yetkilendirilmiş erişim alanı. Tüm giriş denemeleri kayıt altına alınır.