
Preuve de concept pour CVE-2026-21003 démontrant un contournement de l'authentification JWT en omettant l'en-tête `kid` et en utilisant l'algorithme 'none' pour usurper l'identité d'utilisateurs.
// jwt_verify_server.js - Vulnerable JWT verification
const jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
app.use(express.json());
const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1SU1LfVLPHCYZM5rPY4...
-----END PUBLIC KEY-----`;
app.post('/verify', (req, res) => {
const token = req.body.token;
// Vulnerability: if no algorithm specified, defaults to HS256? Actually, jsonwebtoken can be tricked.
// We simulate a custom verifier that accepts "none" if kid is missing.
const decoded = jwt.decode(token, { complete: true });
if (!decoded.header.alg || decoded.header.alg === 'none') {
// Accept token without signature
res.json({ status: 'authenticated', user: decoded.payload.sub });
} else {
jwt.verify(token, publicKey, { algorithms: ['RS256'] }, (err, payload) => {
if (err) res.status(401).send('Invalid');
else res.json({ status: 'authenticated', user: payload.sub });
});
}
});
app.listen(3000);
Un vérificateur JWT personnalisé n'impose pas correctement la présence d'un algorithme de signature. Si l'en-tête du jeton omet le paramètre alg ou le définit explicitement sur none, le serveur accepte le jeton sans vérifier la signature, ce qui permet une élévation de privilèges.
npm install express jsonwebtoken
node jwt_verify_server.js
pip install pyjwt requests
python exploit_jwt_none.py
La réponse indique une authentification en tant qu'admin.