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

CVE-2026-54639: Prototype Pollution and Patch Bypass in style-dictionary

Alon Barad
Alon Barad
Software Engineer

Jul 29, 2026·6 min read·70 visits

Executive Summary (TL;DR)

style-dictionary is vulnerable to prototype pollution via convertTokenData. An incomplete patch in v5.4.4 can be bypassed using constructor.prototype, allowing global runtime pollution.

A critical prototype pollution vulnerability (CVE-2026-54639) exists in style-dictionary versions 4.3.0 through 5.4.3 due to unsafe object traversal in the convertTokenData utility. Although a patch was released in version 5.4.4 targeting '__proto__', a complete bypass is possible using 'constructor.prototype', leading to persistent global prototype pollution and potential remote code execution.

Vulnerability Overview

The NPM package style-dictionary serves as a build system to translate design tokens across platforms, including Sass, iOS Swift, and Android XML. The utility function convertTokenData is exposed to allow conversion between flat arrays, objects, and maps. This utility introduces an entry point for processing structure-modifying token properties, elevating the attack surface.

During translation, a flat structure containing malicious token keys can manipulate the global prototype chain. The vulnerability belongs to the class of Improperly Controlled Modification of Object Prototype Attributes (CWE-1321). This vulnerability was introduced in version 4.3.0 and remained present in subsequent releases.

In scenarios where style-dictionary executes dynamically within web applications, CI/CD runners, or continuous deployment pipelines that process user-defined styles, the threat vector shifts from local execution to arbitrary execution. This vulnerability exposes the host runtime to remote exploit opportunities depending on downstream object evaluation practices.

Root Cause Analysis

The core flaw resides in lib/utils/convertTokenData.js within the convertToTokenObject utility. When a user instructs the engine to export token data as an object format (output: 'object'), the application processes an array of tokens and reconstructs a nested object based on the property paths in the token's key property.

The logic parses keys by stripping curly braces and splitting the remaining string with a dot (.) separator. The engine then recursively traverses a base object literal obj = {} using the split path segments. If a path segment points to an inherited property (such as __proto__ or constructor), the traversal code fails to safely isolate modifications to own-properties of the object.

// Vulnerable snippet of path resolution
if (slice[k] === undefined) {
  slice[k] = {};
}

Because __proto__ evaluates to the standard Object.prototype (and is therefore not undefined), the assignment block is skipped, and slice is updated to point directly to Object.prototype. The subsequent loop iteration then assigns values directly to the global prototype, affecting every object instance within the Node.js runtime environment.

Code Analysis and Patch Bypass

The introduction of the vulnerable utility occurred in commit 209085d9782cfc0783c4d983f3f1bb2c515954ec. The original vulnerable structure recursively assigned paths using arbitrary user input without sanitization.

// Vulnerable function in lib/utils/convertTokenData.js (v4.3.0)
function convertToTokenObject(tokenArray) {
  const obj = ({});
  tokenArray.forEach((token) => {
    const { key } = token;
    const keyArr = (key).replace('{', '').replace('}', '').split('.');
    let slice = obj;
    keyArr.forEach((k, i, arr) => {
      if (slice[k] === undefined) {
        slice[k] = {};
      }
      if (i === arr.length - 1) {
        slice[k] = token;
      }
      slice = slice[k];
    });
  });
  return obj;
}

In version 5.4.4, the library attempted to mitigate the issue via commit 23b5e8dda143441f0d6b8e2b4222e2da98058bc5 by introducing a check: if (key?.includes('__proto__')) { return; }.

This remediation relies on blacklist-based input validation, which is vulnerable to alternative property traversal paths. An attacker can completely bypass this check by supplying a key such as {constructor.prototype.polluted_property}. In this scenario, the string verification fails to trigger the exit condition, while the inner traversal evaluates slice['constructor'] (the Object constructor function) and slice['constructor']['prototype'] (the global Object.prototype), achieving identical prototype modification.

Exploitation Methodology

To exploit this vulnerability, an attacker must control or inject content into a design token structure processed by style-dictionary. This typically occurs when applications accept user-defined themes, external configuration packages, or user-submitted asset bundles.

The attack begins by crafting a payload structure where the key field points to a prototype path. The diagram below illustrates how the recursive path resolver traverses from an empty object through the constructor function to reach and modify the global Object.prototype namespace.

This sequence bypasses the __proto__ blacklist guard and injects the attacker-defined token structure directly into the global object prototype. Consequently, any plain JavaScript object subsequently initialized during the application's lifecycle will inherit the malicious properties.

Impact Assessment

A successful prototype pollution attack in a Node.js runtime has broad security implications. An attacker who is able to inject properties into the standard prototype chain can disrupt application workflow logic, cause Denial of Service (DoS) via crash conditions, or execute arbitrary code.

In Node.js applications, remote code execution (RCE) can be achieved by polluting options passed to sub-process creation functions. If the application or its dependencies spawn shell commands using APIs like child_process.spawn or child_process.fork, parameters such as shell, env, or execArgv can be polluted. This forces the underlying operating system interpreter to execute arbitrary code defined in the payload.

The CVSS v3.1 metric is rated as 8.8 (High) under local execution contexts. However, if style-dictionary functions within an automated SaaS environment or dynamically processes user uploads online, the impact shifts to an unauthenticated Remote Code Execution vulnerability.

Remediation and Secure Implementation

To secure applications using style-dictionary, relying on string-based blacklists is insufficient. The most robust remediation involves preventing keys that do not belong to the object's own properties from being recursively resolved, or using null-prototype objects.

