Wie häufig sollte die Token-Aktualisierung in der CSRF-Sicherheit sein?

9

Zunächst einmal ist dieser Beitrag das, was Jeff Atwood über CSRF-Token sagt. Auf dieser Seite sagt er weiter:

Eine noch stärkere, wenn auch komplexere Präventionsmethode besteht darin, den Serverstatus zu nutzen, um für jedes einzelne HTML-FORMULAR, das Sie an den Client senden, einen eindeutigen Zufallsschlüssel zu generieren (und mit Zeitüberschreitung zu verfolgen). Wir verwenden eine Variante dieser Methode mit großem Erfolg für den Stapelüberlauf.

In diesem Beitrag selbst bemerkt Jeff jedoch nie, wann und wie die Token aktualisiert werden sollten.

Ich habe eine ähnliche Technik in einer Web-App verwendet, an der ich gearbeitet habe. Es funktioniert so:

  1. Immer wenn der Benutzer POSTDaten an meinen Server sendet, wird ein CSRF-Token gesendet.
  2. Dieses CSRF-Token wird in der Sitzung des Benutzers in einem kryptografisch starken Cookie gespeichert.
  3. Wenn das Token gültig ist, wird die Anforderung des Benutzers verarbeitet und umgekehrt.
  4. Wenn die Anforderung gültig ist, verwerfen Sie das alte Token auf der Serverseite und erstellen Sie ein neues Token. Die Antwort vom Server enthält ein neues csrf-Token, das bei der nächsten Anforderung verwendet werden soll. Das alte Token auf allen Formularen auf einer Seite wird mit dem neuen aktualisiert, damit die nächste Anforderung ordnungsgemäß verarbeitet wird.

Ist es POSTsinnvoll, die Token nach jeder Anforderung zu aktualisieren, oder sollte die Aktualisierung nur durchgeführt werden, wenn der Benutzer eine GETAnforderung stellt und dasselbe Token behält, bis die nächste GET-Anforderung erfolgt?

c0da
quelle
Dies gehört wohl auf security.stackexchange.com
tylerl

Antworten:

10

Der Hauptpunkt eines CSRF-Tokens ist, dass es nicht von einer anderen Site gesendet werden kann. Daher kann es (a) von einem Angreifer nicht vorhergesagt oder erkannt werden, und (b) wird nicht automatisch an eine Anfrage angehängt, wie es ein Cookie ist.

Wenn ein CSRF-Token also theoretisch niemals an Dritte weitergegeben wird, müssen Sie ihn theoretisch überhaupt nicht ablaufen lassen. Aber dann laufen Sie Gefahr, dass Ihr Token irgendwie "durchgesickert" wird. Daher sollte Ihre Ablauffrist wirklich kurz genug sein, um die Aussicht zu bekämpfen, dass ein Token herauskommt und gegen Ihren Benutzer verwendet wird.

Es gibt eigentlich keine Richtlinien, aber eine gute Technik besteht darin, bei JEDER Anfrage automatisch ein neues Token zu generieren, in das ein signierter Timecode eingebettet ist, und dann Token bis zu einem bestimmten Alter zu akzeptieren.

Eine Beispielfunktion könnte sein:

concat(current_time,salt,sha256_sum(concat(salt,userid,current_time,secret_string)))

Das Token enthält Timing-Informationen und ein Salt, aber auch eine Signatur, die nicht gefälscht werden kann und an die Benutzer-ID gebunden ist.

Dann können Sie Ihr eigenes Ablaufintervall definieren - eine Stunde, einen Tag, 2 Stunden. Wie auch immer. Das Intervall ist in diesem Fall nicht an das Token gebunden, sodass Sie die Ablaufregeln beliebig festlegen können.

Zumindest sollten CSRF-Token jedoch ablaufen, wenn die Anmeldesitzung abläuft oder wenn sich der Benutzer abmeldet. Der Benutzer erwartet nicht, dass ein Formular, das Sie vor dem Abmelden aufgerufen haben, auch nach dem erneuten Anmelden weiterhin funktioniert.

tylerl
quelle
"Theoretisch also, wenn ein CSRF-Token niemals an Dritte weitergegeben wird". Aber ist das Token nicht im HTML-Code des Formulars? Ich bin verwirrt.
c0da
1
Ich bin die erste Partei, du, die Person, mit der ich spreche, bist die zweite Partei. Jemand, der von außen lauscht, ist der Dritte. Aus diesem Grund ist es katastrophal, dasselbe Token zwischen verschiedenen Benutzern zu teilen.
Tylerl