| 版本 | 基线测试 | 攻击测试 | 结果 |
|---|
6.0.3 | ✅ | ✅ | 存在漏洞 |
6.0.4.1 | ✅ | ✅ | 存在漏洞 |
6.3.3 | ✅ | ❌ | 已修复 |
本 PoC 演示了在存在漏洞的版本上,攻击者可控制主体(subject)和角色(roles)来创建已认证的用户配置文件,而已修复版本会拒绝伪造的令牌。
这不是一个 Web 应用演示。
它是一个小型 Java 程序,直接调用 JwtAuthenticator,并在 Docker 中对比多个版本的 pac4j-jwt。
目标是证明三件事:
测试版本是经过精心挑选的:
这为实验室提供了三个有用的参考点:
.
├── docker-compose.yml
├── Dockerfile
├── pom.xml
└── src/main/java/lab/Repro.java
docker-compose.yml
定义每个版本的测试矩阵。
Dockerfile
在容器内构建并运行 PoC。
pom.xml
定义依赖并构建可运行的 fat JAR。
src/main/java/lab/Repro.java
实际的 PoC 测试框架。
docker-compose.yml 文件定义了三个服务:
v603 = 测试 pac4j-jwt 6.0.3v6041 = 测试 pac4j-jwt 6.0.4.1patched = 测试 pac4j-jwt 6.3.3因此以下命令表示“针对该特定版本运行一次 PoC”:
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
--rm 表示运行结束后临时容器会被移除。
docker compose build --no-cache
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
对于每个版本,程序会运行两个用例。
它生成一个合法令牌,并通过 JwtAuthenticator 进行验证。
预期结果:
它生成一个带有攻击者控制声明的伪造令牌,并通过 JwtAuthenticator 进行验证。
预期结果:
你应该会看到类似这样的内容:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: ACCEPTED
observed_subject: admin#override
observed_roles: [ROLE_SUPERUSER, ROLE_ADMIN]
[summary]
conclusion: VULNERABLE: forged token accepted
含义:
你应该会看到类似这样的内容:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: REJECTED
reason: CredentialsException: A non-signed JWT cannot be accepted as signature configurations have been defined
[summary]
conclusion: PATCHED: forged token rejected
含义:
该 CVE 影响的是库级身份验证路径,而非具有单一通用角色模型的某个应用程序。
可复用的部分是攻击形态:
JwtAuthenticator在真实应用中并非通用的部分:
因此,本仓库专注于证明该库在存在漏洞的版本上会接受攻击者控制的伪造声明,而不是假装存在一个能自动适用于任意应用的通用令牌。
docker compose run --rm v603docker compose run --rm v6041docker compose run --rm patched


本项目证明了三个核心事实:
6.0.3 和 6.0.4.1 上被接受6.3.3 上被拒绝这是本仓库中该 CVE 的核心“存在漏洞与已修复”对比证据。
在存在漏洞的版本上,伪造令牌不仅会被解析——它还会生成一个带有攻击者控制的主体和角色的已认证用户配置文件。