CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-24766

NocoDB Prototype Pollution: Crashing the Database Party with One JSON Key

Amit Schendel
Amit Schendel
Senior Security Researcher

Jan 28, 2026·4 min read·32 visits

Executive Summary (TL;DR)

NocoDB versions < 0.301.0 allow authenticated users (Org Creators) to trigger Prototype Pollution via the connection test API. This corrupts the global Object prototype, causing the underlying Knex.js database driver to fail, effectively crashing the entire instance until a restart.

A classic Prototype Pollution vulnerability exists in NocoDB's connection testing endpoint. By supplying a crafted JSON payload containing the `__proto__` key, authenticated attackers can poison the global Object prototype. This typically results in a catastrophic application-wide Denial of Service (DoS) as core database drivers choke on the unexpected properties, turning this 'database-as-spreadsheet' tool into a 'server-as-paperweight'.

The Hook: When Spreadsheets Go Rogue

NocoDB is a darling of the low-code world, effectively turning any database into a smart spreadsheet (think Airtable, but open source and self-hosted). It's built on a modern Node.js stack, which makes it performant, flexible, and—as it turns out—susceptible to one of JavaScript's most notorious footguns: Prototype Pollution.

While the vulnerability requires org-level-creator privileges (which sounds high, but in many self-hosted instances, is quite common for developers or power users), the impact is disproportionate. We aren't just talking about deleting a row; we are talking about poisoning the water supply of the entire Node.js process. Once the prototype is polluted, every object created subsequently carries the taint, leading to chaos in completely unrelated parts of the application.

The Flaw: Reinventing the Merge Wheel

The root cause here is a tale as old as time (or at least as old as ES6). The developers needed to merge configuration objects recursively. Instead of reaching for a battle-tested library or using safe primitives, they implemented a custom deepMerge utility in packages/nocodb/src/utils/dataUtils.ts.

Deep merging is deceptively simple. You iterate over keys in a source object and copy them to a target. But if you don't explicitly block keys like __proto__, constructor, or prototype, an attacker can instruct the merge function to step outside the bounds of the target object and modify the blueprint of Object itself.

In this specific case, the deepMerge function blindly walked down the path provided by the user input. When it encountered __proto__, it didn't stop; it modified the global Object.prototype. This means every plain object in the application suddenly inherits whatever garbage property the attacker injected.

The Code: Anatomy of a Poisoning

Let's look at the logic flaw. While we don't have the exact byte-for-byte original source, the pattern is unmistakable. A vulnerable recursive merge looks something like this:

// The Vulnerable Pattern
const deepMerge = (target, source) => {
  for (const key in source) {
    if (isObject(source[key])) {
      if (!target[key]) Object.assign(target, { [key]: {} });
      deepMerge(target[key], source[key]); // Recursion without checks
    } else {
      // If key is "__proto__", we are writing to Object.prototype!
      Object.assign(target, { [key]: source[key] });
    }
  }
  return target;
}

The fix in version 0.301.0 was decisive. Instead of trying to patch the holes in their custom logic, the NocoDB team ripped it out entirely. They replaced the manual recursion with rfdc (Really Fast Deep Clone) and hardened their expression parsing with nc-jsep.

// The Fix (Conceptual)
import rfdc from 'rfdc';
const clone = rfdc();
 
// rfdc does not copy prototype properties by default
const mergedConfig = clone(userInput);

This is the correct approach: don't write your own crypto, and don't write your own deep merge unless you enjoy reading CVE reports about your code.

The Exploit: Crashing Knex.js

To trigger this, an attacker needs access to the /api/v2/meta/connection/test endpoint. This endpoint allows users to test database connection strings. The payload is a JSON object defining the connection parameters.

Here is the payload that brings the server to its knees:

POST /api/v2/meta/connection/test
Content-Type: application/json
 
{
  "client": "mysql",
  "connection": {
    "host": "127.0.0.1",
    "__proto__": {
      "polluted": true,
      "client": "malicious_override"
    }
  }
}

When NocoDB processes this, deepMerge pollutes the global object. Why does this cause a Denial of Service? NocoDB relies on Knex.js for database operations. Knex (and many other libraries) iterates over configuration objects or checks for the existence of specific internal flags.

Once Object.prototype has a property like polluted or specific internal flags modified, Knex throws errors during query construction or connection pooling. Since the Node.js process memory is shared, every single database request from every user will now fail until the server is manually restarted. It is a persistent, zombies-everywhere scenario.

The Fix: Better Libraries, Better Life

