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

Key Swap: How Parse Dashboard Handed Admin Keys to Guests via Cache Collision

Alon Barad
Alon Barad
Software Engineer

Feb 25, 2026·6 min read·36 visits

Executive Summary (TL;DR)

If you use dynamic master keys (functions) in Parse Dashboard, your cache is confused. If an admin logs in, the 'God Mode' key is cached. If a read-only user logs in immediately after, they get served that same God Mode key from the cache. Patch to 9.0.0-alpha.8 immediately.

A critical race condition and cache collision vulnerability exists in Parse Dashboard versions 7.3.0-alpha.42 through 9.0.0-alpha.7. The flaw lies within the configuration caching mechanism for dynamic master keys. When an application configures its `masterKey` as a function (for rotation or retrieval purposes), the dashboard caches the result. However, the cache key failed to differentiate between a full administrative session and a read-only session. This allows a read-only user to inherit the cached full master key if an administrator has recently accessed the dashboard, leading to immediate privilege escalation and potential data destruction.

The Hook: Who Guards the Guards?

Parse Server is the spiritual successor to the mobile backend-as-a-service throne, and Parse Dashboard is its cockpit. It allows developers to manage users, view analytics, and manipulate database entries with a nice GUI. To do this, the dashboard needs the Master Key—a cryptographic string that bypasses all Access Control Lists (ACLs) and Class Level Permissions (CLPs). It is the "sudo" of the Parse ecosystem.

Usually, this key is a static string in a config file. But enterprise environments are complex; they need key rotation, dynamic retrieval from vaults, or environment-specific logic. So, Parse Dashboard allows the masterKey to be defined as a function rather than a string. This function runs, fetches the key, and returns it.

Here is the problem: Running a function every single time a request hits the dashboard is expensive. Latency kills the user experience. So, naturally, the developers decided to cache the result. And therein lies the tragedy. They cached the result of the permission check, but they forgot to include the context of who asked for it.

The Flaw: A Tale of One Cache Key

The vulnerability is a classic case of CWE-1289: Improper Validation of Unsafe Equivalence. In computer science, naming things is one of the two hardest problems (alongside cache invalidation and off-by-one errors). In this case, the developers failed at both naming and cache validation.

When the dashboard initializes a session for a specific App ID, it checks if the masterKey is a function. If it is, it calls ConfigKeyCache.get. The fatal flaw was hardcoding the identifier for this cache entry to the string literal 'masterKey'.

This means the cache looked like this: "my-app-id" + "masterKey" = "ACTUAL_SECRET_KEY"

The code did not care if the person requesting the key was the CTO with full write access or an intern with a read-only account. It simply asked: "Do I have a cached value for 'masterKey'? Yes? Here you go."

If an Admin logs in, the masterKey function resolves to the Full Access Key, and it gets cached. If a Read-Only user logs in five seconds later, the system sees the valid cache entry and hands them the Full Access Key. Suddenly, the intern is the CTO.

The Code: The Smoking Gun

Let's look at the diff. It’s painful in its simplicity. The vulnerable code blindly trusted that if a key was cached, it was the right key for the current user.

Vulnerable Code (Before):

// Inside app.js logic
if (typeof app.masterKey === 'function') {
  // The second argument 'masterKey' is the cache identifier
  app.masterKey = await ConfigKeyCache.get(
    app.appId, 
    'masterKey', // <--- THE BUG. Static string.
    app.masterKeyTtl, 
    app.masterKey
  );
}

When the patch landed in 9.0.0-alpha.8, the fix was to split the cache universe into two parallel dimensions: one for the gods (admins) and one for the mortals (read-only users).

Fixed Code (After):

// The fix introduces context awareness
const cacheKey = matchingAccess.readOnly ? 'readOnlyMasterKey' : 'masterKey';
 
if (typeof app.masterKey === 'function') {
  app.masterKey = await ConfigKeyCache.get(
    app.appId, 
    cacheKey, // <--- Dynamic string based on privilege
    app.masterKeyTtl, 
    app.masterKey
  );
}

