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

Trust Issues: How a JWT Header Toppled Parse Server Authentication

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 26, 2026·6 min read·76 visits

Executive Summary (TL;DR)

Parse Server trusted the JWT header to tell it which cryptographic algorithm to use for verification. Attackers can set this to "none" or "HS256" to bypass authentication, allowing them to log in as any user (including admins) simply by knowing their email or user ID. Patch immediately to version 8.6.3 or 9.3.1-alpha.4.

A critical vulnerability in Parse Server's authentication adapters allows for complete Account Takeover (ATO) via JWT algorithm confusion. By trusting the 'alg' header in user-provided tokens, attackers can bypass signature verification using the 'none' algorithm or exploit key confusion attacks to impersonate any user on the platform without credentials.

The Hook: Don't Roll Your Own Auth (Unless You Do It Wrong)

We all know the mantra: 'Don't roll your own crypto.' It's the first commandment of security engineering. Naturally, modern backend frameworks like Parse Server try to make this easy by offering plug-and-play adapters for the big guns: Google, Apple, and Facebook authentication. The idea is simple. You let the trillion-dollar companies handle the password storage and identity verification, and they hand you a cryptographically signed JSON Web Token (JWT) proving the user is who they say they are.

But here is where the tragedy begins. While Parse Server didn't try to invent a new encryption algorithm, it failed at the most fundamental step of consuming one: trusting the client. In a move that creates a massive logical hole in the authentication flow, the server didn't decide how to verify the ID token; it asked the token how it wanted to be verified.

This is the digital equivalent of a bouncer looking at an ID card drawn in crayon on a napkin, seeing a note on the back that says 'Trust me, I'm VIP,' and waving the person through. CVE-2026-27804 isn't a buffer overflow or a complex race condition; it is a design flaw in how the Adapters/Auth module handled JWT headers, turning a secure cryptographic exchange into a 'choose your own adventure' for attackers.

The Flaw: The 'alg' Header Trap

To understand this vulnerability, you have to understand the structure of a JWT. It consists of three parts: the Header, the Payload, and the Signature. The Header typically contains metadata, like the key ID (kid) and the algorithm (alg) used to sign the token. The standard behavior for a secure backend is to look at the provider (e.g., Google), look up Google's public keys, and verify the token using the algorithm we know Google uses (usually RS256).

Parse Server, however, got too helpful. In the affected versions of the Google, Apple, and Facebook adapters, the code extracted the alg property directly from the incoming token's header and passed it straight into the jsonwebtoken library's verify function.

This is a classic 'Algorithm Confusion' vulnerability. The verify function in the Node.js jsonwebtoken library is polymorphic. If you tell it the algorithm is asymmetric (like RS256), it expects the second argument to be a Public Key. If you tell it the algorithm is symmetric (like HS256), it expects the second argument to be a shared Secret. By letting the attacker control the alg parameter, Parse Server allowed the attacker to dictate how the library interpreted the keys.

The Code: The Smoking Gun

Let's look at the crime scene. The vulnerability lived primarily in src/Adapters/Auth/google.js (and similarly in Apple/Facebook adapters). Here is the code responsible for verifying a user's identity:

// VULNERABLE CODE
const { kid: keyId, alg: algorithm } = authUtils.getHeaderFromToken(token);
 
// ... logic to fetch the public key based on keyId ...
 
try {
  jwtClaims = jwt.verify(token, googleKey, {
    algorithms: algorithm, // <--- HERE IS THE BUG
    audience: clientId,
  });
} catch (e) {
  // ...
}

Notice the algorithms: algorithm line? It takes the alg value parsed directly from the attacker's string (getHeaderFromToken) and feeds it to the security check.

The fix involves removing this trust entirely. The patch hardcodes the allowed algorithm, ensuring that even if an attacker sends a header claiming alg: none, the server ignores it and enforces RSA validation:

// PATCHED CODE
try {
  jwtClaims = jwt.verify(token, signingKey, {
    algorithms: ['RS256'], // <--- HARDCODED SECURITY
    audience: clientId,
  });
} catch (e) {
  // ...
}

