Frage:
Warum CSRF-Token pro Formularanforderung aktualisieren?
Philipp Gayret
2012-10-20 16:15:45 UTC
view on stackexchange narkive permalink

In vielen Tutorials und Anleitungen sehe ich, dass ein CSRF-Token pro Anfrage aktualisiert werden sollte. Meine Frage ist, warum ich das tun muss? Ist ein einzelnes CSRF-Token pro Sitzung nicht viel einfacher als das Generieren eines Tokens pro Anfrage und das Verfolgen der angeforderten Token?

Das Generieren des Tokens auf Anfragebasis scheint die Sicherheit nicht über das hinaus zu verbessern Ein Token pro Sitzung würde bereits ausreichen. Das einzige Argument scheint der XSS-Schutz zu sein, dies gilt jedoch nicht, da das Skript bei einer XSS-Sicherheitsanfälligkeit ohnehin neue Token auslesen kann.

Welche Vorteile bietet das Generieren neuer Token pro Anforderung?

Acht antworten:
bobince
2012-10-22 01:31:40 UTC
view on stackexchange narkive permalink

Aus den bereits diskutierten Gründen ist es nicht erforderlich, pro Anforderung ein neues Token zu generieren. Es bringt fast keinen Sicherheitsvorteil und kostet Sie in Bezug auf die Benutzerfreundlichkeit: Wenn nur ein Token gleichzeitig gültig ist, kann der Benutzer nicht normal in der Webanwendung navigieren. Wenn sie beispielsweise auf die Schaltfläche "Zurück" klicken und das Formular mit neuen Werten senden, schlägt die Übermittlung fehl und sie werden wahrscheinlich mit einer feindlichen Fehlermeldung begrüßt. Wenn sie versuchen, eine Ressource auf einer zweiten Registerkarte zu öffnen, wird die Sitzung zufällig auf einer oder beiden Registerkarten unterbrochen. In der Regel lohnt es sich nicht, die Benutzerfreundlichkeit Ihrer Anwendung zu beeinträchtigen, um diese sinnlose Anforderung zu erfüllen.

Es gibt jedoch einen Ort, an dem es sich lohnt, ein neues CSRF-Token auszustellen: bei einer Hauptänderung im Inneren eine Sitzung. Das ist vor allem beim Login. Dies soll einen Sitzungsfixierungsangriff verhindern, der zu einer CSRF-Angriffsmöglichkeit führt.

Beispiel: Der Angreifer greift auf die Site zu und generiert eine neue Sitzung. Sie nehmen die Sitzungs-ID und fügen sie in den Browser eines Opfers ein (z. B. durch Schreiben eines Cookies aus einer anfälligen Nachbardomäne oder mithilfe einer anderen Sicherheitsanfälligkeit wie jsessionid-URLs) und fügen das CSRF-Token in ein Formular im Browser des Opfers ein. Sie warten darauf, dass sich das Opfer mit diesem Formular anmeldet, und verwenden dann einen anderen Formularbeitrag, um das Opfer zu veranlassen, eine Aktion mit dem noch aktiven CSRF-Token auszuführen.

Um dies zu verhindern, machen Sie das CSRF-Token und ungültig Stellen Sie an den Stellen (wie beim Anmelden), an denen Sie bereits dasselbe mit der Sitzungs-ID tun, eine neue aus, um Angriffe zur Sitzungsfixierung zu verhindern.

Ist dieser Rat jetzt noch gültig, da BREACH-Angriffe eine Sache sind?
BREACH-Angriffe sollten auf einer anderen Ebene gelöst werden (durch Deaktivieren der Komprimierung von Anwendungsdaten UND der TLS-Komprimierung). Die Antwort lautet daher: Sie sollten sich keine Gedanken über den BREACH-Angriff machen, es sei denn, Sie richten TLS oder den HTTP-Server ein
D.W.
2012-10-21 04:55:57 UTC
view on stackexchange narkive permalink

Übersicht. Standardmäßig wird empfohlen, ein eindeutiges CSRF-Token zu verwenden, das für jede Anforderung eindeutig ist. Warum? Weil ein Token pro Anforderung gegenüber bestimmten Arten von Implementierungsfehlern etwas widerstandsfähiger ist als ein Token pro Sitzung. Dies macht Token pro Anfrage wohl zur besten Wahl für die Entwicklung neuer Webanwendungen. Außerdem wird Sie kein Sicherheitsprüfer mit der Verwendung eines CSRF-Tokens pro Anforderung belästigen.

