
PoC per CVE-2025-65945 (Verifica impropria della firma crittografica in node-jws)
Questa è una proof of concept per un bypass della verifica della firma nella libreria node-jws. Il bug consente agli attacker di forgiare JWT validi quando il server deriva i segreti HMAC da dati controllati dall'utente.
La funzione jws.createVerify() non verifica che sia stato effettivamente fornito un segreto quando vengono utilizzati algoritmi HMAC. Se la tua app cerca i segreti in base a qualcosa contenuto nel JWT (come l'header kid) e la ricerca fallisce, potresti finire per verificare contro un segreto vuoto.
Un attacker può sfruttare questo bug:
undefined, che viene convertito in stringa vuotaL'attacker può ora impersonare chiunque o concedersi privilegi da amministratore.
Esegui l'aggiornamento a 3.2.3+ o 4.0.1+ per risolvere il problema.
Assicurati di avere Bun installato, poi:
# Installa la versione vulnerabile
bun install [email protected]
# Esegui l'exploit
bun run exploit.js
Dovresti vedere un output che mostra un token admin contraffatto accettato come valido.
La PoC simula un server che:
kid (key ID) del JWTcreateVerify() con l'API streamingL'attacker crea un JWT con kid: "non-existent-key" e lo firma con un segreto vuoto. Quando il server tenta di cercare questa chiave, ottiene undefined, scrive una stringa vuota nello stream di verifica e il token contraffatto supera la validazione.
# Aggiorna alla versione patchata
bun install [email protected]
# Esegui di nuovo - ora dovrebbe fallire
bun run exploit.js
Con la versione patchata vedrai un errore: secret must be a string or buffer or a KeyObject. La correzione valida che le operazioni HMAC abbiano un segreto appropriato prima di procedere.
Se il tuo codice assomiglia a questo, potresti essere affetto:
const decoded = jws.decode(token);
const secret = lookupSecret(decoded.header.kid); // might return undefined!
const verifier = jws.createVerify({
algorithm: "HS256",
signature: token,
});
verifier.secret.write(secret); // oops
verifier.secret.end();