By simply checking matchingAccess.readOnly and changing the cache key string, the collision is impossible. The Admin gets a value from the masterKey slot, and the Read-Only user gets a value from the readOnlyMasterKey slot.

The Exploit: Waiting for the Admin

This is a Passive-Aggressive Exploit. You don't hammer the server with buffer overflows; you just wait. The attack vector requires a Read-Only account, which is common in larger organizations (e.g., support staff, auditors, or junior devs).

Here is the attack chain:

  1. Reconnaissance: The attacker identifies that the target Parse Dashboard is likely using dynamic key configuration (often hinted at by custom login flows or specific enterprise deployment signatures).
  2. The Trap: The attacker scripts a loop that attempts to access a protected endpoint, or simply reloads the dashboard, immediately after business hours begin (9:00 AM).
  3. The Trigger: A legitimate Administrator logs in to check analytics. The server runs the masterKey function, resolves the Full Key, and caches it under appId:masterKey for the duration of the TTL (Time-To-Live).
  4. The Snatch: Milliseconds later, the attacker's script sends a request. The server checks the cache. "Oh, I have the key right here!" It loads the Full Key into the attacker's session context.
  5. The Payload: The attacker now has a session initialized with the Master Key. They can target the /apps/:appId/agent endpoint or use the dashboard's API to delete classes, drop database tables, or exfiltrate the entire _User table.

The Impact: Why Panic?

This isn't just an information leak; it is a total compromise of the application's integrity. In the Parse ecosystem, the Master Key is absolute. It ignores all security rules.

  • Data Exfiltration: An attacker can dump the entire database, including sensitive user PII, hashed passwords, and proprietary business data.
  • Data Destruction: The attacker can send a DELETE request to the _Schema endpoint, wiping out entire collections.
  • RCE Potential: If the Parse Server has Cloud Code enabled (which is standard), the attacker might be able to modify triggers or jobs if the dashboard exposes those controls, potentially leading to Remote Code Execution on the server logic.
  • AI Agent Abuse: The CVE specifically highlights the AI Agent endpoint. An attacker could instruct the AI to "Delete all users who haven't logged in today," and the AI, holding the cached Master Key, would dutifully obey.

The Fix: Split the Cache

The remediation is straightforward but urgent. You must upgrade to parse-community/parse-dashboard@9.0.0-alpha.8 or later.

If you are stuck on an older version and cannot upgrade (perhaps due to breaking changes in the alpha branch), you have two mitigation options:

  1. Stop using Functions: Change your masterKey configuration in parse-dashboard-config.json to a static string. If it's a string, the caching logic is bypassed entirely.
  2. Disable the Agent: If the AI Agent is the primary worry, remove the agent object from your configuration. However, this does not fix the underlying privilege escalation, it just removes one convenient gun from the attacker's hand.

The official patch not only fixes the cache key name but also hardcodes permissions for read-only users in the Agent endpoint to prevent them from authorizing write actions, adding a defense-in-depth layer.

Official Patches

Parse CommunityOfficial Release 9.0.0-alpha.8

Fix Analysis (1)

Technical Appendix

CVSS Score
7.0/ 10
CVSS:4.0/AV:N/AC:H/AT:P/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:H/SA:N
EPSS Probability
0.08%
Top 77% most exploited

Affected Systems

Parse Dashboard 7.3.0-alpha.42 through 9.0.0-alpha.7

Affected Versions Detail

Product
Affected Versions
Fixed Version
parse-dashboard
parse-community
>= 7.3.0-alpha.42 < 9.0.0-alpha.89.0.0-alpha.8
AttributeDetail
CWE IDCWE-1289 (Improper Validation of Unsafe Equivalence)
CVSS v4.07.0 (High)
Attack VectorNetwork (Remote)
Attack ComplexityHigh (Requires timing/race condition)
Privileges RequiredLow (Read-only account)
Exploit MaturityPoC / Functional

MITRE ATT&CK Mapping

T1550.002Use Alternate Authentication Material: Pass the Hash
Defense Evasion
T1068Exploitation for Privilege Escalation
Privilege Escalation
T1557Adversary-in-the-Middle
Credential Access
CWE-1289
Improper Validation of Unsafe Equivalence