Wenn Sie ein Webanwendungsentwickler sind, ist dies alles, was Sie wissen müssen, und Sie können hier aufhören zu lesen. Wenn Sie jedoch ein Sicherheitsexperte sind, der sich über die detaillierten Gründe für diesen Rat wundert oder sich fragt, wie hoch das Risiko ist, wenn Sie ein Token pro Sitzung verwenden, lesen Sie weiter ....


Ein bisschen tiefer gehen. Die Wahrheit ist, dass ein einzelnes CSRF-Token pro Sitzung in Ordnung ist, wenn Sie keine anderen Schwachstellen auf Ihrer Website haben. Es gibt keinen Grund, warum Sie unbedingt ein neues CSRF-Token pro Anfrage generieren müssen.

Dies wird durch die Tatsache belegt, dass Sie auch seriöse Sicherheitsexperten finden, die dies für sinnvoll halten Um sich gegen CSRF zu verteidigen, verwenden Sie die doppelte Übermittlung von Cookies. Mit anderen Worten, Sie verwenden clientseitiges Javascript, das einen Hash des Sitzungscookies berechnet und diesen zu jeder POST-Anforderung hinzufügt und den Hash als CSRF-Token behandelt. Sie können sehen, dass dies im Wesentlichen im laufenden Betrieb ein CSRF-Token generiert, das für die gesamte Sitzung gleich ist.

Natürlich kenne ich das Argument, warum manche Leute empfehlen könnten, für jede Anfrage ein neues CSRF-Token zu generieren. Sie denken, wenn Sie auch eine XSS-Sicherheitsanfälligkeit auf Ihrer Website haben, ist es bei Verwendung eines einzelnen CSRF-Tokens pro Sitzung einfach, XSS zum Wiederherstellen des CSRF-Tokens zu verwenden. Wenn Sie jedoch pro Anforderung ein neues CSRF-Token generieren, ist dies der Fall wird mehr Arbeit erfordern, um das CSRF-Token wiederherzustellen. Persönlich finde ich das kein schrecklich überzeugendes Argument. Wenn Ihre Site eine XSS-Sicherheitsanfälligkeit aufweist, können CSRF-Token auch dann wiederhergestellt werden, wenn Sie für jede Anforderung ein neues CSRF-Token generieren. Es sind nur ein paar zusätzliche Zeilen schädlichen Javascript erforderlich. In beiden Fällen ist es schwierig, die Sicherheit zu gewährleisten, wenn Sie eine XSS-Sicherheitsanfälligkeit auf Ihrer Website haben und einem ernsthaften, sachkundigen Angreifer ausgesetzt sind, unabhängig davon, wie Sie Ihre CSRF-Token generieren.

Insgesamt kann dies nicht schaden um für jede Anfrage ein neues CSRF-Token zu generieren. Und vielleicht ist es besser, es so zu machen, nur um Sicherheitsprüfer von Ihrem Rücken zu bekommen. Wenn Sie jedoch bereits eine Legacy-Anwendung haben, die ein einzelnes CSRF-Token für die gesamte Sitzung verwendet, würde das Ausgeben des Geldes für die Konvertierung zur Generierung eines neuen CSRF-Tokens für jede Anforderung wahrscheinlich nicht ganz oben auf meiner Prioritätenliste stehen: Ich wette, ich könnte einige andere Verwendungszwecke für dieses Geld und die Entwicklerenergie finden, die die Sicherheit noch weiter verbessern würden.

