Warum nicht verwenden session-ID als XSRF-token?
Warum Play Framework verwenden Sie [eine signierte version der session-id] als Cross-Site Request Forgery (XSRF/CSRF) Prävention-token, anstatt die session-ID selbst?
(Mit XSRF-Prävention token, ich meine, ein Magischer Wert, die aufgenommen werden müssen in eine form übertragen, die für die webapp zu akzeptieren, form.)
Wenn es einen Lauscher s/er feststellen, sowohl die XSRF-token und dem SID-cookie sowieso (?).
Wenn es eine XSS-exploit, dann wird der bösartige JavaScript-code kann sowohl die XSRF-token und dem SID-cookie (?).
Jedoch:
-
Ein Angreifer kann nicht bauen eine gültige XSRF-token, da eine SID an, da er/Sie nicht über den geheimen Schlüssel, der verwendet wird, wenn die Unterzeichnung der SID zu erhalten, die XSRF-token. - Aber wie konnte es passieren, dass ein Angreifer bekommt halt nur die SID, nicht den XSRF-token? Ist das weit hergeholt?
-
Wenn die SID gesendet wird in einem HTTP-cookie, dann kann ein Angreifer hätte nicht den SID auch wenn Sie/er die XSRF-token, und vielleicht ist der Angreifer muss wirklich die SID? -- Ist das weit hergeholt?
Code-snippets:
Hier Spielen Konstrukte es XSRF-token (getId
gibt die session-ID):
(play/framework/src/play/mvc/Scope.java)
public String getAuthenticityToken() {
return Crypto.sign(getId());
}
Hier Spielen überprüft, dass eine <form>
hat eine gültige XSRF-token:
(play/framework/src/play/mvc/Controller.java)
protected static void checkAuthenticity() {
if(Scope.Params.current().get("authenticityToken") == null ||
!Scope.Params.current().get("authenticityToken").equals(
Scope.Session.current().getAuthenticityToken())) {
forbidden("Bad authenticity token");
}
}
Update:
Spielen hat sich verändert, wie es erzeugt XSRF-Token, jetzt die SID wird nicht mehr verwendet, stattdessen ein zufälliger Wert ist signiert und verwendet! (Ich habe gerade aktualisiert meine Play Framework Git repo clone von der alten Play-version 1.1 neu 1.2. Vielleicht sollte ich dies getan haben ... gestern, hmm.)
public String getAuthenticityToken() {
if (!data.containsKey(AT_KEY)) {
data.put(AT_KEY, Crypto.sign(UUID.randomUUID().toString()));
}
return data.get(AT_KEY);
}
Gut, dann warum haben Sie denn diese änderung?
Fand ich den commit:
[#669] Fix wieder und gelten für Flash und Fehler sowie
d6e5dc50ea11fa7ef626cbdf01631595cbdda54c
Vom Thema #669:
create session, nur wenn absolut notwendig
Ein session-cookie wird erstellt bei jeder Anforderung einer Ressource. spielen sollte nur eine session-cookie, wenn es wirklich die Daten in der session gespeichert.
So dass Sie mit einem zufälligen Wert, nicht der SID, da die SID noch nicht erstellt wurden. Auch das ist ein Grund, nicht zu verwenden, ein Derivat des SID als XSRF-token. Aber nicht klären, warum Sie unterschrieben/Hash die SID, in der Vergangenheit, wenn Sie wurden es zu benutzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erste, was zu sagen ist, dass Sie kann Wiederverwendung der session-ID als CSRF-token, sofern es Sie schützen wird, Sie fein gegen CSRF-Angriffe und erstellt nicht automatisch jede ernsthafte Sicherheitslücken. Aber für einigermaßen gute Gründe, OWASP ausdrücklich empfohlen, vor der es. (Sie muss jetzt nicht auf die Frage an alle.)
Das argument gegen die Wiederverwendung der session-ID als CSRF-token können wie folgt zusammengefasst werden (wichtige Punkte Fett, mit Begründung unter):
Die session-ID wird erworben durch einen Angreifer ist in der Regel eine ernsthafte Verletzung der Sicherheit, als das CSRF-token wird erworben durch einen Angreifer.
Alle, dass ein Angreifer von der CSRF-token (unter der Annahme, dass einige andere sichern Stück von Informationen, wie die session-ID, der bisher nicht wiederverwendet, da der CSRF-token) ist die Möglichkeit zum durchführen von CSRF-Angriffen. Dies gibt Ihnen zwei große Einschränkungen, dass Sie nicht haben, wenn Sie tatsächlich erworben wird eine session-ID:
Das CSRF-token ist möglicherweise einfacher für einen Angreifer zu erwerben, als die session-ID
<input>
element in einem<form>
. Session-cookies, auf der anderen Seite, kann geheim gehalten-auch vor dem hintergrund einer erfolgreichen XSS-Angriff mit dem HttpOnly-flag, fordern mehr up-front-Arbeit von einem Angreifer sinnvoll ausnutzen einer XSS-Schwachstelle.<form>
unterwirft), dann web server access logs werden in der Regel melden die CSRF-token, die auf GET-Anfragen (wie es ein Teil der URL). Damit ein Angreifer, der es schafft, Ansicht des access-log wäre in der Lage zu erwerben, viele CSRF-Token.Aber wenn Sie die Wiederverwendung der session-ID als CSRF-token, dann ist jeder Angriff, der es erlaubt, Sie zu erwerben, die CSRF-token automatisch gibt Ihnen die session-ID.
Daher sollten Sie nicht wieder, das CSRF-token als session-ID, da macht es die session ID anfälliger.
Um ehrlich zu sein, ich Art von, betrachten alles, was über mehr als eine theoretische Bedeutung als einen praktischen. Der schwache Punkt in der Argumentation ist Punkt 2; die einzige realistische Schwachstellen, die ich mir denken kann, dass könnte verwendet werden, für den Erwerb von CSRF-Token, nicht aber für den Erwerb von session-cookies sind immer noch wirklich ernsthafte Sicherheitslücken. Wenn Sie ein XSS-Loch auf Ihrer Website, oder ein Angreifer hat Zugriff auf Ihre freaking server-logs, die Chancen sind Sie haben vollkommen gefickt trotzdem. Und in den meisten Bibliotheken und internet-Cafés, die ich habe, die Mitarbeiter waren nicht die Sicherheit, know-how und es wäre ziemlich einfach zu installieren einen keylogger unerkannt und nur Ernte-Passwörter - es würde keine Notwendigkeit für einen Angreifer zu gehen, um den Aufwand zu warten, für Menschen, die Maschine zu benutzen und dann rippen Sie den Inhalt Ihres browser-Caches.
Jedoch, sofern die Umstände irgendwie machen es schwierig zu speichern ist eine zusätzliche random token zum CSRF-neben der zufällige session-ID, warum nicht einfach tun es trotzdem, für was auch immer bescheiden Sicherheit profitieren, gibt es Sie?
Einer reinen CSRF-Angriff keinen Zugriff auf die browser-cookies, also wenn Sie sagen, "Lauscher", das ist nur erreichbar, wenn Sie sniffing-Pakete (also kein SSL, öffentliches wifi).
Je nach Konfiguration kann das Spiel-Framework (ich bin nicht mit ihm vertraut, so nehmen Sie dies als Allgemeine web-app Beratung), die session-und authentifizierungscookies, die fast sicher gekennzeichnet werden HttpOnly, so dass Sie nicht in der Lage bist zu Lesen vom client über XSS.
Letztlich die Idee mit dem Synchronisier-token-Muster zum Schutz vor XSRF ist ein eindeutiger Wert (vorzugsweise kryptographisch starken), bekannt nur für den server und den client und einzigartig in dieser Sitzung. Basierend auf diesem Ziel, Play Framework zu tun scheint, gerade fein.
Vielleicht Spielen Framework nicht wollen, dass die SID im HTML-Code. Ein Endbenutzer, Bob, vielleicht laden Sie eine Web-Seite, und wenn es ein
<form>
in die Web-Seite, die SID enthalten sein würden, die in der heruntergeladenen HTML (wenn die SID selbst ist als XSRF-token). Wenn Bob dann seine E-Mails heruntergeladen Seite von Mallory, dann Mallory finden würde, der SID und könnte imitieren, Bob!?(Ein weiterer kleiner Grund, nicht zu verwenden SID: Wie ich bereits in meinem update, das SID vielleicht einfach nicht verfügbar. Vielleicht ist es erzeugt so spät wie möglich, um CPU-Ressourcen zu sparen.)