The software compares two items to determine if they are equivalent, but the comparison is performed in a way that allows unsafe items to be treated as equivalent to safe items.

Known Exploits & Detection

GitHubIntegration tests demonstrating the vulnerability logic and fix.

Vulnerability Timeline

Fix committed to GitHub
2026-02-19
GHSA Advisory Published
2026-02-25
Patch v9.0.0-alpha.8 Released
2026-02-25

References & Sources

  • [1]GitHub Advisory GHSA-jhp4-jvq3-w5xr
  • [2]NVD Entry for CVE-2026-27610

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

•19 minutes ago•GHSA-M557-WRGG-6RP4
5.8

GHSA-m557-wrgg-6rp4: Server-Side Request Forgery via Authority Information Access (AIA) Chasing in phpseclib

The PHP Secure Communications Library (phpseclib) contains a Server-Side Request Forgery (SSRF) vulnerability due to an insecure default implementation of Authority Information Access (AIA) certificate chasing. This flaw allows remote, unauthenticated attackers to coerce applications validating user-supplied X.509 certificates into generating arbitrary outbound HTTP requests to internal networks or local interfaces.

Amit Schendel
Amit Schendel
0 views•6 min read
•about 1 hour ago•CVE-2026-45491
6.2

CVE-2026-45491: Directory Traversal via Improper Link Resolution in .NET System.Formats.Tar

A directory traversal vulnerability exists in the Microsoft .NET System.Formats.Tar library during archive extraction. When extracting a TAR archive using the TarFile.ExtractToDirectory API, the extraction engine improperly resolves symbolic links prior to file creation, allowing local unauthorized attackers to write or overwrite arbitrary files outside the target directory. This can lead to local tampering, privilege escalation, or arbitrary code execution.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 1 hour ago•GHSA-GJ48-438W-JH9V
6.1

GHSA-GJ48-438W-JH9V: Client-Side HTML Sanitization Bypass in Bleach

A client-side HTML sanitization bypass vulnerability exists in the Bleach library where the formaction attribute is not recognized as a URI. This allows attackers to inject javascript: URIs when formaction is on the allowed list, resulting in Cross-Site Scripting (XSS).

Alon Barad
Alon Barad
4 views•6 min read
•about 2 hours ago•CVE-2026-53722
5.4

CVE-2026-53722: Reflected DOM-based Cross-Site Scripting (XSS) in Nuxt <NuxtLink>

A reflected DOM-based Cross-Site Scripting (XSS) vulnerability was identified in Nuxt's core <NuxtLink> component. Prior to the patched versions, the component failed to validate or sanitize the target URI schemes before directly rendering them into the 'href' attribute of native HTML anchor elements. An attacker who controls the input bound to the 'to' or 'href' properties can inject executable URI schemes, such as 'javascript:' or 'data:', leading to arbitrary script execution in the context of the user's browser session.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 15 hours ago•GHSA-PW6J-QG29-8W7F
5.9

GHSA-pw6j-qg29-8w7f: State Persistence and Sensitive Credential Leakage in Tornado CurlAsyncHTTPClient

A state persistence vulnerability exists in Tornado's CurlAsyncHTTPClient component where pooled pycurl.Curl handles are reused across asynchronous requests without a complete state reset. Consequently, sensitive per-request configurations, such as client TLS certificates or proxy basic authentication credentials, persist on the shared handle. This behavior leads to subsequent requests leaking these credentials to unauthorized remote servers.

Amit Schendel
Amit Schendel
7 views•7 min read
•about 15 hours ago•CVE-2026-48748
7.5

CVE-2026-48748: Netty HTTP/3 QPACK Blocked Streams Memory Exhaustion

CVE-2026-48748 is a denial-of-service vulnerability in Netty's HTTP/3 codec (netty-codec-http3) occurring when QPACK dynamic tables are enabled but the blocked streams limit is not explicitly configured. A bug in limit checking and a memory leak in stream tracking allow unauthenticated remote attackers to exhaust the JVM heap memory and crash the server.

Amit Schendel
Amit Schendel
8 views•6 min read