Wie ernst ist diese neue Sicherheitslücke in ASP.NET und wie kann ich sie umgehen?

189

Ich habe gerade im Internet über eine neu entdeckte Sicherheitslücke in ASP.NET gelesen. Die Details können Sie hier lesen.

Das Problem liegt in der Art und Weise, wie ASP.NET den AES-Verschlüsselungsalgorithmus implementiert, um die Integrität der Cookies zu schützen, die diese Anwendungen generieren, um Informationen während Benutzersitzungen zu speichern.

Das ist ein bisschen vage, aber hier ist ein erschreckenderer Teil:

Die erste Phase des Angriffs dauert einige tausend Anfragen, aber sobald er erfolgreich ist und der Angreifer die geheimen Schlüssel erhält, ist er völlig verstohlen. Die erforderlichen kryptografischen Kenntnisse sind sehr grundlegend.

Alles in allem bin ich mit dem Thema Sicherheit / Kryptographie nicht vertraut genug, um zu wissen, ob dies wirklich so ernst ist.

Sollten alle ASP.NET-Entwickler diese Technik fürchten, die jede ASP.NET-Website in Sekunden besitzen kann, oder was?

Wie wirkt sich dieses Problem auf den durchschnittlichen ASP.NET-Entwickler aus? Betrifft es uns überhaupt? Welche Konsequenzen hat diese Sicherheitsanfälligkeit im wirklichen Leben? Und schließlich: Gibt es eine Problemumgehung, die diese Sicherheitsanfälligkeit verhindert?

Danke für deine Antworten!


EDIT: Lassen Sie mich die Antworten zusammenfassen, die ich erhalten habe

Dies ist also im Grunde eine Art "Padding Orakel" -Angriff. @Sri lieferte eine großartige Erklärung, was diese Art von Angriff bedeutet. Hier ist ein schockierendes Video zu diesem Thema!

Über die Schwere dieser Sicherheitsanfälligkeit: Ja, es ist in der Tat schwerwiegend. Dadurch kann der Angreifer den Maschinenschlüssel einer Anwendung kennenlernen. So kann er einige sehr unerwünschte Dinge tun .

  • Im Besitz des Computerschlüssels der App kann der Angreifer Authentifizierungscookies entschlüsseln.
  • Schlimmer noch, er kann Authentifizierungs-Cookies mit dem Namen eines beliebigen Benutzers generieren . Somit kann er als jeder auf der Site erscheinen. Die Anwendung kann nicht zwischen Ihnen und dem Hacker unterscheiden, der ein Authentifizierungscookie mit Ihrem Namen für sich selbst generiert hat.
  • Außerdem kann er Sitzungscookies entschlüsseln (und auch generieren) , obwohl dies nicht so gefährlich ist wie das vorherige.
  • Nicht so ernst: Er kann den verschlüsselten ViewState von Seiten entschlüsseln. (Wenn Sie ViewState zum Speichern vertraulicher Daten verwenden, sollten Sie dies sowieso nicht tun!)
  • Ganz unerwartet : Mit Kenntnis des Maschinenschlüssels kann der Angreifer jede beliebige Datei von Ihrer Webanwendung herunterladen , auch solche, die normalerweise nicht heruntergeladen werden können! (Einschließlich Web.Config usw.)

Im Folgenden finden Sie eine Reihe bewährter Methoden, die das Problem nicht lösen, aber die allgemeine Sicherheit einer Webanwendung verbessern.

Konzentrieren wir uns nun auf dieses Thema.

Die Lösung

  • Aktivieren Sie customErrors und erstellen Sie eine einzelne Fehlerseite, auf die alle Fehler umgeleitet werden. Ja, sogar 404er . (ScottGu sagte, dass die Unterscheidung zwischen 404 und 500 für diesen Angriff wesentlich ist.) Auch in Ihren Application_Erroroder Error.aspxeinen Code einfügen, der eine zufällige Verzögerung verursacht. (Generieren Sie eine Zufallszahl und verwenden Sie Thread.Sleep, um so lange zu schlafen.) Dadurch kann der Angreifer nicht entscheiden, was genau auf Ihrem Server passiert ist.
  • Einige Leute empfahlen, wieder zu 3DES zu wechseln. Wenn Sie AES nicht verwenden, treten theoretisch keine Sicherheitslücken in der AES-Implementierung auf. Wie sich herausstellt, wird dies überhaupt nicht empfohlen .

