Token导航 LogoToken导航TokenDH.com
研究检索敏感数据github未标认证来源可访问许可证需确认审计通过

jwt-misuse-anti-patternJWT misuse anti pattern 搜索

Agent Skill

用于辅助安全审计、权限检查、凭据风险、认证流程和常见漏洞排查。它适合让 Agent 梳理敏感配置、检查依赖风险、分析鉴权逻辑或生成安全复核清单。使用时不能把工具输出直接当最终结论,涉及密钥、令牌、用户数据或生产系统时,应先确认最小权限、脱敏方式和操作边界。

总安装

194

周安装

8

GitHub Stars

4

下载量

63
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:jwt-misuse-anti-pattern(JWT misuse anti pattern 搜索)
来源仓库:https://github.com/igbuend/grimbard
仓库路径:skills/jwt-misuse-anti-pattern
安装命令:
npx skills add https://github.com/igbuend/grimbard --skill jwt-misuse-anti-pattern
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/igbuend/grimbard --skill jwt-misuse-anti-pattern

简介

用于识别JWT常见滥用模式与安全防护反例,辅助代码审计。

  • 适合在Codex、Claude等平台中排查认证逻辑漏洞与密钥风险。
  • 提供错误示例与修复方案,涵盖算法混淆与弱秘密等问题。
  • 不能将工具输出视为最终结论,需结合实际环境二次验证。
  • jwt-misuse-anti-pattern 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

JWT Misuse Anti-Pattern

Severity: High

Summary

JSON Web Tokens (JWTs) are frequently misused in AI-generated code, creating critical vulnerabilities. Common flaws include accepting the "none" algorithm, weak secrets, sensitive data in payloads, and missing expiration. These enable authentication bypass, token forgery, and sensitive data exposure.

The Anti-Patterns and Solutions

1. Algorithm Confusion ("none" Algorithm Attack)

Critical vulnerability where library accepts any algorithm in token header. Attacker changes algorithm to "none" and removes signature, bypassing all cryptographic validation.

BAD Code Example

# VULNERABLE: Accepts whatever algorithm is in the header
import jwt

def verify_jwt_vulnerable(token, secret_key):
    # If the token's header is {"alg": "none"}, the library may bypass signature verification entirely.
    try:
        decoded = jwt.decode(token, secret_key, algorithms=None) # algorithms=None or not specified
        return decoded
    except jwt.PyJWTError as e:
        print(f"JWT verification failed: {e}")
        return None

GOOD Code Example

# SECURE: Explicitly specify allowed algorithms
import jwt

def verify_jwt_secure(token, secret_key):
    # CRITICAL: Always specify exact algorithm(s) expected
    # Library rejects tokens not using specified algorithms
    try:
        decoded = jwt.decode(token, secret_key, algorithms=["HS256", "RS256"])
        return decoded
    except jwt.PyJWTError as e:
        print(f"JWT verification failed: {e}")
        return None

2. Weak Secret

Weak, predictable, or hardcoded secrets for symmetric signing algorithms (HS256) enable attackers to brute-force secrets and forge valid tokens.

BAD Code Example

# VULNERABLE: Weak or short secret key
import jwt

JWT_SECRET = "secret123"  # Easily brute-forced!

def create_jwt(user_id):
    payload = {"user_id": user_id}
    return jwt.encode(payload, JWT_SECRET, algorithm="HS256")

GOOD Code Example

# SECURE: Strong, centrally managed secret
import jwt
import os

# Load strong, randomly generated secret from environment or secret manager
JWT_SECRET = os.environ.get("JWT_SECRET")

def initialize():
    if not JWT_SECRET or len(JWT_SECRET) < 32:
        raise ValueError("JWT_SECRET must be at least 256 bits (32 chars) for HS256")

# For production, use asymmetric keys (RS256): private key kept secret,
# public key safely distributed for verification
def create_jwt_asymmetric(user_id, private_key):
    payload = {"sub": user_id}
    return jwt.encode(payload, private_key, algorithm="RS256")

3. Sensitive Data in Payload

JWT payload is Base64Url-encoded, not encrypted. Anyone intercepting the token can decode and read it. Storing PII, passwords, or internal data in payload creates major security risk.

BAD Code Example

# VULNERABLE: Sensitive data in JWT payload
import jwt

def create_jwt_with_pii(user, secret_key):
    payload = {
        "user_id": user.id,
        "email": user.email,
        "ssn": user.social_security_number,  # PII EXPOSED!
        "password_hash": user.password_hash # CRITICAL RISK!
    }
    return jwt.encode(payload, secret_key, algorithm="HS256")

GOOD Code Example

# SECURE: Minimal, non-sensitive claims
import jwt
import time

def create_jwt_secure(user, secret_key):
    payload = {
        "sub": user.id,          # Subject (user ID) - standard, non-sensitive
        "iat": int(time.time()), # Issued at - standard
        "exp": int(time.time()) + 3600, # Expiration (1 hour) - standard
        "role": user.role        # Non-sensitive custom claim
    }
    # Never include passwords, PII, payment info, or internal data
    # Server fetches data from secure database using user ID from token
    return jwt.encode(payload, secret_key, algorithm="HS256")