Ich würde sie nicht als "seriöse Sicherheitsexperten" bezeichnen, wenn sie die doppelte Übermittlung von Cookies empfehlen ... XSS ist nicht das einzige Problem, das dafür vorliegt. OWASP hat einen guten Überblick ...
@AviD, Double Submit Cookies ist vollkommen in Ordnung. Ich habe noch keinen Beweis dafür gefunden, dass dieser Ansatz wesentlich anfälliger ist als jeder andere Ansatz. Jede Technik hat ihre Schwachstellen. Dieser ist nicht anders.
@Gili Das Problem bei Double-Submit-Cookies besteht darin, dass sich dies normalerweise auf das normale, bereits vorhandene Sitzungscookie bezieht - und dass JavaScript nicht darauf zugreifen sollte (z. B. mit dem Flag "HttpOnly"). Die Verwendung dieser Technik kann den CSRF-Angriff verhindern, würde jedoch das Sitzungscookie für andere Probleme öffnen, z. B. die Anfälligkeit für mögliche XSS-Schwachstellen. Es gibt Techniken, die einwandfrei funktionieren, ohne andere, separate Sicherheitslücken zu verursachen.
@AviD,, wie unter http://security.stackexchange.com/q/61110/5002 erwähnt, weist OWASP Entwickler an, genau aus diesem Grund ein separates Cookie für das CSRF-Token zu verwenden. Sie können das Flag "HttpOnly" im Sitzungscookie beibehalten.
@Gili ja, genau das ist der Punkt.
@AviD, Entschuldigung, ich verstehe Ihren Standpunkt nicht. Sie sagten, dass Double-Submit-Cookies Sie zwingen, das Flag "HttpOnly" aus dem Sitzungscookie zu entfernen, aber ich habe nur erklärt, dass dies nicht der Fall ist (Sie können ein separates Cookie für das Token "Double-Submit-Cookies" verwenden). Macht dies Ihre ursprüngliche Beschwerde nicht ungültig?
@Gili, las die Kommentare von AviD erneut. Verpassen Sie nicht seine Verwendung des Wortes "typisch". Unter Doppel-Cookie-Übermittlung wird normalerweise die Wiederverwendung des Sitzungscookies verstanden. Wenn jemand die Übermittlung von Doppel-Cookies empfiehlt und keine ausdrücklichen gegenteiligen Haftungsausschlüsse hat, bedeutet dies, dass er die Wiederverwendung des Sitzungscookies empfiehlt. Ich denke, AviD hat dies mit seinen obigen Kommentaren abgedeckt.
Meinetwegen. PS: In einem ähnlichen Zusammenhang stellt http://security.stackexchange.com/a/43550/5002 den Wert von "HttpOnly" gegen XSS-Angriffe in Frage.
@Gili, yup, ich weiß. :-) Ich habe gerade eine Antwort auf die Frage gepostet, auf die Sie verlinkt haben, und auch auf dieselbe Diskussion über `HttpOnly`. Danke für den Hinweis und die Diskussion!
@Gili ja, genau wie D.W. sagte, das war genau meine Absicht.
@AviD, Ich bin froh, dass wir beide auf derselben Seite sind. Danke für die Klarstellung.
"Es kann nicht schaden, für jede Anfrage ein neues CSRF-Token zu generieren", schadet es der Benutzerfreundlichkeit (?)
Das CSRF-Token für jede Anforderung kann aktualisiert werden, Sie müssen sich jedoch um Ajax-Anrufe kümmern.In gewisser Weise ist es ein langwieriger Prozess, aber der Ajax-Aufruf kann aktualisiert werden.
rook
2012-10-20 23:24:34 UTC
view on stackexchange narkive permalink

XSS kann zum Lesen eines CSRF-Tokens verwendet werden, auch wenn es sich um ein einzelnes Submit-Token handelt. Dies ist ein Kinderspiel. Es ist wahrscheinlich, dass diese Empfehlung für ein einzelnes Übermittlungstoken von jemandem stammt, der CSRF nicht versteht.

Der einzige Grund für die Verwendung eines "einzelnen Übermittlungstokens" besteht darin, dass Sie verhindern möchten, dass der Benutzer versehentlich auf "Senden" klickt zweimal. Eine gute Verwendung besteht darin, zu verhindern, dass der Benutzer zweimal auf "Kasse" klickt und den Kunden versehentlich zweimal belastet.

Ein CAPTCHA oder die Abfrage des aktuellen Kennworts des Benutzers kann als Anti-CSRF-Maßnahme verwendet werden, die dies nicht kann von XSS umgangen werden.

Ich empfehle, das CSRF Prevention Cheat Sheet zu lesen.