Einige andere Gedanken

  • Es scheint, dass nicht jeder der Meinung ist, dass die Problemumgehung gut genug ist.

Vielen Dank an alle, die meine Frage beantwortet haben. Ich habe nicht nur über dieses Problem, sondern auch über die Web-Sicherheit im Allgemeinen viel gelernt. Ich habe die Antwort von @ Mikael als akzeptiert markiert, aber die anderen Antworten sind auch sehr nützlich.

Venemo
quelle
12
Venemo, kann ich nur sagen, dass ich nicht denke, dass dies ein guter Ort für diese Anfrage ist (nach den Antworten zu urteilen). Abstimmungen sind kein guter Weg, um diese Frage zu lösen. Sie müssen von einem Experten beantwortet werden (und Sie müssen kein Experte sein, um abstimmen zu können). Ich empfehle: mail-archive.com/[email protected]/maillist.html oder, wie unten erwähnt, den offiziellen Kommentar von Microsoft, der keine Fehlermeldungen an den Client senden soll. Dies ist der richtige Ansatz. Kein Downgrade auf 3DES. Es ist ein schockierender Rat.
Mittagsseide
3
@ RPM1984 - Ich stimme nicht zu. Hier gibt es viele brauchbare Antworten. @ Dan, warum?
Venemo
2
Okay, wir haben unterschiedliche Interpretationen einer Frage zu SO. Für mich, wenn es richtig beantwortet werden kann, dann gut. Die Antworten sind interessant / hilfreich, verstehen Sie mich nicht falsch, aber für mich ist dies ein Problem, bei dem die einzige "Antwort" eine Problemumgehung ist - bis MS einen Fix veröffentlicht. Für mich sollte dies ein Wiki sein.
RPM1984
4
Falls jemand zu diesem Thread zurückgekehrt ist, um nach dem Sicherheitsupdate zu suchen, befindet er sich unter microsoft.com/technet/security/bulletin/MS10-070.mspx (wählen Sie Ihr Betriebssystem und Ihre .NET-Version).
Andy

Antworten:

58

Was soll ich tun, um mich zu schützen?

[Update 29.09.2010]

Microsoft Security Bulletin

KB Artikel mit Bezug auf das Update

ScottGu hat Links für die Downloads

[Update 25.09.2010]

Während wir auf das Update warten, hat ScottGu gestern ein Update veröffentlicht, wie Sie einen zusätzlichen Schritt hinzufügen können, um Ihre Websites mit einer benutzerdefinierten URLScan-Regel zu schützen.


Stellen Sie grundsätzlich sicher, dass Sie eine benutzerdefinierte Fehlerseite bereitstellen, damit ein Angreifer keinen internen .NET-Fehlern ausgesetzt ist, die Sie im Release- / Produktionsmodus sowieso immer haben sollten.

Fügen Sie außerdem auf der Fehlerseite einen zufälligen Schlaf hinzu, um zu verhindern, dass der Angreifer die Antworten für hinzugefügte Angriffsinformationen zeitlich festlegt .

In der web.config

<configuration>
 <location allowOverride="false">
   <system.web>
     <customErrors mode="On" defaultRedirect="~/error.html" />
   </system.web>
 </location>
</configuration>

Dadurch wird jeder Fehler auf eine benutzerdefinierte Seite umgeleitet, die mit einem 200-Statuscode zurückgegeben wird. Auf diese Weise kann ein Angreifer den Fehlercode oder die Fehlerinformationen nicht nach Informationen durchsuchen, die für weitere Angriffe erforderlich sind.

Es ist auch sicher einzustellen customErrors mode="RemoteOnly", da dadurch "echte" Clients umgeleitet werden. Nur beim Surfen von localhost werden interne .NET-Fehler angezeigt.

Der wichtige Teil besteht darin, sicherzustellen, dass alle Fehler so konfiguriert sind, dass dieselbe Fehlerseite zurückgegeben wird. Dazu müssen Sie das defaultRedirectAttribut im <customErrors>Abschnitt explizit festlegen und sicherstellen, dass keine Statuscodes festgelegt sind.

Was auf dem Spiel steht?

Wenn es einem Angreifer gelingt, den genannten Exploit zu verwenden, kann er interne Dateien aus Ihrer Webanwendung herunterladen. In der Regel ist web.config ein Ziel und enthält möglicherweise vertrauliche Informationen wie Anmeldeinformationen in einer Datenbankverbindungszeichenfolge oder sogar einen Link zu einer automatisch ausgelegten SQL-Express-Datenbank, auf die niemand zugreifen soll. Wenn Sie jedoch die bewährten Methoden befolgen, verwenden Sie die geschützte Konfiguration , um alle vertraulichen Daten in Ihrer web.config zu verschlüsseln.

Links zu Referenzen

Lesen Sie den offiziellen Kommentar von Microsoft zur Sicherheitsanfälligkeit unter http://www.microsoft.com/technet/security/advisory/2416728.mspx . Insbesondere der Teil "Problemumgehung" für Implementierungsdetails zu diesem Problem.

Außerdem einige Informationen in ScottGus Blog, einschließlich eines Skripts zum Auffinden anfälliger ASP.Net-Apps auf Ihrem Webserver.

Eine Erklärung zu " Grundlegendes zum Auffüllen von Oracle-Angriffen" finden Sie in der Antwort von @ sri .


Kommentare zum Artikel:

Der Angriff, den Rizzo und Duong gegen ASP.NET-Apps implementiert haben, erfordert, dass die Krypto-Implementierung auf der Website über ein Orakel verfügt, das beim Senden von Chiffretext nicht nur den Text entschlüsselt, sondern dem Absender auch eine Nachricht darüber gibt, ob das Auffüllen im Chiffretext erfolgt ist gültig .

Wenn das Auffüllen ungültig ist, gibt ihm die Fehlermeldung, die der Absender erhält, einige Informationen darüber, wie der Entschlüsselungsprozess der Site funktioniert.

Damit der Angriff funktioniert, muss Folgendes zutreffen:

  • Ihre Anwendung muss eine Fehlermeldung über die Ungültigkeit der Auffüllung geben.
  • Jemand muss Ihre verschlüsselten Cookies oder Ihren Ansichtsstatus manipulieren

Wenn Sie also in Ihrer App lesbare Fehlermeldungen wie "Etwas ist schief gelaufen, versuchen Sie es erneut" zurückgeben , sollten Sie ziemlich sicher sein. Wenn Sie die Kommentare zum Artikel ein wenig lesen, erhalten Sie auch wertvolle Informationen.

  • Speichern Sie eine Sitzungs-ID im verschlüsselten Cookie
  • Speichern Sie die realen Daten im Sitzungsstatus (in einer Datenbank gespeichert)
  • Fügen Sie eine zufällige Wartezeit hinzu, wenn Benutzerinformationen falsch sind, bevor Sie den Fehler zurückgeben, damit Sie ihn nicht zeitlich festlegen können

Auf diese Weise kann ein entführtes Cookie nur zum Abrufen einer Sitzung verwendet werden, die höchstwahrscheinlich nicht mehr vorhanden oder ungültig ist.

Es wird interessant sein zu sehen, was auf der Ekoparty-Konferenz tatsächlich vorgestellt wird, aber im Moment mache ich mir keine allzu großen Sorgen um diese Sicherheitsanfälligkeit.

Mikael Svenson
quelle
1
@ Venemo. Istead of Response.Cookies.Add (neues HttpCookie ("Rolle", "Admin")); Sie würden tun: string sessionId = Guid.NewGuid (). ToString (); Session [sessionId] = "role = admin"; Response.Cookies.Add (neues HttpCookie ("s", sessionId)); und der Angriff ist anfällig dafür, den Zeitpunkt der Antworten zu messen, um die Krypto herauszufinden. Fügen Sie also am Ende einer Antwort einen Thread hinzu. Sleep (...) würde solche Timings verhindern. Was den Fehler betrifft, gehe ich davon aus (und bin fast sicher), dass es sich um einen App-Fehler handelt, aber ich muss diesen selbst testen. Wenn Sie also benutzerdefinierte Fehlerseiten haben, wird der Auffüllfehler nicht angezeigt.
Mikael Svenson
1
@ Mikikael, danke! Welchen Sinn hätte es überhaupt, Rollen in einem Cookie zu speichern? Bin ich sicher, wenn ich es benutze, Roles.AddUserToRole("Joe", "Admin")aber ich speichere es nie in einem Cookie?
Venemo
1
@Venemo: Lies meine Bearbeitung und den Link zum Blog-Beitrag. In der Regel speichern Formularanmeldeseiten die Rolle in einem Cookie. Wie @Aristos in seiner Antwort erwähnt, kann dies deaktiviert werden und sollte deaktiviert werden.
Mikael Svenson
5
Was in aller Welt ...; Führen Sie KEIN Downgrade auf 3DES durch, dies hilft überhaupt nicht und ist ein wirklich schlechter Rat.
Mittagsseide
2
@Mikael Sie können auch einen Link zu ScottGus Blog hinzufügen, der einige zusätzliche Informationen enthält: weblogs.asp.net/scottgu/archive/2010/09/18/…
Eilon
40