Language-Specific Examples

JavaScript/Node.js:

// VULNERABLE: Multiple JWT misuse patterns
const jwt = require('jsonwebtoken');

// Weak secret
const SECRET = 'mysecret';

// No algorithm specified - accepts "none"!
function verifyToken(token) {
    return jwt.verify(token, SECRET); // CRITICAL FLAW
}

// Sensitive data in payload, no expiration
function createToken(user) {
    return jwt.sign({
        id: user.id,
        email: user.email,
        password: user.passwordHash, // EXPOSED!
        ssn: user.ssn // EXPOSED!
        // No exp claim!
    }, SECRET);
}
// SECURE: Proper JWT implementation
const jwt = require('jsonwebtoken');

const SECRET = process.env.JWT_SECRET; // Strong, env-based secret
if (!SECRET || SECRET.length < 32) {
    throw new Error('JWT_SECRET must be at least 256 bits');
}

function verifyToken(token) {
    // CRITICAL: Explicitly specify allowed algorithms
    return jwt.verify(token, SECRET, {
        algorithms: ['HS256'],
        maxAge: '1h' // Also enforce expiration
    });
}

function createToken(user) {
    const now = Math.floor(Date.now() / 1000);
    return jwt.sign({
        sub: user.id,          // Standard claim
        iat: now,              // Issued at
        exp: now + 3600,       // Expires in 1 hour
        role: user.role        // Non-sensitive only
    }, SECRET, {
        algorithm: 'HS256'
    });
}

Java:

// VULNERABLE: Weak secret and no algorithm enforcement
import io.jsonwebtoken.*;

public class JwtService {
    private static final String SECRET = "secret123"; // Weak!

    public Claims verifyToken(String token) {
        // No algorithm specified - vulnerable to none attack
        return Jwts.parser()
            .setSigningKey(SECRET)
            .parseClaimsJws(token)
            .getBody();
    }

    public String createToken(User user) {
        // No expiration, sensitive data included
        return Jwts.builder()
            .setSubject(user.getId())
            .claim("email", user.getEmail())
            .claim("ssn", user.getSsn()) // EXPOSED!
            .signWith(SignatureAlgorithm.HS256, SECRET)
            .compact();
    }
}
// SECURE: Proper JWT implementation
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;

public class SecureJwtService {
    // Load from environment or secret manager
    private static final String SECRET_KEY = System.getenv("JWT_SECRET");
    private static final Key KEY = Keys.hmacShaKeyFor(SECRET_KEY.getBytes());

    public Claims verifyToken(String token) {
        // Explicitly require HS256 algorithm
        return Jwts.parserBuilder()
            .setSigningKey(KEY)
            .requireAlgorithm("HS256")
            .build()
            .parseClaimsJws(token)
            .getBody();
    }

    public String createToken(User user) {
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        Date expiry = new Date(nowMillis + 3600000); // 1 hour

        return Jwts.builder()
            .setSubject(user.getId())
            .setIssuedAt(now)
            .setExpiration(expiry) // REQUIRED
            .claim("role", user.getRole()) // Non-sensitive only
            .signWith(KEY, SignatureAlgorithm.HS256)
            .compact();
    }
}

Detection

  • Find algorithm confusion vulnerabilities: Grep for unsafe jwt.decode calls:

- rg 'jwt\.decode.*algorithms\s*=\s*(None|null|\[\])' - rg 'jwt\.decode' | rg -v 'algorithms=' (missing explicit algorithm) - rg 'verify.*false|verify:\s*false' --type js (disabled verification)

  • Identify weak secrets: Search for hardcoded JWT keys:

- rg 'JWT_SECRET.*=.*["\'][^"\']{1,16}["\']' (short secrets < 32 chars) - rg 'secret.*password|password.*jwt' -i - Use gitleaks/trufflehog to scan for leaked secrets

  • Find sensitive data in payloads: Audit JWT creation:

- rg 'jwt\.encode|jwt\.sign' -A 5 - Check for PII: ssn, password, credit_card, email, phone

  • Detect missing expiration: Find tokens without exp claim:

- rg 'jwt\.encode' -A 5 | rg -v 'exp|expir' - Verify all tokens include expiration timestamps

Prevention

  • Always specify allowed algorithms: Explicitly declare during token verification
  • Use strong secrets: At least 256 bits for HS256. Prefer asymmetric algorithms (RS256/ES256) for production
  • Never store sensitive data: JWT payload readable by anyone
  • Always include exp claim: Reasonably short lifetime for access tokens
  • Implement token refresh: For sessions longer than access token lifetime
  • Consider token revocation list: Invalidate tokens for compromised accounts

Related Security Patterns & Anti-Patterns

References

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

37.7%
按下载量换算24

Claude

27.92%
按下载量换算18

Cursor

19.75%
按下载量换算12

Gemini CLI

9.44%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills