Mar 6, 2026·5 min read·25 visits
The `readOnlyMasterKey` in Parse Server, designed for read-only access, can be used to upload or delete files via the Files API due to missing authorization checks. Patched in versions 8.6.5 and 9.5.0-alpha.3.
A high-severity authorization bypass exists in Parse Server's Files API, enabling holders of the `readOnlyMasterKey` to perform unauthorized write operations. While this key is architecturally intended to restrict access to read-only database queries, a logic flaw in the `FilesRouter` component permits it to bypass checks for file creation and deletion. This allows restricted administrators or compromised services possessing the read-only key to upload arbitrary files or delete existing assets, violating the integrity and availability of the application's file storage.
Parse Server acts as a backend-as-a-service, offering database, file storage, and authentication APIs. To facilitate administrative tasks without granting full control, Parse Server implements a readOnlyMasterKey. Ideally, this credential functions similarly to the primary masterKey—bypassing Access Control Lists (ACLs) and Class-Level Permissions (CLPs)—but is strictly scoped to read operations (GET or find).
The vulnerability, identified as CVE-2026-30228, resides in the specific implementation of the Files API. While the core database triggers correctly enforce the read-only restriction, the file management endpoints (/files/:filename) failed to validate this constraint. Consequently, a request authenticated with the readOnlyMasterKey is treated with the same privileges as the full masterKey during file operations.
This flaw represents a classic Incorrect Authorization (CWE-863) issue. It breaks the security model of the least privilege principle, as credentials explicitly issued for auditing, analytics, or monitoring can be weaponized to modify application content.
The root cause lies in the request handling logic within src/Routers/FilesRouter.js. In Parse Server, authentication middleware processes headers (such as X-Parse-Master-Key) and populates the req.auth object. When the readOnlyMasterKey is provided, the middleware sets req.auth.isReadOnly = true alongside req.auth.isMaster = true.
The FilesRouter defines handlers for creating (createHandler) and deleting (deleteHandler) files. These handlers verify if the user has permission to write files. The logic correctly checks for req.auth.isMaster to allow administrative overrides. However, in the affected versions, the handlers omitted a subsequent check for req.auth.isReadOnly.
Because isMaster is true for both the full master key and the read-only master key, the router authorized the write operations. The handlers processed the file upload or deletion immediately after confirming master privileges, disregarding the isReadOnly flag that should have acted as a guardrail.
The remediation involved inserting an explicit guard clause at the beginning of the write operations in FilesRouter.js. The patch ensures that even if a request possesses master privileges, it is rejected if those privileges are flagged as read-only.
Below is the analysis of the fix applied in version 8.6.5 (Commit 07bddc0).
// src/Routers/FilesRouter.js
// [FIXED] createHandler now explicitly rejects read-only keys
async createHandler(req, res, next) {
+ if (req.auth.isReadOnly) {
+ const error = createSanitizedHttpError(403, "read-only masterKey isn't allowed to create a file.", req.config);
+ res.status(error.status);
+ res.end(`{"error":"${error.message}"}`);
+ return;
+ }
const config = req.config;
const fileData = req.body;
// ... file creation logic proceeds only if not read-only
}
// [FIXED] deleteHandler applies the same restriction
async deleteHandler(req, res, next) {
+ if (req.auth.isReadOnly) {
+ const error = createSanitizedHttpError(403, "read-only masterKey isn't allowed to delete a file.", req.config);
+ res.status(error.status);
+ res.end(`{"error":"${error.message}"}`);
+ return;
+ }
try {
// ... file deletion logic
}The patch introduces a conditional check if (req.auth.isReadOnly) that returns a 403 Forbidden error, effectively closing the bypass path.
Exploitation of this vulnerability requires possession of the readOnlyMasterKey. This key is often distributed to semi-trusted internal services, dashboard viewers, or analytics platforms, under the assumption that it cannot modify data. An attacker with access to this key can interact with the Files API to perform unauthorized actions.
Attack Scenario: File Deletion To delete a critical asset (e.g., a logo or configuration file), the attacker sends a DELETE request authenticated with the read-only key.
DELETE /files/critical-asset.png HTTP/1.1
Host: api.target-app.com
X-Parse-Application-Id: <APP_ID>
X-Parse-Master-Key: <READ_ONLY_MASTER_KEY>Attack Scenario: Malicious File Upload
An attacker can upload arbitrary files, potentially hosting malware or phishing pages on the application's domain. The server accepts the upload because the readOnlyMasterKey satisfies the isMaster check.
POST /files/malware.html HTTP/1.1
Host: api.target-app.com
X-Parse-Application-Id: <APP_ID>
X-Parse-Master-Key: <READ_ONLY_MASTER_KEY>
Content-Type: text/html
<script>/* malicious payload */</script>Prior to the patch, the server would process these requests successfully, returning a 201 Created or 200 OK status.
The impact of CVE-2026-30228 spans integrity and availability, with the severity dependent on how widely the readOnlyMasterKey is distributed.
Integrity Impact (High): Attackers can upload content to the application's file storage. This could be used to host phishing sites on a trusted domain, distribute malware, or deface the application by overwriting existing assets (if the storage adapter supports overwrites).
Availability Impact (High): The vulnerability allows for the deletion of any file accessible via the API. Attackers could systematically delete user avatars, document attachments, or critical application assets, causing denial of service or permanent data loss.
Confidentiality Impact (None): The vulnerability does not grant additional read access beyond what the readOnlyMasterKey already permits.
The CVSS v4.0 score of 6.9 reflects the requirement for high privileges (PR:H), as the attacker must possess a valid master key variant. However, the attack complexity is low (AC:L), and no user interaction is required.
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
parse-server Parse Community | < 8.6.5 | 8.6.5 |
parse-server Parse Community | >= 9.0.0, < 9.5.0-alpha.3 | 9.5.0-alpha.3 |
| Attribute | Detail |
|---|---|
| CVE ID | CVE-2026-30228 |
| CVSS v4.0 | 6.9 (Medium) |
| CWE | CWE-863 (Incorrect Authorization) |
| Attack Vector | Network |
| Privileges Required | High (readOnlyMasterKey) |
| Exploit Status | PoC Available |
An uncontrolled resource consumption vulnerability exists in the Scala-based http4s-blaze-server package of the http4s/blaze library. The vulnerability allows remote, unauthenticated attackers to cause an Out of Memory Error (OOM) and JVM crash by streaming a continuous sequence of small or empty WebSocket continuation frames with the FIN bit set to 0. This bypasses typical payload size checks because of the JVM's per-object allocation overhead, leading to rapid heap exhaustion with minimal network bandwidth.
A critical path traversal vulnerability has been identified in the OpenList Go-based backend package. The vulnerability exists within the batch rename handler because the application does not validate the source filename parameter before constructing filesystems paths. This omission allows authenticated users to escape their designated directory and rename files in sibling paths.
OpenList version 4.2.3 and prior is vulnerable to an authorization bypass and metadata leakage. When configured with the Bleve search engine backend, OpenList fails to perform separator-aware path matching when validating tenant containment. This allows authenticated users to access sibling directories sharing similar name prefixes. Furthermore, the search backend returns unfiltered global result counts, leaking existence verification data of unauthorized files via side-channel analysis.
An authorization bypass vulnerability in OpenList version 4.2.3 and below allows authenticated users to read arbitrary files outside of their designated base directories due to an insecure path prefix check using Go's standard strings.HasPrefix function.
A security policy bypass vulnerability exists in the AWS API MCP Server (awslabs-aws-api-mcp-server) from version 0.2.13 through 1.3.46. When the server fails to load the read-only operations index during startup (due to transient network failures, file permission issues, or other exceptions), it logs a warning but continues running in an insecure, degraded state. Under this condition, the security policy engine fails open, silently skipping all subsequent security checks and consent prompts for the lifetime of the process. This permits unauthorized mutating AWS CLI commands to execute via indirect prompt injection attacks.
An incomplete escaping vulnerability in the npm package 'shescape' allows unauthenticated users to trigger dynamic shell expansions, absolute path disclosure, and command block break-outs on Unix and Windows systems.