Grundlegendes zum Auffüllen von Oracle-Angriffen

Nehmen wir an, Ihre Anwendung akzeptiert eine verschlüsselte Zeichenfolge als Parameter - ob der Parameter ein Cookie, ein URL-Parameter oder etwas anderes ist, spielt keine Rolle. Wenn die Anwendung versucht, sie zu dekodieren, gibt es drei mögliche Ergebnisse:

  1. Ergebnis 1 : Die verschlüsselte Zeichenfolge wurde ordnungsgemäß entschlüsselt, und die Anwendung konnte einen Sinn daraus ziehen. Das heißt, wenn die verschlüsselte Zeichenfolge eine 10-stellige Kontonummer war, fand die Anwendung nach der Entschlüsselung etwas wie "1234567890" und nicht "abcd1213ef".

  2. Ergebnis 2 : Die Auffüllung war korrekt, aber nach der Entschlüsselung war die erhaltene Zeichenfolge Kauderwelsch, den die App nicht verstehen konnte. Beispielsweise wurde die Zeichenfolge in "abcd1213ef" entschlüsselt, aber die App erwartete nur Zahlen. Die meisten Apps zeigen eine Meldung wie "Ungültige Kontonummer" an.

  3. Ergebnis 3 : Das Auffüllen war falsch und die Anwendung hat eine Fehlermeldung ausgegeben. Die meisten Apps zeigen eine allgemeine Meldung wie "Es ist ein Fehler aufgetreten" an.

Damit ein Padding Oracle-Angriff erfolgreich ist, muss der Angreifer in der Lage sein, mehrere Tausend Anfragen zu stellen und die Antwort fehlerfrei in einen der oben genannten drei Buckets zu klassifizieren.

Wenn diese beiden Bedingungen erfüllt sind, kann der Angreifer die Nachricht eventuell entschlüsseln und sie dann nach Belieben erneut verschlüsseln. Es ist nur eine Frage der Zeit.

Was kann getan werden, um dies zu verhindern?

  1. Einfachste Sache - alles, was sensibel ist, sollte niemals verschlüsselt oder nicht verschlüsselt an den Client gesendet werden. Behalte es auf dem Server.

  2. Stellen Sie sicher, dass Ergebnis 2 und Ergebnis 3 in der obigen Liste für den Angreifer genau gleich sind . Es sollte keine Möglichkeit geben, voneinander zu unterscheiden. Dies ist jedoch nicht so einfach - ein Angreifer kann mithilfe einer Art Timing-Angriff unterscheiden.

  3. Verwenden Sie als letzte Verteidigungslinie eine Webanwendungs-Firewall. Der Padding-Orakel-Angriff muss mehrere Anforderungen stellen, die fast gleich aussehen (jeweils ein Bit ändern), damit eine WAF solche Anforderungen abfangen und blockieren kann.

PS Eine gute Erklärung zum Auffüllen von Oracle-Angriffen finden Sie in diesem Blog-Beitrag . Haftungsausschluss: Es ist NICHT mein Blog.

Sripathi Krishnan
quelle
+1 Tolle Erklärung, danke! Eine Frage: "Stellen Sie sicher, dass Ergebnis 2 und Ergebnis 3 in der obigen Liste für den Angreifer genau gleich sind." -> Wie kann ich dies in ASP.NET erreichen?
Venemo
3
Damit sie gleich aussehen, sollten Sie für Ergebnis 2 und 3 dieselbe Fehlermeldung ausgeben, was einen allgemeineren Fehler bedeutet. Auf diese Weise können sie nicht unterschieden werden. Ein guter Fehler könnte sein: "Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut". Der Nachteil könnte sein, dass Sie dem Benutzer weniger Informationsnachrichten geben.
Mikael Svenson
Wie können die Leute die web.config herunterladen?
Daniel Little
@Lavinski - Noch keine eindeutigen Informationen, aber es wird angenommen, dass Sie mit WebResource.axd web.config (und andere Ressourcen) herunterladen können, wenn Sie ihm den richtigen Schlüssel geben. Und um den Schlüssel zu generieren, braucht man das Polsterorakel.
Sripathi Krishnan
13

