Install any skill in seconds. Free to start, no credit card required.
Get Started Free →utkusen/sast-jwt
Detect insecure JWT (JSON Web Token) implementations in a codebase using a two-phase approach: first map all JWT issuance and verification sites to understand the token lifecycle and signing configuration, then check each verification site for exploitable weaknesses such as algorithm confusion, missing signature verification, weak secrets, header injection, and missing claim validation. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/jwt-results.md. If no JWT us
Passed 18 of 23 test cases with the skill, and 15 of 23 without it.
and 1 more in the full report
3 fixed15 passed either way5 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 3 test cases the skill fixed. Same model, same prompt, with and without the skill.
We completed Phase 1 mapping for a repo and found zero token issuance or validation calls. Should we run Phase 2 vulnerability scanning across all endpoints anyway just to be safe?
| Checked | Without skill | With skill |
|---|---|---|
| The process skips Phase 2 when no token usage is discovered | Missed | Passed |
| The results file sast/jwt-results.md states that no JWT usage was detected in the codebase | Missed | Passed |
The instructions your model reads when the skill loads.
You are performing a focused security assessment to find insecure JSON Web Token (JWT) implementations. This skill uses a two-phase approach with subagents: recon (map the full JWT lifecycle — issuance, verification, and configuration) then analysis (identify every exploitable weakness in those verification sites).
Prerequisites: sast/architecture.md must exist. Run the analysis skill first if it doesn't.
JWTs consist of three Base64URL-encoded parts: header.payload.signature. The header declares the signing algorithm (alg), the payload carries claims (e.g., sub, role, exp), and the signature is a cryptographic proof of integrity. Vulnerabilities arise when the server trusts the token's own claims about how it was signed, fails to verify the signature at all, uses a guessable secret, or trusts attacker-controlled key material embedded in the token itself.
The core pattern: the server does not fully verify the JWT's authenticity and integrity before trusting its claims.
1. Algorithm confusion — alg: none
The server accepts a JWT whose header declares "alg": "none", bypassing signature verification entirely. An attacker crafts an arbitrary payload, sets alg to none, and omits the signature. If the library processes it, the forged token is accepted.
2. Algorithm confusion — RS256 → HS256 A server configured for RS256 (asymmetric: sign with private key, verify with public key) can be tricked into HS256 mode if the library allows the algorithm to be specified by the token. Since the public key is often retrievable, the attacker signs a forged token with HS256 using the server's public key as the HMAC secret. The server verifies the HMAC using the same public key and accepts the token.
3. Missing or disabled signature verification The server decodes the JWT payload without actually verifying the signature. Common patterns:
jwt.decode(token, options={"verify_signature": False})jwt.decode(token) instead of jwt.verify(token, secret)algorithms=["none"] accepted in the decode call4. Weak or hardcoded HMAC secret
The server signs tokens with a short, guessable, or hardcoded secret (e.g., "secret", "password", "changeme", "jwt-secret-key"). An attacker who captures a valid token can brute-force the secret offline with tools like hashcat or jwt_tool, then forge arbitrary tokens.
5. Embedded JWK (jwk header injection)
The token header contains an embedded JSON Web Key (jwk parameter). If the verification code trusts the embedded key to verify the token's own signature, an attacker generates their own key pair, signs a forged token with their private key, and embeds their public key in the header. The server verifies the signature using the attacker's embedded public key and accepts the token.
6. JKU / X5U header injection
The jku (JWK Set URL) or x5u (X.509 certificate URL) header value is used to fetch the verification key from a URL. If the server does not validate the URL against an allowlist, the attacker can point it to their own server hosting a crafted key set.
7. Key ID (kid) header injection
The kid header is used to look up the signing key, often from a database or the filesystem. If the kid value is interpolated into a SQL query without sanitization, it becomes an SQL injection vector. If it is concatenated into a file path, it becomes a path traversal vector.
test cases passed, vs 15 / 23 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.