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

dottie.js: The "One-Deep" Security Check That Failed

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 26, 2026·5 min read·83 visits

Executive Summary (TL;DR)

dottie.js versions 2.0.4-2.0.6 contain a trivial bypass for a previous prototype pollution fix. By using a path like 'key.__proto__.polluted' instead of '__proto__.polluted', attackers can execute arbitrary code or cause denial of service. Fixed in v2.0.7.

A classic example of a failed patch. The popular dottie.js library attempted to fix a prototype pollution vulnerability by blocking malicious keys, but only checked the first segment of the property path. Attackers could simply nest their payload one level deep to bypass the check completely.

The Hook: The Illusion of Safety

JavaScript developers love dot-notation helpers. Why write obj && obj.db && obj.db.config when you can just use dottie.get(obj, 'db.config')? Libraries like dottie.js exist to make accessing and mutating nested objects painless. But as we've seen time and time again in the Node.js ecosystem, convenience often comes at the cost of security.

This isn't a story about a new, groundbreaking exploit technique. It's a story about a "zombie" vulnerability—a bug that was supposedly killed, buried, and marked as fixed, only to crawl back out of the grave because the stake wasn't driven deep enough.

We are looking at CVE-2026-27837, a bypass of the patch for CVE-2023-26132. It highlights a critical lesson in input validation: if you are going to police user input, you have to check the entire payload, not just the first five characters.

The Flaw: Whack-a-Mole logic

To understand the bypass, we have to look at the original fix. In 2023, the maintainers of dottie.js realized that allowing users to set keys like __proto__ was dangerous. It enables Prototype Pollution, where an attacker modifies the base Object.prototype, affecting every object in the Node.js process.

Their solution was logical, but short-sighted. They added a guard clause that looked like this:

// The old, vulnerable check
if (pieces[0] === '__proto__') return;

This code splits the input path (e.g., user.name) into an array (['user', 'name']) and checks the first element. If you try to pass __proto__.polluted, pieces[0] is __proto__, and the function returns. The front door is locked.

But the logic flaw here is assuming that the attack vector must be the root of the operation. dottie.js is recursive. It walks down the object tree. If an attacker provides a path like user.__proto__.isAdmin, the array becomes ['user', '__proto__', 'isAdmin'].

Here, pieces[0] is 'user'. The check passes. The library then happily traverses into user, then into __proto__ (which points to Object.prototype), and finally sets isAdmin on the global prototype. The bouncer checked the first guy in line, saw he was cool, and let the entire gang of hackers in behind him.

The Exploit: One Index to Ruin Them All

Exploiting this requires zero advanced knowledge of memory corruption or heap layouts. You just need to shift your malicious payload one index to the right.

Here is a functional Proof of Concept (PoC) demonstrating the bypass:

const dottie = require('dottie');
 
// A harmless looking object
const payload = {};
 
// The Attack: We prefix the malicious path with literally anything.
// The check `pieces[0] === '__proto__'` sees 'config' and allows it.
const maliciousPath = 'config.__proto__.polluted';
 
console.log("Before:", ({}).polluted); // undefined
 
try {
  // dottie traverses 'config' (creates it), then accesses '__proto__', 
  // then sets 'polluted' on the global Object prototype.
  dottie.set(payload, maliciousPath, "pwned");
} catch (e) {
  console.log("Blocked?");
}
 
console.log("After:", ({}).polluted); 
// Output: "pwned"
// Every object in the process now has this property.

This vulnerability affects both dottie.set() and dottie.transform(). In a real-world scenario, this usually happens when an application takes a JSON body from a request (e.g., updating user preferences) and passes it directly to dottie to update a database object.

The Impact: Why Panic?

Prototype pollution is often dismissed as a "theoretical" risk, but in JavaScript, it is a loaded gun. By polluting Object.prototype, an attacker can:

  1. Bypass Authentication: If your app checks if (user.isAdmin), and isAdmin is undefined on the user object, it looks up the prototype chain. If the attacker polluted the prototype with isAdmin: true, they are now an admin.
  2. Denial of Service (DoS): Polluting methods like toString or valueOf can cause the application to crash instantly whenever it tries to log an object or coerce a string.
  3. Remote Code Execution (RCE): This is the holy grail. If the application uses template engines (like Handlebars or EJS) or spawns child processes, polluting specific configuration flags (like shell, exec, or outputFunctionName) can trick the engine into executing arbitrary shell commands.

With a CVSS score of 6.3, it's marked "Medium," but in the right environment (like a server-side rendering app), it is critical.

The Fix: A Proper Blacklist

The fix in version 2.0.7 replaces the lazy index-0 check with a comprehensive scan of the path. The developers finally realized that any part of the path could be a weapon.

Here is the corrected code logic:

// The Fix: Check EVERY piece of the path
var DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];
 
// Array.some() returns true if any element matches the condition
if (pieces.some(function(p) { 
    return DANGEROUS_KEYS.indexOf(p) !== -1; 
})) return;

They also expanded the blacklist. Previously, they only feared __proto__. Now, they correctly block constructor and prototype as well. This prevents attacks that try to walk up the prototype chain via constructor.prototype.

Official Patches

NPMOfficial package page
GitHubPatch Commit