Nach dem, was ich bis jetzt gelesen habe ...

Der Angriff ermöglicht es jemandem, geräucherte Cookies zu entschlüsseln, die wertvolle Daten wie Bankguthaben enthalten können

Sie benötigen in jedem Fall das verschlüsselte Cookie eines Benutzers, der bereits angemeldet ist. Sie müssen auch Daten in Cookies finden - ich hoffe, dass Entwickler kritische Daten nicht in Cookies speichern :). Und es gibt eine Möglichkeit, die ich unten habe, damit asp.net keine Daten im Login-Cookie speichert.

Wie kann jemand das Cookie eines Benutzers erhalten, der online ist, wenn er die Browserdaten nicht in die Hände bekommt? Oder das IP-Paket schnüffeln?

Eine Möglichkeit, dies zu verhindern, besteht darin, Cookies nicht ohne SSL-Verschlüsselung transportieren zu lassen.

<httpCookies httpOnlyCookies="true" requireSSL="true" />

Eine weitere Maßnahme besteht darin, das Speichern von Rollen in Cookies zu verhindern.

<roleManager enabled="true" cacheRolesInCookie="false">

Was nun die Cookies betrifft, die für die regulären Seiten nicht sicher sind, müssen Sie genauer überlegen, was Sie Ihrem Benutzer überlassen haben und was nicht, wie Sie ihm vertrauen und welche zusätzlichen Überprüfungen Sie durchführen können (z. B. wenn Sie eine Änderung auf der IP sehen , vielleicht hör auf, ihm zu vertrauen, bis du dich von der Sicherheitsseite wieder anmeldest).

Referenz:
Kann ein Hacker einem Benutzer das Cookie stehlen und sich mit diesem Namen auf einer Website anmelden?

So überprüfen Sie, woher Angriffe kommen und geben keine Informationen zurück. Ich habe hier einen einfachen Weg geschrieben, um zu verhindern, dass das Auffüllen ungültig ist und gleichzeitig protokolliert wird, um Angreifer aufzuspüren: CryptographicException: Das Auffüllen ist ungültig und kann nicht entfernt werden, und die Überprüfung des Viewstate-MAC ist fehlgeschlagen

Um den Angreifer zu verfolgen, müssen Sie überprüfen, ob die Auffüllung ungültig ist. Mit einem einfachen Verfahren können Sie sie aufspüren und blockieren - sie benötigen einige Tausend Anrufe auf Ihrer Seite, um den Schlüssel zu finden!

Update 1.

Ich habe das Tool heruntergeladen, das davon ausgeht, dass es den SCHLÜSSEL findet und die Daten entschlüsselt, und wie gesagt, die Falle auf dem obigen Code, der den Ansichtsstatus überprüft . Von meinen Tests hat dieses Tool noch viel mehr zu beheben, zum Beispiel kann der Status der komprimierten Ansicht nicht so wie er ist und seinen Absturz bei meinen Tests scannen.

Wenn jemand versucht, dieses Tool oder diese Methode zu verwenden, kann der obige Code sie aufspüren und Sie können sie mit einfachem Code wie "Verhindern von Denial Of Service (DOS)" oder wie diesem Code zum Verhindern von Verweigerung von Ihrer Seite blockieren des Dienstes .

Update 2

Es scheint von dem, was ich bis jetzt gelesen habe, dass der einzige Gedanke, der es wirklich braucht, um keine Informationen über den Fehler zurückzugeben , und einfach eine benutzerdefinierte Fehlerseite zu platzieren und wenn Sie möchten, können Sie einfach eine zufällige Verzögerung für diese Seite erstellen.

Ein sehr interessantes Video zu diesem Thema.

All dies ist mehr Maß für mehr Schutz, aber nicht 100% notwendig für dieses spezielle Problem. Zum Beispiel ist die Verwendung von SSL-Cookies das Problem zu lösen, die Rollen in Cookies nicht zwischenzuspeichern. Es ist gut, keine großen Cookies zu senden und zurückzugewinnen und jemanden zu vermeiden, der bereit ist, den Code zu knacken, um einfach die Administratorrolle zu platzieren der Keks von ihm.

Der Viewstate-Track ist nur eine weitere Maßnahme, um einen Angriff zu finden.