Ich sehe nicht ein, wie ein CAPTCHA oder die Eingabe des Passworts angesichts von XSS sicher wäre. Es zwingt den Angreifer nur, durch ein paar zusätzliche Reifen zu springen.
@CodesInChaos Der Angreifer müsste das Passwort kennen, und dann ist es ein strittiger Punkt.
Wenn der Benutzer das Passwort irgendwann nach dem xss eingibt, kann der Angreifer es wahrscheinlich stehlen. Die erneute Eingabe des Passworts hilft also ein bisschen, aber nicht viel.
@CodesInChaos Das funktioniert auf dem Papier gut, aber dieser vorgeschlagene Angriff ist in einem realen Szenario erheblich weniger erfolgreich.
@CodesInChaos Sie haben Recht, dass ein CAPTCHA dafür irrelevant wäre. Andererseits ist die erneute Authentifizierung (selektiv bei sensiblen Aktionen) eine der besten Lösungen für CSRF und sollte häufiger eingesetzt werden. Siehe auch Schneiers Diskussion über "Transaktionsauthentifizierung", die ähnlich, aber nicht identisch ist.
Einweg-Token bieten noch mehr Vorteile (zumindest für geschäftskritische Operationen): Sie bieten zusätzliche Sicherheit gegen [Wiederholungsangriffe] (http://en.wikipedia.org/wiki/Replay_attack).
@Domi Es kommt darauf an, wie sie den Token überhaupt bekommen haben. Wenn es mit XSS oder über einen unsicheren Kanal geht, spielt das rollende Token keine Rolle.
Sie bieten weiterhin Sicherheit gegen Wiederholungsangriffe, da kein XSS vorhanden ist.
Polynomial
2012-10-20 18:37:03 UTC
view on stackexchange narkive permalink

Wenn das Token während der gesamten Sitzung gleich ist, kann ein Angreifer möglicherweise ein Token von einer Seite verlieren und es für eine andere Aktion verwenden.

Sie können beispielsweise ein Token verwenden Wenn Sie eine Seite laden möchten, extrahieren Sie das Token mithilfe einer XSS-Sicherheitsanfälligkeit. Von dort aus können Sie dieses Token verwenden, um ein Kennwortänderungsformular zu senden.

Die Verwendung eines Tokens pro Anforderung anstelle eines sitzungsweiten Tokens erschwert dies, verhindert jedoch nicht CSRF. Ein Angreifer kann einfach ein XSS nutzen, um das Token von der Seite zu lesen und es dann abzufeuern. Wenn das Token jedoch global ist und nicht auf diese einzelne Seite beschränkt ist, kann ein Angreifer auf jede Seite zielen, um das Token zu stehlen. Die Verwendung separater Token für jede Anforderung erschwert dies erheblich.

Es gibt keine Möglichkeit, dass jemand etwas aus dem Iframe extrahieren kann. Dies würde gegen die [gleiche Ursprungsrichtlinie] verstoßen (http://en.wikipedia.org/wiki/Same_origin_policy).
@SkPhilipp Entschuldigung, ich wollte über XSS sagen.
Die Verwendung eines XSS sollte möglich sein, um Token zu extrahieren, auch wenn sie bei jeder Anforderung aktualisiert werden. Habe ich recht?
Ja, über XSS können Sie dann einen Iframe in ein Kennwortänderungsformular laden und dieses Token extrahieren. Das Generieren neuer Token würde dies nicht sicher machen, wenn Sie eine XSS-Sicherheitsanfälligkeit haben.
-1 Es tut mir leid, aber ich möchte nicht, dass die Leute auf die Idee kommen, dass sie, wenn sie ein einzelnes Submit-Token verwenden, auf magische Weise gegen XSS geschützt sind, da dies höchst unwahr ist. Wenn ein Benutzer dies in einem Webbrowser tun kann, kann xss dies in einem Webbrowser tun.
@Rook Huh? Ich habe nie gesagt, dass die Verwendung eines einzelnen Tokens gut ist ...
Wenn Sie eine XSS-Sicherheitsanfälligkeit haben, können Sie mit einer XHR jede Seite lesen und jede Anfrage senden. Es hilft nicht, auf jeder Seite ein anderes Token zu haben.
@Rook Ich sage nicht, dass es das Problem vollständig löst, aber es macht es schwieriger, wenn Sie einzelne Token verwenden und sie für bestimmte Anforderungen sperren. Ich kann sehen, warum Sie sich Sorgen machen, dass die Antwort den falschen Eindruck erwecken würde.
SilverlightFox
2015-11-30 16:45:14 UTC
view on stackexchange narkive permalink

Neben den anderen Antworten ist es möglicherweise ratsam, das Token auch zu aktualisieren, wenn Ihr Server für den BREACH-Angriff anfällig ist.

Dies erfordert die folgenden drei Bedingungen:

  • Wird von einem Server bereitgestellt, der die Komprimierung auf HTTP-Ebene verwendet.
  • Reflektiert Benutzereingaben in HTTP-Antwortkörpern
  • Reflektiert ein Geheimnis (z als CSRF-Token ) in HTTP-Antwortkörpern
/ blockquote>

Um BREACH zu verringern, müssten Sie das CSRF-Token in der GET-Anforderung aktualisieren, die ein Formular lädt um alle vorherigen Token ungültig zu machen. Auf diese Weise erhält ein MITM (Man-In-The-Middle), der zusätzliche Anforderungen zum Erkennen des Tokens auf der Seite erstellt, jedes Mal ein anderes Token. Dies bedeutet, dass der echte Benutzer das Formular in einer MITM-Situation nicht senden kann.

Natürlich benötigen Sie die beiden anderen Bedingungen, um auch zu gelten. Es wäre wahrscheinlich einfacher, ein CSRF-Token pro Sitzung zu verwalten und die Komprimierung auf HTTP-Ebene für alle Seiten zu deaktivieren, die Formulare bereitstellen.

user2428118
2015-07-17 15:45:15 UTC
view on stackexchange narkive permalink

Es ist keine sehr bekannte Tatsache, aber ein normaler String-Vergleich ist anfällig für Timing-Angriffe ( wie dieser. Kurz gesagt, normale String-Vergleichsoperationen ( == code) > oder === ) vergleicht zwei Zeichenfolgen zeichenweise von links nach rechts und gibt false zurück, sobald sie auf ein Zeichen gestoßen sind, das an einer bestimmten Position in beiden Zeichenfolgen nicht gleich ist. Dies ergibt ein Winzchen Unterschied im Timing, der sich als erkennbar erwiesen hat.

Durch die Verwendung eines Timing-Angriffs, um jedes mögliche Zeichen für jede Position auszuprobieren, ist es möglich, den tatsächlichen Token zu ermitteln. Durch das Erstellen eines neuen Tokens bei jeder Übermittlung einer Anforderung mit einem Token kann dieser Angriff verhindert werden.

Dies funktioniert natürlich nur, wenn Sie das Token auch neu erstellen, wenn ein ungültig ist Es wurde ein Token gesendet, was möglicherweise unerwünscht ist. Daher sollten Sie dies besser beheben, indem Sie eine zeitunempfindliche Zeichenfolgenvergleichsfunktion wie diese verwenden.

Okay, aber ich muss in den Beispielen und dem Papier beachten, dass ein theoretischer Angreifer die CPU-Taktzeit sehr genau messen kann. Die Maschine war keiner anderen Last ausgesetzt, und viele Sprachen verwenden vorberechnete Hashcodes für den Zeichenfolgenvergleich, bevor sie eine zeichenweise Prüfung durchführen.
Konstante Zeitvergleiche können und sollten verwendet werden, um dies zu mildern (Schleife über alle Zeichen und x oder ein Differenzflag).
edruid
2015-04-23 20:30:37 UTC
view on stackexchange narkive permalink

Ein Grund für die Änderung des CSRF-Tokens pro Anforderung besteht darin, das Komprimierungsleck des Tokens zu verringern. Damit meine ich, dass wenn der Angreifer Eve Daten auf eine Seite einfügen kann, die das Token enthält, an das die Seite komprimiert gesendet wird, Eve das erste Zeichen der Zeichenfolge erraten kann, die einen kleineren Datensatz für die Seite erhält, und weiß, dass sie richtig geraten hat weiter zum nächsten Zeichen.

Dies ähnelt einem Timing-Angriff.

Im Moment gibt es keinen Grund (den ich kenne), das Token zu ändern, wenn es nur in den HTTP-Headern gesendet wird.

Eine andere Methode besteht darin, das Token zu ändern, sobald eine fehlgeschlagene Anforderung entdeckt wird. Dies kann jedoch zu Problemen führen, wenn der Benutzer kein Formular senden kann.

Bhuvanesh
2015-07-17 12:37:51 UTC
view on stackexchange narkive permalink

Wenn dasselbe Token für die gesamte Sitzung verwendet wird, besteht die Wahrscheinlichkeit, dass ein Angreifer das Token mit XSS entführen und die Sitzung des Opfers verwenden kann, um böswillige Aktivitäten wie das Ändern des Kennworts auszuführen .

Sie können Passwörter durchsuchen, indem sie einen Iframe in die von Ihnen verwendete Site einfügen.

Es ist daher besser, ein Token pro Anforderung zu verwenden, um zu verhindern, dass der Angreifer gewinnt Zugriff auf dieses Token.

Ein Angreifer, der XSS verwendet, kann auf neue Token zugreifen. Darum geht es in der gesamten Frage. Siehe auch die Kommentare unter http://security.stackexchange.com/a/22904/15195


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...