惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
L
LangChain Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
有赞技术团队
有赞技术团队
B
Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
Martin Fowler
Martin Fowler
H
Hackread – Cybersecurity News, Data Breaches, AI and More
M
MIT News - Artificial intelligence
Recent Announcements
Recent Announcements
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
博客园 - Franky
小众软件
小众软件

NodeJS Security & NodeJS Secure Coding's Blog

Hardening Your npm and pnpm Configs in the Age of Shai-Hulud Argument Injection vulnerability in git-blame@1.4.0 Argument Injection vulnerability in `gits@0.1.8` Command Injection vulnerability in `@fab1o/git@1.4.0` Command Injection vulnerability in `git-contributors` via unsanitized CLI arguments Command Injection vulnerability in `git-q@0.0.3` Command injection vulnerability via unsanitized CLI arguments in touxing/fast-git-clone Command Injection vulnerability in `willitmerge@0.2.1` A Directory Traversal Vulnerability I found in Mastra AI Frameworks MCP Server Mastering NPX: A Cheatsheet for npm and Node.js Power Users Mitigate Supply Chain Security with DevContainers and 1Password for Node.js Local Development The Tale of the Vulnerable MCP Database Server Bad Security Defaults in Mastra AI Frameworks Templates SQL Injection and Bypassing "Read-Only" Mode in Xata's MCP Server Security Advisory for qix npm supply-chain compromise affecting debug and billions of weekly download users How to Mitigate SQL Bypass in MCP Servers Enhancing MCP Server Security: A Guide to Using execFile Argument Injection Vulnerability in ggit How to Bypass Access Control in PostgreSQL in Simple PSQL MCP Server for SQL Injection Command Injection Flaws in ggit: Unveiling a Vulnerability Command Injection Vulnerability in Create MCP Server STDIO Tool Exposes System Monitoring Functions GitHub Kanban MCP Server Command Injection Vulnerability Threatens Developer Workflows Critical Command Injection Flaw in iOS Simulator MCP Server Exposes Development Environments Command Injection Vulnerability Discovered in Codehooks MCP Server: A Critical Security Analysis SSRF Shenanigans in safe-axios: Redirects Open the Backdoor SSRF Vulnerability in safe-axios: Unintended Public Address Classification Bypassing SSRF Safeguards in ssrfcheck: A Case of Incomplete Denylists Don't Be Fooled by Multicast, SSRF Bypass in private-ip Node.js Authentication from Lucia to Better Auth Bypassing SSRF Protection in nossrf: When Your Safeguards Become Loopholes
Understanding and Preventing Prototype Pollution in Node.js
2024-07-10 · via NodeJS Security & NodeJS Secure Coding's Blog

Node.js and JavaScript developers feel right-at-home to work with JSON and regularly work and manipulate objects and their prototypes. However, this fundamental feature of JavaScript can also be a source of significant security vulnerabilities if not handled carefully. Today, we’re going to dive deep into one such vulnerability: Prototype Pollution.

ProtoType Pollution in Node.js

What is Prototype Pollution?

Prototype Pollution is a security vulnerability that occurs when an attacker is able to manipulate the prototype of JavaScript objects. These object manipulation actions can lead to unexpected behavior in your application, potentially resulting in denial of service, remote code execution, or even cross-site scripting attacks. All of these can have serious consequences for the security and integrity of your application, regardless if such JavaScript code is running on the client-side or server-side.

In JavaScript, all objects inherit properties from their prototype. The Object.prototype is at the root of every normal object, and its properties are inherited by all objects through the prototype chain. Prototype Pollution occurs when an attacker finds a way to add or modify properties of Object.prototype. By doing this, they can affect the behavior of all objects in the application, depending on how the application interacts with these objects.

How Does Prototype Pollution Work?

To understand Prototype Pollution, we need to first understand two key concepts in JavaScript:

  1. The __proto__ property
  2. The constructor.prototype property

Both of these properties provide access to an object’s prototype in JavaScript. If an attacker can control any kind of user input that ends up modifying these properties, they can potentially pollute the prototype chain. Note: there’s a difference in terms of impact between prototype pollution and prototype poisoning but we won’t go into that in the scope of this write-up.

Let’s look at a simple prototype pollution example:

const user = {};

user.__proto__.isAdmin = true;

const newUser = {};

console.log(newUser.isAdmin); // true

In this example, we’ve added an isAdmin property to the prototype of all objects, because user.__proto__ is the same as Object.prototype. Tip: You can open up the DevTools console in your browser and try this out to see the results for yourself and explore the connection between objects and their prototypes. Now, every object we create will have this property set to true.

Real-World Example: Vulnerability in @akbr/update

To illustrate how Prototype Pollution can occur in real-world scenarios, let’s examine a vulnerability that was discovered in the @akbr/update package. Surely, an old package, unmaintained and not practically used but nevertheless, a good example to understand the concept.

The @akbr/update package is described as a tool to “Immutably patch JS objects.”. Here’s an example of its intended use:

var obj = { hello: 'world' };

var obj2 = update(obj, 'foo', 'bar');

console.log(obj2);

// {hello: "world", foo: "bar"}

However, this package had a vulnerability that allowed for Prototype Pollution. Let’s look at a proof-of-concept exploit, as provided by the security researcher who discovered the vulnerability:

(async () => {

const lib = await import('@akbr/update');

var victim = {};

console.log('Before Attack: ', JSON.stringify(victim.__proto__));

try {

lib.default({}, [['__proto__'], 'polluted'], true, true);

} catch (e) {}

console.log('After Attack: ', JSON.stringify(victim.__proto__));

delete Object.prototype.polluted;

})();

When we run this code, we get the following output:

Before Attack: {}

After Attack: {"polluted":true}

As we can see, we’ve successfully added a polluted property to the prototype of all objects.

The Dangers of Prototype Pollution

The consequences of Prototype Pollution can be severe:

  1. Denial of Service: By polluting prototypes with unexpected properties, you can cause applications to crash or behave erratically.

  2. Remote Code Execution: In some cases, polluted properties can be used to inject and execute malicious code.

  3. Logic Manipulation: Prototype Pollution can be used to bypass security checks or alter application logic.

Preventing Prototype Pollution

To prevent Prototype Pollution, consider the following strategies:

  1. Input Validation: Always validate and sanitize user input, especially when it’s used to set object properties.

  2. Use Object.create(null): This creates objects without a prototype, making them immune to prototype pollution.

  3. Freeze the Object Prototype: Use Object.freeze(Object.prototype) to prevent modifications to the Object prototype.

  4. Use a Library: Consider using libraries that are known to be secure and have been audited for vulnerabilities. Many Lodash and other utilities libraries were found to be vulnerable to Prototype Pollution in the past. If you source out a library, make sure to always monitor these dependencies for future security vulnerabilities.

  5. Code Reviews and Security Audits: Regularly review your code and dependencies for potential vulnerabilities.

Conclusion

Prototype Pollution is a subtle but powerful vulnerability that can have far-reaching consequences in JavaScript applications. I’ve seen security issues that start with a prototype pollution exploitation and escalate to an SQL injection or a remote code execution attack. So, don’t get fooled by the simplicity of the concept or other false negative assumptions. Especially with code running on the server-side, as Node.js developers, it’s crucial that we understand this vulnerability and take steps to prevent it in our code.