Aristos
quelle
Aristos, das sieht also so ziemlich wie jede andere generische Methode aus, die auf dem Stehlen von Cookies basiert, oder? Warum sagen sie also, dass es sooo ernst ist?
Venemo
@Venemo, denn wenn sie diesen Schlüssel wirklich bekommen können, kann der Beitrag auf den Daten auf jeder Seite möglicherweise mehr Schaden anrichten, weil sie diese Sicherheit verletzen ... es ist ernst, aber es ist auch schwer bis unmöglich, zum nächsten Schritt überzugehen und real brechen Sie auf dem System. Zum Beispiel erlaubt diese Seite mypetfriend.gr SQL-Injection. Aber kannst du es brechen? auch wenn die sicherheit so niedrig ist?
Aristos
@Venemo Ich denke, die letzte Umgehung, die Sie speziell bei diesem Angriff verlangen, besteht darin, die Ips aufzuspüren und zu sperren, die das Produkt ungültiger machen als das normale! (und das ist, was ich in den nächsten Tagen reparieren werde) :)
Aristos
1
@Aristos - Ich habe Ihre Antwort auf die andere Frage gelesen, die Sie verlinkt haben. Es handelt sich jedoch um Viewstate. Da ich ASP.NET MVC verwende, verwende ich ViewState nicht. Und ich konnte es nicht herausfinden, wie sich diese Beschreibung auf dieses Sicherheitsproblem überträgt.
Venemo
@Venemo für MVC kann ich nicht sagen, weil ich es nicht weiß. Der ViewState ist der Teil, der angreift, um den Schlüssel zu finden. Wie MVC die Integrität der Seite verfolgt, weiß ich nicht.
Aristos
12

Hier ist die MS-Antwort. Alles läuft darauf hinaus, "eine benutzerdefinierte Fehlerseite zu verwenden", und Sie werden keine Hinweise preisgeben.

EDIT
Hier sind einige detailliertere Informationen von scottgu.

ScottS
quelle
Danke, das habe ich die ganze Zeit gefragt. Eine einfache benutzerdefinierte Fehlerseite kann mich also vor allen Auswirkungen dieser Sicherheitsanfälligkeit bewahren?
Venemo
2
@Venemo: Ja, und die Leute, die 3DES empfehlen, sollten wirklich zum Schweigen gebracht werden. Es ist unglaublich verantwortungslos und spricht nicht einmal das Hauptproblem an! Es ist ziemlich schockierend. Bitte, ich hoffe, niemand folgt ihrem Rat und tut, was Microsoft offiziell rät.
Mittagsseide
1
@Noon - Nun, diese Art von benutzerdefinierten Fehlerseiten ist ein Muss für jede Produktionsstätte. Wie sich herausstellt, ist dieses Problem doch nicht so schwerwiegend. :)
Venemo
12

Hinzufügen der Antworten von ScottGu aus der Diskussion unter http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx

Ist benutzerdefiniertes IHttpModule anstelle von customErrors betroffen?

F: Ich habe kein Element in meiner web.config deklariert, sondern ein IHttpModule im Abschnitt. Dieses Modul protokolliert den Fehler und leitet ihn entweder zu einer Suchseite (für 404) oder zu einer Fehlerseite (für 500) weiter. Bin ich verletzlich?

A: Ich würde empfehlen, das Modul vorübergehend zu aktualisieren, um immer zur Suchseite umzuleiten. Eine der Möglichkeiten, wie dieser Angriff funktioniert, besteht darin, nach einer Unterscheidung zwischen 404s und 500 Fehlern zu suchen. Es ist eine Möglichkeit, immer denselben HTTP-Code zurückzugeben und an denselben Ort zu senden, um ihn zu blockieren.

Beachten Sie, dass Sie dies nicht tun müssen, wenn der Patch veröffentlicht wird, um dies zu beheben (und zum alten Verhalten zurückkehren können). Aber im Moment würde ich Kunden empfehlen, nicht zwischen 404 und 500 zu unterscheiden.

Kann ich weiterhin verschiedene Fehler für 404- und 500-Fehler verwenden?

F: Ich gehe davon aus, dass zusätzlich zur Standardumleitung bei Fehlern noch eine benutzerdefinierte 404-Seite definiert werden kann, ohne die oben beschriebenen Prinzipien zu verletzen.

A: Nein - bis wir einen Patch für das eigentliche Update veröffentlichen, empfehlen wir die oben beschriebene Problemumgehung, die alle Fehler homogenisiert. Eine der Möglichkeiten, wie dieser Angriff funktioniert, besteht darin, nach einer Unterscheidung zwischen 404s und 500 Fehlern zu suchen. Es ist eine Möglichkeit, immer denselben HTTP-Code zurückzugeben und an denselben Ort zu senden, um ihn zu blockieren.