Fix Analysis (1)

Technical Appendix

CVSS Score
6.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:L
EPSS Probability
0.03%
Top 90% most exploited

Affected Systems

dottie.js < 2.0.7

Affected Versions Detail

Product
Affected Versions
Fixed Version
dottie.js
mickhansen
>= 2.0.4, < 2.0.72.0.7
AttributeDetail
CWE IDCWE-1321 (Prototype Pollution)
CVSS v3.16.3 (Medium)
Attack VectorNetwork (AV:N)
Exploit MaturityProof of Concept (PoC)
User InteractionNone (if automated processing)
ComplexityLow (AC:L)

MITRE ATT&CK Mapping

T1203Exploitation for Client Execution
Execution
T1211Exploitation for Defense Evasion
Defense Evasion
CWE-1321
Prototype Pollution

Known Exploits & Detection

GitHub AdvisoryAdvisory containing the bypass details and PoC

Vulnerability Timeline

Original incomplete fix (CVE-2023-26132) released in v2.0.4
2023-05-01
Bypass identified and fixed in commit 7e8fa13
2026-02-25
CVE-2026-27837 published and v2.0.7 released
2026-02-26

References & Sources

  • [1]GHSA-r5mx-6wc6-7h9w
  • [2]NVD - CVE-2026-27837
Related Vulnerabilities
CVE-2023-26132

More Reports

•26 minutes ago•CVE-2026-105749
6.5

CVE-2026-105749: Unbounded Table Attributes in Docling Backends Leads to Resource Exhaustion

An uncontrolled resource consumption vulnerability exists in the Docling document conversion library. Maliciously structured HTML, JATS, ODS, or BoxNote inputs containing table cells with excessively large 'rowspan' or 'colspan' attribute values trigger algorithmic complexity conditions. This allows unauthenticated remote attackers to initiate resource exhaustion states, crashing or hanging the target document processing pipeline while bypassing configured timeouts.

Amit Schendel
Amit Schendel
2 views•6 min read
•about 1 hour ago•CVE-2026-105748
4.3

CVE-2026-105748: Local File Inclusion and Arbitrary File Disclosure in Docling Document Parser

A Local File Inclusion (LFI) and Arbitrary File Disclosure vulnerability exists in Docling and Docling Slim versions >= 2.16.0 up to 2.131.0. When parsing serialized DoclingDocument structures using the JSON input format, the backend fails to restrict image URI schemes, allowing remote attackers to retrieve local files and verify path existence on the host system during embedded document export.

Amit Schendel
Amit Schendel
5 views•5 min read
•about 2 hours ago•CVE-2026-105744
7.5

CVE-2026-105744: Arbitrary File Read and Remote Code Execution in Docling Tectonic Engine

Docling, a tool for parsing and processing diverse document formats, is vulnerable to arbitrary file read, arbitrary file write, and potential remote code execution (RCE) in versions 2.94.0 through 2.131.0. The vulnerability occurs when applications configure Docling to use the Tectonic engine for rendering TikZ diagrams into images. Because the compilation did not restrict hazardous TeX primitives or sandbox the environment, an attacker can supply crafted documents containing malicious TikZ definitions to access or modify local files and execute arbitrary commands under the privileges of the processing application.

Amit Schendel
Amit Schendel
7 views•7 min read
•about 3 hours ago•CVE-2026-105743
4.0

CVE-2026-105743: Server-Side Request Forgery Guard Bypass in Docling Document Conversion Engine

An SSRF guard bypass vulnerability in the Docling document conversion engine allows unauthenticated attackers to bypass internal IP access controls. The vulnerability exists due to a DNS rebinding Time-of-Check Time-of-Use (TOCTOU) condition, URL authority parsing inconsistencies, and unvalidated network requests triggered during headless browser page rendering.

Amit Schendel
Amit Schendel
6 views•6 min read
•about 4 hours ago•CVE-2026-105742
3.7

CVE-2026-105742: Sensitive Custom Header Leakage in Docling Image Resource Loader

A technical analysis of CVE-2026-105742 (GHSA-p3fw-7699-7926), a sensitive information disclosure vulnerability in the Docling document processing library. Vulnerable versions of Docling indiscriminately forward custom HTTP headers, such as authentication tokens, to arbitrary third-party origins and during cross-origin redirects while fetching remote image assets from untrusted HTML and EPUB documents.

Alon Barad
Alon Barad
6 views•6 min read
•about 5 hours ago•CVE-2026-106121
4.9

CVE-2026-106121: Denial of Service via Infinite Loop in RabbitMQ Java Client JSON Parser

CVE-2026-106121 is a Denial of Service (DoS) vulnerability in the RabbitMQ Java Client library (amqp-client) affecting versions prior to 5.37.0. The vulnerability resides in the legacy, custom JSON-RPC parsing class com.rabbitmq.tools.json.JSONReader. When parsing malformed or truncated payloads ending within a quoted string or single-line comment, the parser's scanner enters an infinite loop. This occurs because the loop lacks an exit condition for the end-of-input sentinel character returned by the iterator, leading to either CPU exhaustion or a JVM crash from an OutOfMemoryError.

Amit Schendel
Amit Schendel
8 views•6 min read