The Exploit: Becoming Admin

There are two ways to exploit this, ranging from 'lazy' to 'clever'.

Method 1: The 'None' Algorithm (The Lazy Way) The JWT specification historically included an algorithm called none, intended for debugging. It means 'this token is not signed.' If the library supports it and the server permits it, you can simply strip the signature off a token, change the header to {"alg": "none"}, and the server will accept the payload as truth. While many modern libraries disable none by default, passing it explicitly in the algorithms array (via the user-controlled variable) re-enables it in some configurations.

Method 2: Key Confusion (The Clever Way) This is the far more dangerous and likely vector. The server expects to verify a Google token using RS256 (RSA). To do this, it downloads Google's Public Key.

An attacker can:

  1. Create a malicious token for admin@example.com.
  2. Set the header to {"alg": "HS256"} (HMAC-SHA256).
  3. Sign the token using Google's Public Key as the HMAC shared secret.

When the Parse Server receives this, it sees alg: HS256. It passes googleKey (the public key string) to jwt.verify. The library sees 'HS256' and thinks, 'Okay, I need to verify a symmetric signature using this string as the secret.' Since the attacker signed the token using that exact same public key string as the secret, the math checks out. The server validates the signature, and you are logged in as Admin.

The Impact: Game Over

The impact here is maximum severity (Critical). This is a full authentication bypass for any deployment using third-party OAuth adapters.

  1. Account Takeover: An attacker can log in as any user if they know the user's email or ID associated with the OAuth provider.
  2. Privilege Escalation: If an administrator uses 'Login with Google', the attacker takes over the admin account.
  3. Data Exfiltration: With valid credentials, the attacker bypasses ACLs that restrict public read access. They can dump user databases, modify records, or trigger cloud code functions restricted to authenticated users.

This requires zero interaction from the victim. It is a silent, network-based attack that leaves very few traces in standard application logs other than a successful login event from an unusual IP.

The Fix: Hardcoding Reality

The remediation is straightforward but urgent. You must upgrade parse-server to version 8.6.3 or 9.3.1-alpha.4.

The fix introduces two major changes:

  1. Hardcoded Algorithms: The verify function now strictly enforces ['RS256'] (or ['ES256'] for Apple), ignoring the header provided by the client.
  2. Better Key Management: The patch replaces custom key-fetching logic with jwks-rsa, a battle-tested library designed to handle JSON Web Key Sets securely.

If you cannot patch immediately, you must disable the Google, Apple, and Facebook authentication adapters in your Parse Server configuration. There is no other configuration-based mitigation for the vulnerable code paths.

Official Patches

Parse CommunityParse Server 8.6.3 Release Notes
Parse CommunityParse Server 9.3.1-alpha.4 Release Notes

Fix Analysis (2)

Technical Appendix

CVSS Score
9.3/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Affected Systems

Parse Server (NPM package)Applications using Parse Server with Google Auth AdapterApplications using Parse Server with Apple Auth AdapterApplications using Parse Server with Facebook Auth Adapter

Affected Versions Detail

Product
Affected Versions
Fixed Version
parse-server
Parse Community
< 8.6.38.6.3
parse-server
Parse Community
>= 9.0.0, < 9.3.1-alpha.49.3.1-alpha.4
AttributeDetail
CWECWE-327 (Broken Crypto Algorithm)
CVSS v4.09.3 (Critical)
Attack VectorNetwork (API)
Privileges RequiredNone
ImpactAccount Takeover
Exploit StatusPoC Available

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1552Unsecured Credentials
Credential Access
T1078Valid Accounts
Defense Evasion
CWE-327
Use of a Broken or Risky Cryptographic Algorithm

The product uses a broken or risky cryptographic algorithm or implementation, allowing attackers to bypass security mechanisms.

Known Exploits & Detection

GitHub Security AdvisoryAdvisory containing description of the JWT algorithm confusion attack vector.
Parse Server TestsUnit tests added in the fix demonstrate the 'alg: none' and key confusion logic.

