strikoder/CVE-2026-29000-pac4j-jwt
GitHub: strikoder/CVE-2026-29000-pac4j-jwt
CVE-2026-29000 的概念验证工具,利用 pac4j-jwt 将未签名 JWT 包装在 JWE 中时不验证签名的缺陷,实现身份认证绕过和权限伪造。
Stars: 0 | Forks: 0
# pac4j-jwe-forge (CVE-2026-29000)
CVE-2026-29000 的概念验证。目标为 4.5.9、5.7.9 和 6.3.3 之前的 pac4j-jwt 版本。
该漏洞的原理非常简单:只要库将一个 `PlainJWT`(未签名,`alg=none`)包装在有效的 JWE 中,它就会接受该 JWT。由于服务器通过 JWKS 端点公开了其 RSA 公钥,任何人都可以使用该公钥将任意未签名的 JWT 加密成服务器会信任的 JWE —— 包括带有 `ROLE_ADMIN` 的 JWT。
## 工作原理
1. 从目标的 JWKS 端点获取 RSA 公钥
2. 使用你想要的任何 claims 构建一个未签名的 JWT (`alg=none`)
3. 使用服务器的公钥对其进行加密
4. 将生成的 JWE 作为 Bearer token 发送
服务器将其解密,信任其中的 claims,并且从不检查内部的 JWT 是否未签名。
## 环境要求
带有 [uv](https://github.com/astral-sh/uv) 的 Python 3.13+,或手动安装依赖项:
```
pip install jwcrypto requests
```
## 使用方法
```
[uv run / python3] CVE-2026-29000.py --url --jwks [options]
```
**必填项:**
| 标志 | 描述 |
|------|-------------|
| `--url` | 目标的基础 URL,例如 `http://10.10.11.x:8080` |
| `--jwks` | JWKS 端点的路径或完整 URL |
**可选项:**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--user` | `admin` | `sub` claim 的值 |
| `--role` | `ROLE_ADMIN` | 要伪造的角色 (`ROLE_ADMIN`, `ROLE_MANAGER`, `ROLE_USER`) |
| `--issuer` | `principal-platform` | `iss` claim 的值 |
| `--enc` | `A256GCM` | JWE 内容加密方式 (`A256GCM` 或 `A128GCM`) |
**示例:**
```
python3 exploit.py --url http://10.10.11.x:8080 --jwks /api/auth/jwks
python3 exploit.py --url http://10.10.11.x:8080 --jwks /api/auth/jwks --user john --role ROLE_ADMIN
python3 exploit.py --url http://10.10.11.x:8080 --jwks /.well-known/jwks.json --enc A128GCM
```
## 查找 JWKS 端点
通常并不明显。可以查找的好地方:
- `/robots.txt` — 通常会列出受限或内部路径
- `/api/auth/jwks`
- `/.well-known/jwks.json`
- `/.well-known/openid-configuration`
## 查找正确的 alg/enc
如果 token 被拒绝,应用程序可能需要特定的加密算法。检查 `/static/js/app.js` 是否包含类似以下内容:
```
const JWE_ALG = "RSA-OAEP-256";
const JWE_ENC = "A128GCM";
```
然后使用 `--enc A128GCM` 重新运行。
token 的存储方式通常也在其中:
```
class TokenManager {
static getToken() {
return sessionStorage.getItem('auth_token');
}
}
```
如果使用的是 sessionStorage,请直接在 DevTools 的 Application > Session Storage 中替换 token。
## 受影响的版本
- pac4j-jwt < 4.5.9
- pac4j-jwt < 5.7.9
- pac4j-jwt < 6.3.3
已在 4.5.9、5.7.9 和 6.3.3 版本中修复。
标签:alg=none, CISA项目, CSV导出, CVE-2026-29000, JWE, JWKS, JWT安全, pac4j-jwt, PlainJWT, PoC, Python, RSA公钥, Token伪造, Web安全, 代码执行, 协议分析, 无后门, 暴力破解, 权限提升, 网络安全, 蓝队分析, 身份验证绕过, 隐私保护