
CVE-2026-21003の概念実証エクスプロイト。kidヘッダーを省略し、「none」アルゴリズムを使用することでJWT認証バイパスを実証し、ユーザーになりすまします。
// 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);
カスタム JWT 検証器は、署名アルゴリズムが存在することを適切に強制していません。トークンのヘッダーが alg パラメータを省略するか、明示的に none に設定した場合、サーバーは署名を検証せずにトークンを受け入れるため、権限昇格が可能になります。
npm install express jsonwebtoken
node jwt_verify_server.js
pip install pyjwt requests
python exploit_jwt_none.py
レスポンスは admin として認証されたことを示します。