本仓库演示了当 token 验证未锁定允许的算法时,fast-jwt 中的 JWT 算法混淆问题。
在项目根目录下运行:
npm install
应用需要以下文件:
keys/private.pemkeys/public.pem运行以下任一命令集。
PowerShell (Windows):
New-Item -ItemType Directory -Path keys -Force | Out-Null
openssl genrsa -out keys/private.pem 2048
openssl rsa -in keys/private.pem -RSAPublicKey_out -out keys/public.pem
Linux/macOS/Git Bash:
mkdir -p keys
openssl genrsa -out keys/private.pem 2048
openssl rsa -in keys/private.pem -RSAPublicKey_out -out keys/public.pem
node server.js
预期输出:
Server running at http://localhost:3000
curl http://localhost:3000/generateToken
node sign.js
复制打印出的 token。
node checkAdmin.js <JWT_TOKEN>
如果攻击成功,响应中会包含 Welcome Admin!。
在 server.js 中,验证器没有限制算法:
const verifySync = createVerifier({
key: publicKey,
});
由于没有算法白名单,服务器可能会接受使用公钥作为 HMAC 密钥签名的恶意 HS256 token。
在我们团队的 CVE 演示中,存在漏洞的对象是库(无法独立运行),因此需要使用一个模拟应用程序来模拟实际系统调用该库 API 的方式。在本仓库中,server.js 文件就是模拟的应用层。
补充的 PoC 代码流程:
总之,我们团队没有重写该库的函数,只使用存在漏洞的库的原始 API(createSigner、createVerifier)在模拟应用内复现真实的利用场景。
将验证限制为 RS256:
const verifySync = createVerifier({
key: publicKey,
algorithms: ["RS256"],
});
本项目仅用于在受控实验室环境中进行安全学习。