Feb 26, 2026·6 min read·6 visits
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.
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.
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.
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) {
// ...
}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:
admin@example.com.{"alg": "HS256"} (HMAC-SHA256).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 here is maximum severity (Critical). This is a full authentication bypass for any deployment using third-party OAuth adapters.
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 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:
verify function now strictly enforces ['RS256'] (or ['ES256'] for Apple), ignoring the header provided by the client.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.
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| Product | Affected Versions | Fixed Version |
|---|---|---|
parse-server Parse Community | < 8.6.3 | 8.6.3 |
parse-server Parse Community | >= 9.0.0, < 9.3.1-alpha.4 | 9.3.1-alpha.4 |
| Attribute | Detail |
|---|---|
| CWE | CWE-327 (Broken Crypto Algorithm) |
| CVSS v4.0 | 9.3 (Critical) |
| Attack Vector | Network (API) |
| Privileges Required | None |
| Impact | Account Takeover |
| Exploit Status | PoC Available |
The product uses a broken or risky cryptographic algorithm or implementation, allowing attackers to bypass security mechanisms.