
Proof-of-concept, der JWT-Algorithmus-Verwirrung in der fast-jwt-Bibliothek demonstriert. Enthält einen verwundbaren Server, ein Skript zum Fälschen von Tokens und eine Korrektur der Verifikation für die Sicherheitsschulung.
Dieses Repository demonstriert JWT-Algorithmen-Konfusion in fast-jwt, wenn die Token-Verifizierung die erlaubten Algorithmen nicht einschränkt.
Führen Sie vom Projektstamm aus aus:
npm install
Die App erwartet diese Dateien:
keys/private.pemkeys/public.pemFühren Sie einen der folgenden Befehlssätze aus.
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
Erwartete Ausgabe:
Server running at http://localhost:3000
curl http://localhost:3000/generateToken
node sign.js
Kopieren Sie das ausgegebene Token.
node checkAdmin.js <JWT_TOKEN>
Wenn der Angriff erfolgreich ist, enthält die Antwort Welcome Admin!.
In server.js schränkt der Verifizierer die Algorithmen nicht ein:
const verifySync = createVerifier({
key: publicKey,
});
Ohne eine Zulassungsliste für Algorithmen könnte der Server ein bösartiges HS256-Token akzeptieren, das mit dem öffentlichen Schlüssel als HMAC-Geheimnis signiert wurde.
In den CVE-Demos der Gruppe ist das anfällige Objekt die Bibliothek (sie kann nicht eigenständig ausgeführt werden). Daher wird eine simulierte Anwendung benötigt, um zu reproduzieren, wie ein reales System die APIs dieser Bibliothek aufruft. In diesem Repository ist die Datei server.js die simulierte Anwendungsschicht.
Ergänzender PoC-Code-Ablauf:
Zusammenfassend hat die Gruppe die Funktionen der Bibliothek nicht neu geschrieben. Sie verwendet lediglich die ursprüngliche API der anfälligen Bibliothek (createSigner, createVerifier) innerhalb der simulierten App, um den Exploit-Kontext korrekt nachzustellen.
Schränken Sie die Verifizierung auf RS256 ein:
const verifySync = createVerifier({
key: publicKey,
algorithms: ["RS256"],
});
Dieses Projekt dient ausschließlich dem Sicherheitslernen in einer kontrollierten Laborumgebung.