Vulnerability Timeline

Fixes committed to Parse Server repository
2026-02-23
GHSA-4q3h-vp4r-prv2 Published
2026-02-25
CVE-2026-27804 Published
2026-02-25

References & Sources

  • [1]GHSA-4q3h-vp4r-prv2
  • [2]Understanding JWT Algorithm Confusion

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 day ago•CVE-2026-63462
7.5

CVE-2026-63462: Unauthenticated Stack Overflow Denial of Service in Unleash Server

An unauthenticated remote denial of service vulnerability exists in the Unleash feature management platform. By submitting a crafted JSON payload containing deeply nested structures to an OpenAPI-validated endpoint, an attacker can trigger uncontrolled recursion within the error formatting module. This leads to a call-stack exhaustion (RangeError: Maximum call stack size exceeded) inside the Node.js runtime, causing the service to crash immediately without recovery.

Alon Barad
Alon Barad
11 views•6 min read
•1 day ago•CVE-2026-63004
5.5

CVE-2026-63004: Server-Side Request Forgery in Unleash Addon and Integration Subsystem

CVE-2026-63004 is a server-side request forgery (SSRF) vulnerability in the Unleash feature management platform. Authenticated administrators with CREATE_ADDON or UPDATE_ADDON privileges can exploit this vulnerability to initiate requests to loopback addresses, private networks, and cloud metadata endpoints, potentially leading to information disclosure and credential extraction.

Amit Schendel
Amit Schendel
8 views•8 min read
•2 days ago•CVE-2026-63466
4.1

CVE-2026-63466: Process-Wide Security Degradation via Global Module Mutation in Unleash

Prior to version 8.0.3, Unleash's Markdown event formatter directly mutated the global template-escaping function of the shared mustache Node.js module, resulting in a process-wide security degradation where HTML/Markdown escaping was permanently disabled for the application lifetime.

Alon Barad
Alon Barad
3 views•6 min read
•2 days ago•CVE-2026-76904
9.8

CVE-2026-76904: Unauthenticated SQL Injection in GeoTools PostGIS DataStore Component

A critical SQL injection vulnerability exists in the GeoTools open-source Java library. This vulnerability is situated within the post-processing phase of OGC Filter conversion inside the PostGIS DataStore module. Specifically, the `jsonArrayContains` function does not validate or sanitize its arguments before constructing PostgreSQL SQL/JSON path evaluation queries. An unauthenticated remote attacker can exploit this weakness by submitting crafted filters via standard OGC services like WFS or WMS to execute arbitrary SQL commands on the underlying database system.

Alon Barad
Alon Barad
13 views•5 min read
•2 days ago•CVE-2026-61824
8.2

CVE-2026-61824: High-Severity Cross-Site Scripting (XSS) via Unsanitized Site Extractors in Defuddle

CVE-2026-61824 is a high-severity Cross-Site Scripting (XSS) vulnerability in kepano/defuddle before version 0.19.1. Custom site extractors for platforms such as X/Twitter, Substack, and YouTube constructed HTML representations via template string interpolation without output escaping. This allowed malicious pages to bypass standard parser sanitization routines and execute arbitrary JavaScript.

Amit Schendel
Amit Schendel
6 views•7 min read
•2 days ago•CVE-2026-63421
7.5

CVE-2026-63421: Query Limit Bypass via Negative Integer Input in KeystoneJS core resolvers

A high-severity vulnerability exists in KeystoneJS, a popular Node.js CMS and GraphQL framework, where the query resolution engine fails to validate signed negative integers within the pagination subsystem. Unauthenticated remote attackers can leverage this flaw to bypass the 'graphql.maxTake' safety boundary. By sending large negative values in the 'take' query parameter, the underlying Prisma ORM interprets the value as an instruction to fetch rows from the end of the collection, allowing malicious actors to bypass pagination limits, trigger database resource exhaustion, and execute application-level Denial of Service (DoS) attacks.

Alon Barad
Alon Barad
8 views•6 min read