mohelobeid/jwt-auditor
GitHub: mohelobeid/jwt-auditor
一款离线 JWT 安全审计命令行工具,用于解码并检测 Token 中常见的算法降级、弱密钥、混淆攻击及敏感信息泄露等安全问题。
Stars: 0 | Forks: 0
# jwt-auditor
一款命令行工具,用于解码 JSON Web Token 并对其进行审计,查找那些在真实系统中反复出现的错误:`alg: none` 降级攻击、弱 HMAC 密钥、RS256 到 HS256 的混淆攻击、永不过期的 token,以及被塞进 payload 中的密钥。
所有操作均针对 token 字符串在离线状态下运行。没有网络调用,也不依赖 PyJWT。签名相关代码仅使用标准库中的原生 `hmac`,因为了解“验证”实际上仅仅是“重新计算 HMAC 并进行比较”,是理解为何这类攻击中有一半能够奏效的最快途径。
```
$ jwt-auditor audit eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiJ9.abc...
╭─── JWT Audit Summary ────╮
│ algorithm : HS256 │
│ risk score : 10.0 / 10 │
│ worst finding: critical │
╰──────────────────────────╯
CRITICAL HMAC secret recovered from wordlist secret = 'secret'
HIGH Payload may contain sensitive data ['user_password']
MEDIUM No expiration claim payload has no 'exp'
```
## 为什么它很有用
JWT 无处不在:session token、API 密钥、OAuth access token、服务间身份验证。它们也很容易出错,而且这些错误往往是隐蔽的。一个使用密钥 `secret` 签名的 token 与一个使用 256 位随机密钥签名的 token 看起来毫无二致,直到有人拿字典对它进行破解。
这个工具以攻击者的视角来检查 token,然后告诉你防御者应该修复什么。将你从应用、预发布环境、或你已授权测试的漏洞赏金目标中获取的 token 提供给它,它就能一次性标出所有问题。
## 功能
- **解码** 任何 JWT,还原其 header、payload 和 signature,且不会盲目信任它
- **`alg: none` 检测**,经典的签名剥离降级攻击
- **弱密钥破解**,支持使用内置列表或你自己的字典
- **RS256 到 HS256 混淆测试**,当你提供服务器的 public key 时,它能验证该漏洞
- **过期检查**:缺失 `exp`、已经过期,或具有可疑的超长有效期
- 对 `iat` 和 `nbf` 的 **时钟合理性检查**
- **敏感数据检测**,捕获在 claim 中携带的密码和 PII
- 针对 `iss`、`aud` 和 `sub` 的 **缺失 claim 提示**
- **JSON 输出** 和 `--fail-level` 退出代码,使其可直接作为 CI 门禁
## 教育价值
构建和阅读本项目将教会你:
- JWT 的实际结构,深入剖析到不带 padding 的 base64url
- 为什么 `alg: none` 在 2015 年左右的许多库中是一个真实存在的漏洞,以及为什么永远不要让 token 自行选择验证算法
- RS256 到 HS256 的混淆攻击是如何将 public key 变为签名密钥的
- 为什么 HMAC 验证必须使用恒定时间比较
- 哪些内容应该放在 token 中,哪些永远不该放,因为 payload 只是经过编码,并未加密
`learn/` 文件夹详细介绍了所有这些内容,从基础概念到逐行代码解析。
## 前置条件
- **Python 3.12 或更高版本**
- **[uv](https://github.com/astral-sh/uv)** 用于依赖管理。这也是本仓库标准化使用的工具。
- 对终端有基本的操作熟练度。你只需粘贴一个 token,然后阅读表格。
有帮助但非必需:熟悉 base64、HMAC 以及 bearer token 的概念。
## 安装说明
```
# 从项目目录
cd PROJECTS/beginner/jwt-auditor
# 创建环境并安装工具以及 dev dependencies
uv sync --all-extras
# 确认它运行
uv run jwt-auditor --help
```
## 运行说明
该工具包含三个命令:`decode`、`audit` 和 `crack`。每个命令都可以通过参数、`--input-file` 或 stdin 读取 token,因此可以轻松融入 pipeline。
### 解码 token
```
uv run jwt-auditor decode eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGljZSJ9.sig
```
添加 `--json` 以获取机器可读的输出。`decode` 永远不会检查签名。它只向你展示 token 所声明的内容。
### 审计 token
```
# 使用内置 wordlist 运行每个检查
uv run jwt-auditor audit
# 使用你自己的 wordlist 进行 secret check
uv run jwt-auditor audit --wordlist rockyou.txt
# 使用服务器公钥证明 RS 到 HS 混淆攻击
uv run jwt-auditor audit --public-key server_pub.pem
# 在 medium 或更严重时使进程失败,用于 CI
uv run jwt-auditor audit --fail-level medium
```
通过管道传入 token,避免其落入你的 shell 历史记录中:
```
echo "$TOKEN" | uv run jwt-auditor audit
```
### 破解 HMAC 密钥
```
uv run jwt-auditor crack --wordlist rockyou.txt
```
如果命中则返回退出代码 0 并打印密钥,如果没有匹配项则返回退出代码 1。
## 配置
没有配置文件或环境变量。所有行为均通过 flag 控制:
| Flag | Command | Meaning |
|------|---------|---------|
| `--input-file`, `-i` | all | 从文件读取 token |
| `--json` | decode, audit | 输出 JSON 而不是表格 |
| `--wordlist`, `-w` | audit, crack | 针对 HS token 尝试的密钥列表 |
| `--public-key`, `-p` | audit | 用于测试算法混淆的 public key PEM |
| `--max-lifetime` | audit | token 被视为长期有效的小时数阈值(默认 24) |
| `--fail-level` | audit | 达到此严重级别或更严重时以非零状态退出(默认 `high`) |
## 架构
处理流程非常精简且单向:
```
token string
│
▼
decoder.py split into 3 parts, decode header and payload
│
▼
checks.py run each check, collect Finding objects
│ (calls signatures.py for the secret and confusion checks)
▼
models.py AuditReport scores the findings
│
▼
output.py render a Rich table or JSON
```
这些检查逻辑从不进行打印操作,也不导入 Rich,因此很容易对它们进行独立测试。有关完整的详细解析,请参阅 `learn/02-ARCHITECTURE.md`。
## 安全注意事项
- **仅测试你获得授权的 token。** 破解你不拥有的系统的密钥不属于授权的安全测试。
- **Token 即凭证。** 相比于将活跃的 token 作为 shell 参数粘贴(这会导致其留在你的历史记录和进程列表中),优先选择通过 stdin 或文件输入。
- 本工具不验证 RSA 或 ECDSA 签名。它仅对其进行解码并针对算法处理方式发出警告。其核心目的是审计配置,而非充当用于生产环境流量的完整 JOSE 验证器。
## 运行测试
```
uv run pytest tests/ -v # 59 tests
uv run pytest --cov=jwt_auditor # coverage
uv run ruff check src/ tests/ # lint
uv run mypy src/ # types
```
## 许可证
基于 GNU Affero General Public License v3.0 发布。详见 [LICENSE](./LICENSE)。
标签:JWT, StruQ, 动态分析, 安全规则引擎, 密码学, 手动系统调用, 逆向工具