it-swarm.com.de

Ist ein JWT als CSRF-Token verwendbar?

Ich benötige ein CSRF-Token für eine bestimmte Anwendung, die ein Formular mit POST sendet. Im Idealfall möchte ich nicht für jede Übermittlung einen DB-Aufruf durchführen, um Speicherplatz sowie DB-Verkehr und Latenz zu vermeiden. Zu diesem Zweck OWASPs "CSRF Prevention Cheat Sheet" sagt,

Übersicht

Das verschlüsselte Token-Muster nutzt eine Verschlüsselungs- und keine Vergleichsmethode zur Token-Validierung. Nach erfolgreicher Authentifizierung generiert der Server ein eindeutiges Token, das aus der Benutzer-ID, einem Zeitstempelwert und einer Nonce besteht, wobei ein eindeutiger Schlüssel verwendet wird, der nur auf dem Server verfügbar ist. Dieses Token wird an den Client zurückgegeben und in ein verstecktes Feld eingebettet. […] Nicht auf AJAX-Formularen basierende Anforderungen behalten das Token implizit in seinem verborgenen Feld bei. Nach Erhalt dieser Anforderung liest und entschlüsselt der Server den Token-Wert mit demselben Schlüssel, der zum Erstellen des Tokens verwendet wurde. […]

Validierung

Bei erfolgreicher Token-Entschlüsselung hat der Server Zugriff auf analysierte Werte, idealerweise in Form von Ansprüchen.

Die erste Zeile von "Validation" liest sich für mich wie die Definition eines JWT . Ich verstehe auch nicht, warum die Informationen im Token verschlüsselt werden müssen: Es scheint, dass lediglich authentifiziert werden muss, dass sie vom Server stammen (im Gegensatz zu einem Angreifer, der versucht, ein CSRF-Token zu fälschen).

Gibt es einen bestimmten Grund, CSRF-Token zu verschlüsseln? Wenn nicht, reicht ein JWT aus?

Das obige Token-Muster enthält auch eine Nonce. Was ist der Sinn der Nonce? (Der springende Punkt dieses Musters ist, keinen Status serverseitig zu speichern. Wenn ich keinen Status speichere, wie kann ich das Nonce während der Validierung auf irgendeine materielle Weise verwenden?)

Mein Hauptgrund für die Verfolgung von JWTs hier ist, dass es eine anständige Bibliotheksunterstützung gibt. Ich werde sie wahrscheinlich früher oder später für die Authentifizierung haben wollen, und es hält mich meistens davon ab, Krypto-Sachen zu implementieren.

Mein Verständnis von JWTs ist, dass ich, wenn ich JWTs für die vollständige Benutzerauthentifizierung hätte, diese in localStorage speichern und diese vor dem Absenden des Formulars einfach einem Feld mit JS hinzufügen könnte. Leider verwendet die App eine Cookie-basierte Authentifizierung, und ich kann diesen Aspekt derzeit nicht ändern.

17
Thanatos

Es ist nicht erforderlich, das Token zu verschlüsseln oder das Nonce einzuschließen. Die Schlüsseleigenschaften eines CSRF-Tokens sind, dass es von einem Angreifer nicht vorhersehbar ist und im Gegensatz zu Cookies nicht zu jeder Anforderung des Browsers hinzugefügt wird. Ein kryptografisch sicheres JWT , das in einem versteckten Feld gespeichert ist, erfüllt beide Eigenschaften.

Beachten Sie, dass Sie JWTs verwenden müssen, die benutzerspezifische Daten enthalten. Wenn Sie eine leere oder generische JWT haben, die nicht spezifisch für den Benutzer ist, erhalten Sie keine Sicherheit.

13
Neil Smithline

TL; DR

Wenn ein JWT ohne Cookies verwendet wird, ist kein CSRF-Token erforderlich - ABER! Indem Sie JWT in session/localStorage speichern, legen Sie Ihre JWT- und Benutzeridentität offen, wenn Ihre Site eine XSS-Sicherheitsanfälligkeit aufweist (ziemlich häufig). Es ist besser, dem JWT einen Schlüssel csrfToken hinzuzufügen und den JWT in einem Cookie mit den Attributen secure und http-only Zu speichern.

Lesen Sie diesen Artikel mit einer guten Beschreibung für weitere Informationen https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

Sie können diesen CSRF-Schutz zustandslos machen, indem Sie einen xsrfToken JWT-Anspruch einfügen:

{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["Explorer", "solar-harvester", "seller"], "sub": "[email protected]", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }

Sie müssen das csrfToken also in local/sessionStorage sowie im JWT (das nur in einem http-gesicherten und sicheren Cookie gespeichert ist) speichern. Überprüfen Sie dann zum Schutz der CSRF, ob das CSRF-Token im JWT mit dem übermittelten CSRF-Token-Header übereinstimmt.

23
Scott Jungwirth

Sie könnten ein JWT als CSRF-Token verwenden, aber es wäre unnötig kompliziert: Ein CSRF-Token muss keine Ansprüche enthalten oder verschlüsselt oder signiert sein.

Es gibt wahrscheinlich ein Missverständnis darüber, wofür JWT- oder CSRF-Token verwendet werden (ich war auch zuerst verwirrt). Das JWT ist ein Zugriffstoken, das zur Authentifizierung verwendet wird. Das CSRF-Token wird andererseits verwendet, um den Benutzer davor zu schützen, zum Senden einer gefälschten authentifizierten Anforderung verleitet zu werden. Dies ist erforderlich, wenn Sie eine Sitzung oder eine HTTP-Basisauthentifizierung verwenden oder das JWT in einem Cookie speichern - jede Authentifizierung, die vom Browser automatisch durchgeführt wird.

Wenn Sie über ein solches Authentifizierungsschema verfügen, stellen Sie sicher, dass Sie

  • verwenden Sie geeignete HTTP-Verben (GET darf keine Nebenwirkungen haben)
  • generieren Sie bei jeder Anforderung ein neues CSRF-Token
  • fügen Sie das CSRF-Token in einen Header oder als HTTP-Parameter in jede PATCH-, POST-, PUT- und DELETE-Anforderung ein

Lesen Sie zum Beispiel, wie Spring behandelt CSRF .

1
Dario Seidl