CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Dashboard
  • 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
9.3

Trust Issues: How a JWT Header Toppled Parse Server Authentication

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 26, 2026·6 min read·6 visits

PoC Available

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.