The inner resolver must explicitly block the keys __proto__, constructor, and prototype. A structurally sound implementation of the convertToTokenObject utility would resemble the following pattern:

function secureConvertToTokenObject(tokenArray) {
  // Create a base object that does not inherit from Object.prototype
  const obj = Object.create(null);
 
  tokenArray.forEach((token) => {
    const { key } = token;
    if (typeof key !== 'string') return;
 
    const keyArr = key.replace('{', '').replace('}', '').split('.');
    let slice = obj;
 
    for (let i = 0; i < keyArr.length; i++) {
      const k = keyArr[i];
 
      // Enforce strict property checks to block traversal paths
      if (k === '__proto__' || k === 'constructor' || k === 'prototype') {
        return;
      }
 
      if (slice[k] === undefined) {
        slice[k] = {};
      }
 
      if (i === keyArr.length - 1) {
        slice[k] = token;
      }
      slice = slice[k];
    }
  });
 
  // Convert back to standard object structure safely if downstream consumption requires it
  return Object.assign({}, obj);
}

For temporary runtime mitigation where dependency updates are restricted, implement validation schemas using JSON Schema or restrict incoming token keys via matching regex patterns like /("key"\s*:\s*"{.*(?:__proto__|constructor|prototype).*}")/ before passing inputs to the builder.

Official Patches

Amazon style-dictionaryPull Request #1702 implementing the initial prototype pollution guard.

Fix Analysis (2)

Technical Appendix

CVSS Score
8.8/ 10
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
EPSS Probability
0.13%
Top 97% most exploited

Affected Systems

style-dictionary NPM package

Affected Versions Detail

Product
Affected Versions
Fixed Version
style-dictionary
Amazon
>= 4.3.0, <= 5.4.35.4.4 (Incomplete fix)
AttributeDetail
CWE IDCWE-1321
Vulnerability ClassPrototype Pollution
CVSS v3.1 Score8.8 (High)
Attack VectorLocal (escalatible to Remote)
EPSS Score0.00132 (3.12 percentile)
Patch StatusIncomplete (v5.4.4 bypass identified)
CISA KEV StatusNot listed

MITRE ATT&CK Mapping

T1059Command and Scripting Interpreter
Execution
CWE-1321
Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')

The software initializes or populates an object with user-controlled keys or paths without restricting modifications to the object prototype, allowing attackers to inject or modify properties of the global Object prototype.

Known Exploits & Detection

GitHub Advisory GHSA-vj5c-m527-mpffAdvisory documenting prototype pollution and detailing the vulnerable utility code.

References & Sources

  • [1]GHSA-vj5c-m527-mpff
  • [2]NVD - CVE-2026-54639

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

•about 11 hours ago•CVE-2026-107844
5.3

CVE-2026-107844: Path Traversal Vulnerability in Contao ImagesController

A path traversal vulnerability (CWE-22) in Contao CMS allows unauthenticated remote attackers to bypass directory boundary restrictions in ImagesController and access files within the project directory.

Amit Schendel
Amit Schendel
8 views•5 min read
•about 13 hours ago•CVE-2026-107848
3.5

CVE-2026-107848: Cross-Site Request Forgery (CSRF) in Contao Backend Actions via GET Requests

Contao Open Source CMS versions 4.0.0 through 5.3.49 and 5.4.0-RC1 through 5.7.11 contain a Cross-Site Request Forgery (CSRF) vulnerability in backend parameter handling. The `RequestTokenListener` component validates anti-CSRF tokens solely for HTTP POST requests, while GET-based declarative guards run only when an `act` parameter is present in the query string. Consequently, custom backend actions dispatched via alternative parameters such as `key=` can execute without CSRF token verification when triggered by an authenticated user.

Amit Schendel
Amit Schendel
7 views•5 min read
•about 14 hours ago•CVE-2026-107843
5.3

CVE-2026-107843: Unthrottled Activation Email Resend and Account Enumeration in Contao CMS

Contao CMS versions 4.1.0 through 5.3.49 and 5.4.0-RC1 through 5.7.11 fail to validate form submission tokens and enforce rate limiting when processing activation email resend requests via HTTP POST, enabling resource exhaustion and account state enumeration.

Amit Schendel
Amit Schendel
8 views•4 min read
•about 15 hours ago•CVE-2026-107842
5.3

CVE-2026-107842: Information Disclosure via Stale Indexing in Contao Search Module

An information disclosure vulnerability in Contao CMS allows unauthenticated site visitors to view protected page titles, URLs, and text excerpts through search queries when protected page indexing is disabled after previously being enabled.

Amit Schendel
Amit Schendel
9 views•4 min read
•about 16 hours ago•GHSA-G38J-7V97-X298
6.5

GHSA-G38J-7V97-X298: Missing Authorization Check in Vikunja CalDAV Task Relation Creation

In Vikunja prior to version 2.6.0, relation creation via the CalDAV endpoint fails to invoke the TaskRelation.CanCreate authorization check. This missing access control allows an authenticated user to establish unauthorized relationships and perform write operations against any task, provided its unique identifier (UID) is known.

Alon Barad
Alon Barad
12 views•5 min read
•about 17 hours ago•GHSA-3HC7-R24J-RPWC
6.8

GHSA-3hc7-r24j-rpwc: Cross-Project Task Disclosure via Subtask Expansion in Vikunja

A cross-project information disclosure vulnerability in Vikunja allows authenticated users with read access to one project to view private task details from unauthorized projects via subtask expansion parameters.

Alon Barad
Alon Barad
9 views•5 min read