The mitigation strategy employed by the NocoDB team highlights an important lesson in modern software development: dependency management is a security feature.

  1. Replace Custom Logic: They swapped the custom merge for rfdc. rfdc is designed to be fast and safe, ignoring prototype properties.
  2. Harden Parsers: They moved to a hardened fork of jsep (nc-jsep) to prevent similar injection attacks in their formula/expression evaluation logic.

For administrators running NocoDB, the only real fix is to patch. If you are on a version < 0.301.0, you are sitting on a ticking time bomb—albeit one that requires a somewhat privileged user to detonate.

Official Patches

NocoDBRelease notes for version 0.301.0 detailing the fix.

Technical Appendix

CVSS Score
4.9/ 10
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H

Affected Systems

NocoDB Server

Affected Versions Detail

Product
Affected Versions
Fixed Version
NocoDB
NocoDB
< 0.301.00.301.0
AttributeDetail
CWE IDCWE-1321
Attack VectorNetwork (API)
CVSS4.9 (Medium)
ImpactDenial of Service (DoS)
PrivilegesHigh (Org Creator)
Fix Version0.301.0

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1210Exploitation of Remote Services
Lateral Movement
CWE-1321
Prototype Pollution

Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')

Known Exploits & Detection

GitHub Security AdvisoryAdvisory containing the attack vector analysis and payload structure.

Vulnerability Timeline

Fix committed to repository
2026-01-13
Security Advisory Published
2026-01-28
CVE Assigned
2026-01-28

References & Sources

  • [1]GHSA-95ff-46g6-6gw9
  • [2]NVD - CVE-2026-24766

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•1 minute ago•CVE-2026-106449
3.7

CVE-2026-106449: Stack Overflow via Uncontrolled Recursion in yawkat lz4-java

A Denial of Service (DoS) vulnerability exists in the yawkat fork of lz4-java prior to version 1.11.4. Under specific non-default configurations (stopOnEmptyBlock = false), parsing crafted streams with a large sequence of contiguous empty LZ4 blocks triggers uncontrolled recursion inside the LZ4BlockInputStream.refill() method, causing stack exhaustion and thread termination.

Alon Barad
Alon Barad
0 views•6 min read
•33 minutes ago•CVE-2026-76485
9.8

CVE-2026-76485: Remote Code Execution in Cisco NX-OS VXLAN OAM (NGOAM)

CVE-2026-76485 is a critical stack-based buffer overflow vulnerability in the VXLAN OAM (NGOAM) parsing component of Cisco NX-OS Software. The flaw enables an unauthenticated, remote attacker to execute arbitrary code with root privileges or trigger a denial of service on affected Nexus switches. This vulnerability is triggered through crafted packets sent to an IP interface. No workarounds are currently available to mitigate the vulnerability while preserving the NGOAM functionality. Cisco has published software patches to address this flaw.

Alon Barad
Alon Barad
4 views•6 min read
•about 1 hour ago•CVE-2026-106451
7.3

CVE-2026-106451: Local Privilege Escalation via JNI Extraction TOCTOU in lz4-java

A local privilege escalation and code execution vulnerability exists in the yawkat fork of lz4-java when extracting its bundled JNI shared library into the system temporary directory. Predictable path derivation and lack of exclusive file creation flags allow a local attacker to hijack library loading via a race condition.

Alon Barad
Alon Barad
5 views•6 min read
•about 2 hours ago•CVE-2026-105698
5.4

CVE-2026-105698: Missing Authorization in Deprecated Chat Vertices Endpoints in Langflow

A missing authorization vulnerability in Langflow versions 1.0.0 through 1.10.0 allows authenticated users (and unauthenticated users in versions prior to 1.7.2) to access private workflow structures and execute graph components by targeting deprecated API endpoints.

Amit Schendel
Amit Schendel
4 views•8 min read
•about 3 hours ago•CVE-2026-105697
9.9

CVE-2026-105697: OS Command Injection in Langflow Model Context Protocol Integration

A critical OS command injection vulnerability exists in Langflow's Model Context Protocol (MCP) server integration using stdio transport, allowing unauthenticated remote command execution under default configurations.

Alon Barad
Alon Barad
7 views•5 min read
•about 4 hours ago•CVE-2026-105745
6.7

CVE-2026-105745: Arbitrary Code Execution via Malicious Entrypoint Discovery in Docling base_factory

Docling prior to version 2.131.0 is vulnerable to arbitrary local code execution during module initialization due to incorrect order of operations in its plugin discovery system. Even when the default option to reject external plugins is active, Docling utilizes Pluggy to scan and import entrypoints before performing namespace validation.

Amit Schendel
Amit Schendel
7 views•6 min read