Beachten Sie, dass Sie dies nicht tun müssen, wenn der Patch veröffentlicht wird, um dies zu beheben (und zum alten Verhalten zurückkehren können). Im Moment sollten Sie jedoch nicht zwischen 404 und 500 für Kunden unterscheiden.

Wie ermöglicht dies die Belichtung von web.config?

F: Wie ermöglicht dies die Offenlegung von web.config? Dies scheint nur die Entschlüsselung von ViewState zu ermöglichen. Gibt es eine andere verwandte Sicherheitsanfälligkeit, die auch die Offenlegung von Informationen ermöglicht? Gibt es ein Whitepaper, in dem der Angriff detailliert beschrieben wird, um besser zu erklären, was vor sich geht?

A: Der in der Öffentlichkeit gezeigte Angriff basiert auf einer Funktion in ASP.NET, mit der Dateien (normalerweise Javascript und CSS) heruntergeladen werden können und die mit einem Schlüssel gesichert ist, der als Teil der Anforderung gesendet wird. Wenn Sie einen Schlüssel fälschen können, können Sie diese Funktion leider verwenden, um die Datei web.config einer Anwendung herunterzuladen (jedoch keine Dateien außerhalb der Anwendung). Wir werden natürlich einen Patch dafür veröffentlichen - bis dahin schließt die obige Problemumgehung den Angriffsvektor.

BEARBEITEN: Zusätzliche FAQ im zweiten Blogpost unter http://weblogs.asp.net/scottgu/archive/2010/09/20/frequently-asked-questions-about-the-asp-net-security-vulnerability.aspx

Martin Vobr
quelle
Die Antwort auf die zweite Frage endet mit zwei Sternchen. Soll irgendwo eine Fußnote oder ein Qualifikationstext hinzugefügt werden?
Scott Mitchell
@ Scott Mitchell: Nein, es ist nur mein Tippfehler. (Der Textteil war in der ersten Version des Beitrags fett gedruckt, und ich habe vergessen, den gesamten Formatierungscode zu entfernen, als der Text bearbeitet wurde.) Fest. Tut mir leid, dass ich dich irregeführt habe.
Martin Vobr
3

Einige wichtige Links:

[Um den Ernsthaftigkeitsaspekt zu beantworten (was veröffentlicht wurde und Problemumgehungen werden durch andere Antworten abgedeckt).]

Der angegriffene Schlüssel wird verwendet, um sowohl den Ansichtsstatus als auch Sitzungscookies zu schützen. Normalerweise wird dieser Schlüssel intern von ASP.NET mit jeder neuen Instanz der Webanwendung generiert. Dies begrenzt den Umfang des Schadens auf die Lebensdauer des Arbeitsprozesses. Bei einer geschäftigen Anwendung können dies natürlich Tage sein (dh keine große Begrenzung). Während dieser Zeit kann der Angreifer Werte in den ViewState ändern (oder einfügen) und ihre Sitzung ändern.

Noch ernsthafter ist es, wenn Sie möchten, dass Sitzungen die Lebensdauer von Arbeitsprozessen überbrücken oder Webfarmen zulassen (dh alle Instanzen in der Farm können jede Benutzersitzung verarbeiten), dass der Schlüssel fest codiert werden muss. Dies geschieht in web.config:

[...]
  <system.web>
    <machineKey
        decryption="AES"
        validation="SHA1"
        decryptionKey="57726C59BA73E8A4E95E47F4BC9FB2DD"
        validationKey="158B6D89EE90A814874F1B3129ED00FB8FD34DD3"
      />

Dies sind natürlich neu erstellte Schlüssel. Ich verwende die folgende PowerShell, um auf den kryptografischen Zufallszahlengenerator von Windows zuzugreifen:

$rng = New-Object "System.Security.Cryptography.RNGCryptoServiceProvider"
$bytes = [Array]::CreateInstance([byte], 20)
$rng.GetBytes($bytes)
$bytes | ForEach-Object -begin { $s = "" } -process { $s = $s + ("{0:X2}" -f $_) } -end { $s}

(Verwenden einer Array-Länge von 20 für die Validierung und 16 für die Entschlüsselungsschlüssel.)

Neben der Änderung der öffentlichen Fehlerseiten, um den spezifischen Fehler nicht zu verlieren, scheint es ein guter Zeitpunkt zu sein, die oben genannten Schlüssel zu ändern (oder Worker-Prozesse zu durchlaufen, wenn sie eine Weile ausgeführt wurden).

[Bearbeiten 21.09.2010: Links nach oben hinzugefügt]

Richard
quelle
Standardmäßig werden Worker-Prozesse nach 27 bis 29 Stunden (abhängig von Ihrer IIS-Version) recycelt, wenn sie so lange dauern. Sie sollten also auch tagelang keinen haben, selbst auf einer stark frequentierten Site.
Squig
2

Ich habe gerade meine vollständige Meinung dazu in meinem Blog veröffentlicht , nachdem ich zusätzliche Nachforschungen zu diesem Thema angestellt hatte. Ich denke, es ist wichtig herauszufinden, warum sie so weit kommen, ein Auth-Cookie zu fälschen.


Ich möchte nur einige Fakten klarstellen:

  1. Bei einem Angriff erhalten Sie den Maschinenschlüssel nicht direkt. Das heißt, es ist ziemlich ähnlich, da es erlaubt, die Nachrichten zu entschlüsseln und neue zu ändern / neu zu verschlüsseln.
  2. Die Art und Weise, wie die tatsächlichen Schlüssel abgerufen werden, besteht darin, ihre Fähigkeit zu nutzen, die Neuverschlüsselung wie in 1 zu ändern und die web.config abzurufen. Leider gibt es Gründe, warum einige diese Schlüssel auf Site-Ebene in die web.config einfügen (andere Diskussion), und im Beispielvideo profitieren sie davon, dass dies die Standardeinstellung von DotnetNuke ist.
  3. Um die web.config zu erhalten, weisen Sie darauf hin, dass sie webresources.axd und / oder scriptresources.axd verwenden. Ich dachte, diese funktionieren nur mit eingebetteten Ressourcen, aber es scheint, dass dies einfach nicht der Fall ist.
  4. Wenn es sich bei der App um asp.net MVC handelt, benötigen wir nicht wirklich webresources.axd und / oder scriptresources.axd, sodass diese deaktiviert werden können. Wir verwenden auch keinen Viewstate. Das heißt, es ist mir unklar, ob eine der anderen asp.net-Funktionen andere Informationen mit der Problemumgehung liefert, dh ich weiß nicht, ob das Auffüllen ungültige Fehlerergebnisse liefert, während das Auffüllen gültiger Ergebnisse im ignorierten Authentifizierungsticket (weiß nicht) ob dies der Fall ist oder nicht) ... die gleiche Analyse sollte für das Sitzungscookie gelten.
  5. Deaktivieren Sie die Rollen des asp.net-Mitgliedsanbieters in Cookies.

Ungefähr 1, afaik die verschlüsselten Nachrichten können nicht 100% willkürlich sein, um ein winziges Stück Müll irgendwo in der Nachricht zu tolerieren, da es 1 Block in der Nachricht gibt, der Wert entschlüsselt, der nicht gesteuert werden kann.

Abschließend möchte ich sagen, dass dieses Problem das Ergebnis von ms ist, die in diesem Fall nicht ihrer eigenen Anleitung folgen: Eine Funktion basiert darauf, dass etwas, das an den Client gesendet wird, manipulationssicher ist.


Mehr zu:

Ich weiß nicht, ob das Auffüllen fehlerhafte ungültige Ergebnisse liefert, während das Auffüllen gültiger Ergebnisse im ignorierten Authentifizierungsticket (weiß nicht, ob dies der Fall ist oder nicht) ... die gleiche Analyse sollte für das Sitzungscookie gelten.

Das Auth-Cookie ist signiert, und anhand der Informationen im Papier sollten sie kein signiertes Cookie generieren können, wenn sie nicht zu den eigentlichen Schlüsseln gelangen (wie im Video vor dem Fälschen des Auth-Cookies).

Wie Aristos erwähnt hat, ist die Sitzungs-ID im Cookie für die Benutzersitzung zufällig, sodass sie von einem Benutzer mit der Zielsicherheitsstufe abgehört und geknackt werden muss, während diese Sitzung aktiv ist. Selbst wenn Sie sich auf die Authentifizierung verlassen, um die Benutzervorgänge zuzuweisen / zu autorisieren, ist die Auswirkung minimal / hängt stark davon ab, wofür die Sitzung in dieser App verwendet wird.

eglasius
quelle