Passworte richtig hashen

TL;DR: Dieser Post setzt auf den vorherigen Post zu Lastpass auf und betrachtet die Fragen, die man sich als IT Betrieb dazu stellen sollte, wie man Passworte – generell Logindaten/Credentials – sicher ablegen kann: Welche Verfahren gibt es, welche sind zeitgemäß, und wie lange würde es heute wohl dauern bis Angreifer, die die komplette Logindatenbank stehlen konnten, die Daten entschlüsseln und für sich nutzbar machen können.

Der letzte Post über den Wechsel von Lasspass zu Bitwarden hat ein Thema gestreift, welches danach auch in Gesprächen unter Kollegen noch einmal vertieft wurde und mich schon früher beschäftigt hat:

Wie legt man als IT Betrieb die Passworte der eigenen Nutzer*innen so in den Systemen ab, dass sie möglichst (lange) sicher sind? Selbst im Falle eines Einbruchs in der Art, wie ihn Lastpass erfahren hat?

Es geht hier also um ein Szenario, bei dem Angreifer die gesamten Passworte bzw. Logincredentials abgreifen können, sei es aus den produktiven Systemen, oder wie bei Lastpass aus Backups. Und dann mit allen ihnen zur Verfügung stehenden Ressourcen versuchen können diese zu entschlüsseln.

Warum den Angreifern überhaupt Stolpersteine in den Weg legen?

Wenn Angreifer schon so tief in die Systeme vorgedrungen sind: Was macht es dann noch für einen Sinn sich Gedanken darüber zu machen, ob Passworte mehr oder weniger einfach zugänglich irgendwo herumliegen? Dafür gibt es mehrere Gründe:

  • In Szenarien wie bei Lastpass, bei denen die Daten aus Backups geholt wurden, sind die Angreifer nicht in die produktive Infrastruktur vorgedrungen (zumindest hofft man das). Gut gesicherte Passworte bringen hier die Angreifer zunächst nicht viel weiter
  • Selbst wenn Angreifer tiefer in die Systeme vorgedrungen sind haben sie vielleicht noch nicht die Zugänge, die sie brauchen um noch größeren Schaden anzurichten. Auch hier schützen nicht einfach zugängliche Passworte davor, dass es Angreifer zu leicht haben
  • Schließlich ist dies auch ein Schutz nach innen: Wenn es auch der IT Abteilung selbst nicht möglich ist Passworte im Klartext zu ermitteln kommt man gar nicht erst in die Versuchung risikoreiche ‚Abkürzungen‘ zu nehmen (‚Moment, ich suche Ihnen gerade Ihr vergessenes Passwort raus‘, ‚Wir können uns doch mal als meyer37 anmelden um zu prüfen, was genau bei dem Kollegen nicht funktioniert, dass machen wir immer so.‘, …)

Die Gründe, warum eine IT Abteilung manchmal gerne Passworte im Klartext hätte – z. B. um schwache Passworte zu finden, oder um sie in neu gegründete Systeme überführen zu können – müssen hier letztlich als nachrangig eingestuft werden.

Verschlüsseln oder hashen

Um Passworte nicht im Klartext abzulegen, aber vielleicht doch die Option zu behalten diesen Klartext verfügbar zu machen, könnte man die Passworte verschlüsseln, z. B. mit einem symmetrischen Verfahren wie AES. Im Fall eines Einbruchs in die eigenen IT Systeme besteht allerdings das Risiko, dass dann auch der oder die Schlüssel mit entwendet werden. Bei so einer Vorgehensweise müsste schon ein durchaus wesentlicher Aufwand betrieben werden um die Verschlüsselung selbst wieder sicher zu machen. So ist es den Angreifern beim Lastpass Hack gelungen die Schlüssel zu dem eigentlich verschlüsselten Backup zu erhalten.

Seit langen ist daher die Ablage von Passworten in Form eines Hashes Standard. Hier wird das Passwort unter Verwendung eines Hashfunktion in ein Format – den Hashwert – überführt, welches sich durch diese Eigenschaften auszeichnet:

  • Aus dem Hashwert lässt sich der Originalwert – hier das Passwort – nur sehr schwer wieder ermitteln, im Idealfall nicht viel schneller als durch Durchprobieren aller möglichen Eingaben
  • Der Hashwert hat immer ein identisches Format z. B. mit der gleiche Länge, unabhängig davon wie der Eingabewert war

Zwei klassische Hashfunktionen sind MD5 und SHA-1. Das sind Beispiele für Hashwerte:

EingabewertMD5 HashSHA-1 Hash
abc900150983cd24fb0d6963f7d28e17f72a9993e364706816aba3e25717850c26c9cd0d89d
Der Hashwert hat immer ein identischen Format wie die gleiche Länge, unabhängig davon wie lang der Eingabewert war78eb98ec466e8b9dfd1ffcac23ccd690b5447826036922409c4f77f50ead0432fb5da892
Beispiele für Hashing

Bei einem Loginvorgang werden dann die von Nutzer*innen eingegebenen Passworte erneut durch die Hashfunktion geschickt und dann dieses Ergebnis mit dem beim Setzen des Passwortes erzeugten Hash verglichen. Bei so einer Vorgehensweise braucht es keine geheimen Schlüssel oder dergleichen, der Hash an sich ist ’sicher‘ genug. Wenn er denn richtig gewählt wird und um das schon vorweg zu nehmen: MD5 und SHA-1 sind heute nicht mehr sicher genug! Aber dazu kommen wir gleich, zuerst noch zwei Kochzutaten:

Den Regenbogen versalzen (und pfeffern)

Die Eigenschaft von Hashfunktionen, für die gleiche Eingabe immer zum gleichen Hashwert zu führen, hat bei der Verwendung zur Passwortsicherung zwei Nachteile

  1. Es ist für einen Angreifer, der eine große Menge von gehashten Passworten erhalten hat, direkt erkennbar welche Nutzer*innen identische Passworte nutzen. Hier kann man also mit einem erfolgreich entschlüsselten Passwort gleich mehrere Konten übernehmen
  2. Die Arbeit des Passwortbrechens kann schon vor dem Angriff geleistet werden, in dem man lange im Voraus für riesige Mengen von möglichen Passworten die Hashwerte berechnet und dann nur noch in einer Tabelle – für die sogar eine besonders effiziente Struktur mit dem Namen Rainbow Table entwickelt wurde – nachsehen, welcher Hashwert zu welchem Passwort gehört

Es gibt aber ein einfaches Mittel um Angreifern zumindest diese Abkürzungen zu vermiesen: Bevor das Passwort in die Hashfunktion gesteckt wird vermischt man es noch mit einem zufälligen Wert, der für jedes Passwort individuell erzeugt wird. Erst die Kombination aus diesem Zufallswert – für den sich der Name Salt eingebürgert hat – und dem Passwort wird in die Hashfunktion gesteckt. In der Passwortverwaltung speichert man dann das Salt zusammen mit dem Hashwert, da es für die Überprüfung eines beim nächsten Login eingegebenen Passworts benötigt wird.

Der Angreifer muss dann die Hashwerte für das jeweilige Salt berechnen und wenn dies groß genug ist lohnt sich kein Rainbow Table, da dieser die Kombinationen von allen Salts – wirklich allen, wenn es ein echter Zufallswert ist – und möglichen bzw. wahrscheinlichen Passworten enthalten müsste. Jedes Passwort muss also einzeln und mit entsprechendem Rechenaufwand ermittelt werden.

Eine weitere Ergänzung kann dann ein Pepper-Wert sein: Dieser funktioniert ähnlich wie das Salt, er ist also ein zufälliger Wert, der mit dem Passwort vermengt wird, er wird aber nicht zusammen mit dem Passworthash abgelegt, sondern zum Beispiel in der Konfiguration des Servers, der die Loginvorgänge abwickelt. Er ist also für alle Passworte identisch.

Wann bringt dies einen Schutz? Wenn ausschließlich die Datenbank mit den hashten (und gesalzenen) Passworten abhanden gekommen ist, aber nicht die Serverkonfiguration mit dem Pepper, dann kann ein Angreifer mit diesen Daten nichts mehr anfangen, da ihm ein entscheidendes Geheimnis fehlt um zu überprüfen, ob er ein Passwort richtig geraten hat.

Falls hingegen die Daten der kompletten IT Landschaft gestohlen wurden ist es nur eine Frage der Komplexität dieser Landschaft, ob es Angreifern gelingt zu verstehen wie das Ganze funktioniert und wo der Pfeffer wächst.

Gutes Hashen, schlechtes Hashen

Es gibt eine große Anzahl von Hashfunktionen und nicht alle sind gleich gut geeignet für die Erzeugung von Passworthashes. Tatsächlich sind die oben genannten Funktionen MD5 und SHA-1 nach heutigem Stand überhaupt nicht mehr geeignet, wie sich später in den Abschätzungen für die Entschlüsselungsdauern zeigen wird.

Warum sind sie nicht geeignet? Dieses Hashes wurden für andere Zwecke entwickelt und zwar zur Prüfung ob Dokumente bzw. Datenpakete unverändert sind. In dem ich ein PDF oder ein Softwarepaket durch so eine Hashfunktion schicke kann ich den erhaltenen Wert zur Prüfung mitgeben, ob das Dokument noch so ist, wie es ursprünglich einmal erzeugt oder verschickt wurde. Alle großen Softwarepakete – hoffe ich jedenfalls – bieten auf ihren Downloadseiten auch die Prüfsummen (Hashwerte) an – die der Hersteller selbst ermittelt hat. Wer es ganz genau nimmt erzeugt diese Prüfsumme nach dem Download auf seinem Rechner dann selbst und vergleicht. Nur wenn die Werte Zeichen für Zeichen übereinstimmen kann man sicher sein, dass die Datei noch so ist, wie sie vom Ersteller einmal produziert wurde.

Bei diesen Nutzungen von Hashfunktionen kommt es auf zwei Dinge an: Es muss sehr schwer sein für eine gegebene Prüfsumme ein anderes – gefälschtes – Dokument zu erzeugen, welches die gleiche Prüfsumme ergibt. Und zweitens: Performance. Diese klassischen Hashverfahren sollen möglich wenig Rechenzeit verbrauchen, damit sie auch bei hohen Durchsatzraten einsetzbar sind.

Performance ist genau das, was wir bei Passworthashes nicht wollen!

Die Möglichkeit eine Hashfunktion schnell auszuführen spielt beim Loginvorgang nur eine begrenzte Rolle, ob unsere Nutzer*innen bei diesem Schritt eine Sekunde warten müssen oder nicht werden sie kaum bemerken bzw. es bei diesem seltenen Vorgang akzeptieren. Für einen Angreifer, der Milliarden von Passworthashes erzeugen muss, macht es hingegen einen riesigen Unterschied, ob ein Hash sich in einer Microsekunde berechnen lässt, oder in einer Millisekunde.

Es gibt dabei die grundlegende Schwierigkeit, dass unsere eigenen Server, die die Logins verarbeiten und den Passworthash dabei erzeugen müssen, nicht so performant sein werden wie die spezialisierte Hardware, die Angreifer ggf. ins Feld führen können. Wir müssen also generell in Kauf nehmen, dass Angreifer in der Lage sein werden viel schneller Hashes zu erzeugen als wir selbst. Die Frage ist nur, wie viel schneller?

Die klassischen, performanten Hashfunktionen wie die SHA-2 Familie lassen sich eigentlich nur auf eine Weise für Passworthashes einsetzen: Durch Erhöhung der Rundenzahl. Damit ist gemeint, dass man den aus dem Passwort (und Salt und Pepper) berechneten Hash erneut in die Hashfunktion steckt. In dem Post zu Lastpass steckt dieser Aspekt in der Frage wie viele Runden im PBKDF2-Verfahren gemacht werden sollten. Hier geht es also ggf. um Millionen von Runden, bei denen der Hashwert immer wieder neu berechnet wird. Für ein produktives Loginsystem sind dabei vermutlich noch viel höhere Werte möglich, da man im Gegensatz zu einem Passwortmanager keine Rücksicht auf ggf. leistungsschwächere Smartphoneprozessoren nehmen muss.

Trotzdem bleibt hier das Grundproblem, dass eine Funktion verwendet wird, die letztlich performant sein soll. Aber es gibt heute Alternativen:

Unperformante Hashfunktionen: Bcyrpt, scrypt und Argon2

Das Design einer Hashfunktion, die eine ’schlechte‘ Performance zeigen soll, hat ihre eigene Komplexität und hier hat es immer neue Entwicklungen gegeben. Diese Funktionen sollen generell solche Eigenschaften haben:

  1. Sie müssen natürlich die gleichen Eigenschaften einer Hashfunktion haben, die zuvor genannt wurden
  2. Es soll auch mit spezialisierter Hardware nicht dramatisch viel einfacher sein diese Funktionen auszuführen als mit Standardhardware
  3. Im Algorithmus sind ‚Stellschrauben‘ vorhanden, die es erlauben den Rechenaufwand und bei neueren Funktionen auch den Speicherbedarf einzustellen. Je nach Verfahren in Abhängigkeit voneinander oder auch nicht
  4. Seitenkanalattacken sollen möglichst schwierig sein. Also Wege, bei denen sich z. B. über die Laufzeit des Algorithmus oder den Stromverbrauch der Hardware Informationen über das verarbeitete Passwort gewinnen lassen

Das sind die heute relevantesten Verfahren in der chronologischen Reihenfolge:

bcrypt

Diese Funktion wurde schon 1999 vorgestellt und verbessert die Passwortsicherheit im Vergleich zu den schnellen Hashes bereits deutlich. Sie verfügt über einen einstellbaren Kostenfaktor, den man an die Leistungsfähigkeit der eigenen Loginserver anpassen kann, um so einen Mittelweg zwischen der Wartezeite für die eigenen Nutzer*innen zu finden und dem Aufwand für Angreifer.

Bcrypt hat aus heutiger Sicht das Ziel nicht vollständig erreicht auch mit spezieller Hardware nicht deutlich schneller ausgeführt werden zu können: Gerade der eher geringe Speicherbedarf ermöglicht eine massive Parallelisierung der Hashwertberechnungen.

scrypt

Diese ca. 10 Jahre nach bcrypt vorgestellte Funktion ist bewusst mit einem ‚hohen‘, nicht reduzierbarem Speicherbedarf konzipiert worden. Dies verhindert den Einsatz von günstiger Hardware für massenhafte Berechnungen deutlich, während die eigenen Server damit normalerweise kein Problem haben.

Es kann sowohl der Rechnenzeit- wie auch der Speicherbedarf eingestellt werden, allerdings nicht unabhängig voneinander. Trotzdem gibt es Untersuchungen, bei denen scrypt in bestimmten Parametersetzungen schlechter – also effizienter ausführbar – abschneidet, als bcrypt. Auch gilt es aus kryptographischer Sicht immer noch als ‚junges‘ Verfahren und löst daher manchmal die Sorge aus, dass es vielleicht noch nicht erkannte Probleme hat.

Argon2

Dieses erstmals in 2014 vorgestellt Verfahren, welches dann noch Weiterentwicklungen erfahren hat, gewann in 2015 die sogn. Password Hashing Competition. Generell ist es damit das aktuellste der drei hier genannten Verfahren, mit den Vor- und Nachteilen, die das mit sich bringt:

Argon2 ist am flexibelsten bei den Einstellungen für Rechenzeit und Speicherbedarf und in Kenntnis der durch spezialisierte Hardware verfügbaren Rechenleistung entwickelt worden. Auf der anderen Seite in kryptographischer Sicht noch jünger und damit potentiell angreifbarer.

In OWASP Password Storage Cheatsheet werden konkrete Empfehlungen für die Parametrisierung dieser Funktionen gegeben.

Wie schnell lassen sich Passworte heute cracken

Es gibt Videos wie dieses, in dem man sich anschauen kann wie man hashcat, ein beliebtes ‚password recovery‘ Tool, einfach an den Start bringt. Aber die Rechenleistung des eigenen Rechners vermittelt einem nur ein ungenügendes Bild davon, was Angreifern potentiell zur Verfügung steht. Interessanter ist da der jährliche Password Table von Hive Systems (nicht zu verwechseln mit der Hive Ransomware Gruppe). Die folgenden Graphiken und Zahlen stammen aus dem Bericht 2022.

Hive Systems hat jeweils ermittelt wie viele Hashes in unterschiedlichen Hashverfahren mit damals verfügbaren Graphikkarten pro Sekunde berechnet werden können und auf dieser Basis geschätzt, wie lange es dauern würde die Hashes für alle denkbaren Passworte einer bestimmten Länge und Zusammensetzung zu berechnen. Und sie haben auch gleich verglichen welche Rechenleistung in der Cloud verfügbar wäre! Es gibt z. B. von Amazon kleine GPU Cluster, die man für überschaubare Kosten mieten kann.

Diese Graphik zeigt die Crackingdauern für Passworte im MD5 Hash mit dem größten damals in der Amazon Cloud verfügbaren Cluster mit 8 GPUs. Während die getestete Graphikkarte auf ca. 70 Milliarden MD5 Hashes pro Sekunde kommt, ist der Cluster in der Cloud in der Lage mehr als 500 Milliarden Hashes zu berechnen. Damit kommt Hive auf diese Tabelle:

Dauer zum Cracken von MD5 gehashten Passworten in der Amazon Cloud. Quelle: Hive Systems

Ein 8 Zeichen langes Passwort – wohlgemerkt jedes 8 Zeichen lange Passwort! – kann also in der Cloud in weniger als einer Stunde errechnet werden. Wenn man bedenkt, dass die meisten von uns keine wirklich zufälligen Passworte verwenden mit Groß- und Kleinschreibung und Zahlen und weiteren Zeichen, wird es meist noch viel schneller gehen. Daher sind auch Passworte mit mindestens 12 Zeichen, wie sie das BSI aktuell empfiehlt, nicht lange sicher, wenn sie als MD5 Hash gespeichert werden.

Der Artikel von Hive vergleicht dabei die in 2022 aktuellen Zahlen mit der vorherigen Auswertung in 2020. Und kann deutliche Rechenleistungssteigerungen zeigen. Ein Passwort, dass heute noch 5 Jahre zur Ermittlung brauchen würde, ist daher in einem Jahr vielleicht schon in der Hälfte der Zeit knackbar.

Und letztlich sind diese Zahlen bzw. die hier eingesetzte Hardware keine Obergrenze: Es gibt spezielle Hardware mit deutlich mehr Leistung und Software wie die von Elcomsoft, die in der Lage ist die Arbeit auf zehntausende von Rechnern zu verteilen.

In den weiteren Auswertungen zeigt sich dann der Vorteil von bcrypt. Diese Graphik basiert auf dem gleichen Hardwareszenario, nur dieses Mal mit bcrypt Hashes:

Dauer zum Cracken von bcrypt gehashten Passworten in der Amazon Cloud. Quelle: Hive Systems

Mit bcrypt ist die Anzahl der Hashes pro Sekunde im Amazon GPU Cluster auf eine Million zurückgefallen. Es geht aus dem Artikel leider nicht hervor, mit welchem Kostenfaktor die Hashes erzeugt wurden. Da die Erhöhung des Kostenfaktors um 1 die Rechenzeit für einen Hash in etwa verdoppelt ist es ein deutlicher Unterschied, ob der Faktor 1 oder 15 war.

In dieser Konstellation müssen Angreiferdeutlich mehr Hardware einsetzen, oder gut darin sein den Suchraum einzugrenzen, um in vernünftiger Zeit zu einem Erfolg zu kommen. Auch wenn bcrypt heute nicht mehr als das modernste Verfahren gilt, ist es weiterhin in der Lage Angriffe auf Passworthashes deutlich zu verlangsamen.

Und trotzdem: Es kommt weiterhin auf die Passwortqualität an

Man sieht an den Auswertungen deutlich, welche Verantwortung als IT Betrieb man bei der sicheren Ablage von Logindaten hat. Aber man sieht auch: Wenn die verwendeten Passworte schlecht sind – zu kurz, zu einfach, in vielen anderen Diensten verwendet – nutzt auch das beste Hashverfahren nichts.

Eine Absicherung der Infrastruktur muss also auf allen Ebenen zugleich erfolgen, damit sie auch in dem hier beschriebenen Szenario wirksam werden kann. Und eine 2-Faktor-Authentifizierung kann helfen den unmittelbaren Schaden eines Verlusts der Passworte zu begrenzen. Sofern die dafür notwendigen Geheimnisse nicht gleich mit gestohlen wurden.

Passwortmanager: Von Lastpass zu Bitwarden

TL;DR: In diesem Text geht es um meinen Wechsel des Passwortmanagers, nachdem sich Lastpass als zu unzuverlässig erwiesen hat. Vorangestellt werden ein paar Überlegungen dazu, warum man eigentlich einen Passwortmanager braucht und wie man ihn sicher nutzt. Abschließend geht es um die Frage, wie mit dem Datenverlust bei Lastpass umzugehen ist: Muss ich jetzt alle meine Passworte ändern?

Eine der wesentlichen Regeln der Passwortsicherheit ist die Verwendung von individuellen Logins für jeden Dienst und Zweck. Angesichts immer wiederkehrender Verluste von Logindaten bei erfolgreichen Angriffen auf Webdienste kann man nur so den Schaden auf den jeweiligen Dienst begrenzt halten. Es nutzt nichts ein einzelnes, super sicheres Passwort zu haben, welches man immer verwendet. Denn schon ein erfolgreicher Einbruch bei einem einzigen der Dienste, bei denen man das Passwort verwendet, wird dazu führen, dass die Angreifer danach auch die anderen Dienste mit den so gewonnenen Logindaten erfolgreich angreifen. Diese Art des Angriffs ist so häufig, dass sie einen eigenen Namen bekommen hat: Credential stuffing

Auch 2-Faktor-Authentifizierungen ändern daran erst einmal nicht grundsätzlich etwas, und bis wir überall Passkeys einsetzen und keine Passworte mehr brauchen wird es noch etwas dauern.

Ein Passwortmanager ist unverzichtbar

Zwar kann man so eine Vorgehensweise auch ohne digitale Unterstützung umsetzen, entweder mit einem Notizbuch für die Passworte, oder durch Schemata, bei denen man ein komplexes Grundpasswort nach eigenen Regeln jeweils individualisiert, aber die Verwendung eines Passwortmanagers macht diese Vorgehensweise erst in einer Weise handhabbar, die den digitalen Lebenswandel und Arbeitsalltag nicht so sehr erschwert, dass es nicht mehr praktikabel ist.

Auch bieten die gängigen Passwortmanager einige Vorteile im Vergleich zu manuellen Lösungen:

  • Generierung von Passworten: Es gibt üblicherweise Funktionen, um sich lange und zufällige Passworte mit vielen Zeichenvariationen mit einem Klick zu erzeugen. Zufällig generierte Passworte bieten den höchsten Schutz gegen Passwortrateversuche, selbst wenn Angreifer dabei sehr viel Zeit und sehr viel Rechenleistung zur Verfügung steht
  • Umgang mit sehr langen Passworten: Der Passwortmanager nimmt einem eventuell noch vorhandene Hemmungen sehr lange Passworte zu verwenden. Also Passworte mit Längen jenseits von 30 Zeichen, die man bei einer manuellen Handhabung wohl eher scheut
  • Schutz vor homographischen Angriffen: Wenn der Passwortmanager verwendet wird zum automatischen Ausfüllen von Logins in Webseiten kann man auf diese Art von Angriffen – bei denen sehr ähnliche oder gar völlig identisch aussehende Webadressen verwendet werden – nicht hereinfallen. Bzw. muss dann als Nutzer*in selbst aktiv die Logindaten eingeben und könnte sich bei der Gelegenheit wundern, warum der Passwortmanager das nicht tut

Aber es gibt natürlich auch Nachteile, gerade wenn es um die ganz besonders bequemen Passwortmanager mit einer Synchronisierung über die Cloud geht. Da heute nahezu jede*r mindestens 2 Geräte haben wird, auf denen man sich irgendwo einloggen will, muss man in der Lage sein die Inhalte des Passwortmanagers – nennen wir ihn den ‚Tresor‘ – sicher zwischen diesen Geräte zu transportieren.

Das kann man selbst machen, aber das ist mit einem gewissen Aufwand verbunden und braucht eine hohe Sorgfalt, damit keine Fehler beim Umgang mit diesen kritischen Daten passieren. Es gibt aber inzwischen eine Reihe von Anbietern, die die Passwortmanagerinhalte über die Cloud synchronisieren und dabei vor allem dies versprechen:

Zero Knowledge Architekturen

Mit dem ‚Null Wissen‘ ist dabei gemeint, dass der Anbieter des Passwortmanagers zwar die Inhalte in der Cloud speichert und so zwischen den Geräten synchronisieren kann, aber nicht in der Lage ist die Inhalte selbst zu sehen bzw. zu entschlüsseln. Das ist durch eine entsprechende Programmierung der Passwortmanagersoftware möglich, da die Entschlüsselung letztlich nur auf den Geräten der Nutzer*innen – also lokal und nicht in der Cloud – stattfinden muss.

Auf diese Weise lassen sich zwei Probleme lösen:

  1. Wie viel Vertrauen brauche ich in meinen Passwortmanageranbieter? Je weniger der Anbieter von meinen Daten sehen kann, desto weniger Vertrauen muss ich zu ihm haben. Ganz ohne Vertrauen geht es natürlich nicht: Da meist die Passwortmanagersoftware vom gleichen Anbieter kommt wie die Cloudsoftware, die die Daten synchronisiert, muss ich darauf vertrauen, dass die Software nicht doch mein Passwort direkt in die Cloud schickt. Oder die Inhalte meines Passworttresors im Klartext
  2. Was passiert, wenn meine ganzer Passwortschatz abhanden kommt? Da der Passwortmanager, wenn er richtig genutzt wird, der Schlüssel zum gesamten digitalen Leben ist, kann er in den falschen Händen maximalen Schaden anrichten. Dabei kann er sowohl vom eigenen Gerät entwendet werden, wie auch aus der Infrastruktur des Anbieters. Erfolgreiche Angriffe auf Clouddienste sind keine Seltenheit, dabei trifft es alle Ebenen: Vom grundlegenden Cloudserviceanbieter (Beispiel Rackspace) über die Softwareentwicklungsinfrastruktur (Beispiel Circle CI) bis hin zum IT Sicherheitsdienstleister selbst (Beispiel Okta). Im Idealfall könnte ich meinen verschlüsselten Passworttresor auch frei ins Internet stellen und niemand könnte mit einem vernünftigen Ressourceneinsatz meine Passworte daraus extrahieren, so dass ich mir selbst im Fall eines erfolgreichen Angriffs auf meinen Dienstleister keine (großen) Sorgen machen muss

‚Das letzte Passwort, das Sie jemals brauchen werden‘

Der Schutz des Passworttresors und seiner wichtigen Inhalte hängt nun von einer einzige Sache ab: Dem Passwort, welches man für den Passwortmanager verwendet. Dieses Passwort wird verwendet um den Tresor zu verschlüsseln und dann auch wieder zu ‚öffnen‘. Wer es besitzt hat damit die komplette Kontrolle über alle im Tresor gespeicherten Logindaten.

Im Idealfall ist es dann das ‚letzte‘ Passwort, welches man in dem Sinne braucht, dass man es sich merken und manuell eintragen muss. Produkte wie Lastpass oder 1Password verdanken dieser Idee ihre Namen. Oft wird dieses Passwort als das Masterpasswort bezeichnet

Da man dieses Passwort häufig benötigt um den Tresor zu entsperren ist es praktisch es sich merken zu können und so kann man ausgerechnet beim wichtigsten Passwort von allen kaum auf ein langes, zufällig generiertes Passwort setzen. Sondern muss sich für eine Vorgehensweise entscheiden um ein Passwort zu finden, welches auch in dem Fall, dass der damit verschlüsselte Tresor Angreifern in die Hände fällt, für eine ‚vernünftige‘ Zeit vermutlich nicht knackbar ist.

XKCD 936: Password strength

Die Ratschläge wechseln dabei mit der Zeit, die Vorgehensweise oben im Comic scheint heute immer noch aktuell, nur sind 4 Worte wohl nicht mehr genug. Hier ein paar Links dazu:

  • Tipps vom BSI – Wobei die Aussage, dass ein ‚gutes Passwort‘ mehr als 8 Zeichen haben sollte, für ein Masterpasswort viel zu schwach ist. Hier sollte man schon etwas jenseits von 15 Zeichen haben, besser noch mehr
  • Bitwardens Passwortstärkeprüfung: Diese Seite gibt einem ein Feedback dazu, wie sicher ein Passwort vermutlich ist. Hier kann man ein Gefühl dafür bekommen, wie Länge und verwendete Zeichenarten die Komplexität beeinflussen, und die steht wiederum im direkten Verhältnis zum Aufwand, den potentielle Angreifer zum Erraten betreiben müssen
  • Password Haystack von GRC: Diese etwas nerdige Seite von Steve Gibson (vom Security Now Podcast) kann einem ebenfalls ein Gefühl dafür geben, wie komplex ein Passwort ist und wie sich die Länge und weitere Zeichenklassen (Groß- und Kleinschreibung, Zahlen, …) auf die Anzahl der Passwortkombinationen auswirken, die ein Angreifer durchtesten müsste. Das ist kein völlig korrektes Maß für die sogenannte Entropie eines Passworts und die Zeiten, die dort prognostiziert werden um ein Passwort zu brechen, sind nicht mehr realistisch angesichts heute verfügbarer Hardware. Trotzdem vermittelt es einem ein Bild davon, wie sich Komplexität erzeugen lässt. So ist ein Passwort, in dem man irgendwo zehn ‚.‘ oder ähnliches eingefügt hat und welches dadurch auf eine enorme Länge kommt durchaus für Angreifer, die davon nichts ahnen, sehr schwer zu erraten
  • Have i been pwnd: Hier kann man prüfen, ob ein Passwort schon einmal in gehackten Konten vorkam. So ein Passwort sollte man in keinem Fall mehr verwenden

Generelle Hinweise:

  • Das Masterpasswort sollte keins sein, welches man vorher schon irgendwo verwendet hat. Und man sollte es dann auch für keinen anderen Zweck verwenden
  • Es gibt keinen Grund das Passwort regelmäßig zu ändern, es sei denn man möchte es noch länger / komplexer machen
  • Das Masterpasswort sollte man sich ggf. aufschreiben und an einem sicheren Ort verwahren. Gerade ein kompliziertes Passwort vergisst man nach einem langen Urlaub auch schon mal
  • Man sollte das Masterpasswort nur auf Geräten eintragen, die vertrauenswürdig sind. Vertrauenswürdig ist zum Beispiel sicher nicht ein Internetcafé am Urlaubsort, aber ggf. auch keine Geräte von Bekannten oder Freunden. Es ist für Besitzer*innen fremder Geräte einfach zu leicht eine Tastatureingabe mitzuschneiden und so an das Passwort zu kommen

Das Versagen von Lastpass

Ich habe mich vor Jahren für Lastpass als meinen cloud-basierten Passwortmanager entschieden und eine der kostenpflichtigen Optionen gewählt. Auf dieses Produkt bin ich denke ich durch den Security Now Podcast aufmerksam geworden, der ursprüngliche Entwickler von Lastpass hat sein Produkt damals für Steve Gibson geöffnet und dieser hat einen Review des Konzepts gemacht, welches zu dieser Zeit State of the art war. In den folgenden Jahren wurde Lastpass aufgekauft und der ursprüngliche Entwickler hat das Unternehmen schon lange verlassen. Aber aus Nutzersicht war und ist es ein Produkt, welches seine Aufgabe im Webbrowser und auf Android und iOS problemlos erledigt.

Auf Grund der Zero Knowledge Architektur war dann auch die Meldung von Lastpass Anfang Dezember 2022 (inzwischen aktualisiert) über einen Sicherheitsvorfall, bei dem die verschlüsselten Passworttresore gestohlen wurden, zunächst ärgerlich, aber noch nicht sehr besorgniserregend:

The threat actor was also able to copy a backup of customer vault data from the encrypted storage container which is stored in a proprietary binary format that contains both unencrypted data, such as website URLs, as well as fully-encrypted sensitive fields such as website usernames and passwords, secure notes, and form-filled data. 

Quelle Lastpass Blog

Natürlich ist der Verlust der Informationen dazu, welche Webseiten ich nutze, schon ein durchaus heftiges Datenschutzproblem und eine ideale Grundlage für Phishingangriffe. Trotzdem war der Stand zunächst der, dass durch die Art und Weise, wie aus dem Masterpasswort die Verschlüsselung generiert wird, die wirklich wichtigen Daten geschützt sind. Der Blogeintrag bestärkt diesen Eindruck noch:

To further increase the security of your master password, LastPass utilizes a stronger-than-typical implementation of 100,100 iterations of the Password-Based Key Derivation Function (PBKDF2), a password-strengthening algorithm that makes it difficult to guess your master password. You can check the current number of PBKDF2 iterations for your LastPass account here

Quelle Lastpass Blog

Nun kommen aber die Erkenntnisse ins Spiel, die im Verlauf dieser Security Now Episoden stückweise ans Tageslicht kamen:

Das sind für mich insbesondere diese Punkte:

  1. PBKDF2 Iterationen: 5000! Der Schutz meiner von Lastpass gestohlenen Daten hängt nur daran, dass Angreifer mein Masterpasswort nicht knacken. Mein Passwort ist deutlich länger als die von Lastpass zu diesem Zeitpunkt empfohlenen 12 Zeichen. Aber Lastpass selbst kann die Sicherheit sehr einfach durch die Anzahl der Iterationen erhöhen, die beim PBKDF2 Verfahren verwendet werden. Und hier ist es eine schlichte Lüge, dass hier mehr als 100.000 Iterationen verwendet werden. Bei mir waren nur 5.000 eingestellt, da ich ein langjähriger Nutzer bin und offenbar noch die Einstellung habe, die bei meiner ersten Nutzung von Lastpass aktuell war. In der 905er Episode behandelt Steve Fälle, bei denen es gar nur 1 Iteration war! Wieso hat Lastpass uns bisher treue Altnutzer nicht automatisch umgestellt? Als ich das manuell gemacht habe musste ich mich einmal neu einloggen und ein paar Sekunden warten, dann war das erledigt. Das hätte Lastpass in den letzten Jahren einfach mal automatisch tun können
  2. ECB verschlüsselte Passworte: In alten Versionen von Lastpass wurden Passworte nach dem ECB Verfahren verschlüsselt. Auch wenn das eine sichere Verschüsselung ist hat sie den Nachteil, dass die gleiche Eingabe immer das gleiche Ergebnis erzeugt. Es ist also in den verschlüsselten Daten einfach erkennbar, wenn jemand ein Passwort mehrfach verwendet hat. Später hat Lastpass auf das CBC Verfahren umgestellt, welches dieses Problem nicht hat. Es aber auch hier versäumt die Altdaten komplett umzustellen. In dem Lastpass Extrakt, den man sich nach dem in Folge 904 vorgestellten Verfahren herausziehen kann, finde ich zahlreiche ECB-kodierte Passworte
  3. Kein Zwang zu guten Masterpassworten: Das Problem betrifft mich nicht, aber offenbar hat Lastpass nie seine eigene Vorgabe durchgesetzt mindestens 12 Zeichen lange Passworte zu verwenden. Sie haben ihre Nutzer*innen damit in unverantwortlicher Weise sich selbst überlassen
  4. Herunterspielen der Menge an unverschlüsselten Daten: Es scheint, also enthalte der gestohlene Datensatz eine Menge an unverschlüsselten Informationen, die Lastpass für den Betrieb seiner Services nicht benötigt. Diese Daten sind nun direkt für die Angreifer auswertbar und helfen ihnen mindestens bei der Priorisierung welche Passworte sie ggf. zuerst angreifen sollen
  5. Mangelhafte Kommunikation: Insgesamt macht es den Eindruck, dass es Lastpass eher darum geht den Vorfall herunterzuspielen und eventuelle Datenverluste den Kunden in die Schuhe zu schieben. Auch wenn sie es in der Hand gehabt hätten hier viel für die Sicherheit zu tun

Letztlich hat mich die Menge der Probleme und der unprofessionelle Umgang damit dazu veranlasst ähnlich wie Steve Gibson nun Abschied von Lastpass zu nehmen.

Bitwarden als neue Lösung

Trotz der Erfahrung, dass meine Passwortmanagerdaten einmal in der Cloud abhanden gekommen sind, bleibe ich beim Grundprinzip eines cloud-basierten Passwortmanagers. Alles andere ist einfach zu umständlich. Zum Glück gibt es einige Alternativen, die in Episode 904 auch kurz diskutiert werden. Von den da genannten Kandidaten Dashlane, 1Passwort und Bitwarden habe ich mich für letzteren entschieden.

Ein Grund ist, dass es sich hier um eine Open Source Lösung handelt, die aber zugleich ein Serviceangebot hat, welches man kaufen kann. So hat man zwar die Option eines selbstverantwortlichen Betriebs, aber wenn man das nicht kann oder möchte nutzt man den Service in der Cloud.

Kann man sicher sein, dass Bitwarden keine ähnlichen Probleme hat oder bekommt wie Lastpass? Letztlich nicht wirklich, allein das es sich hier um Open Source handelt ist keine Garantie dafür, dass komplexe Algorithmen korrekt implementiert sind, keine sonstigen Fehler in der Software sind und das der Betrieb der Cloudplattform kompetent erfolgt. Aber zumindest könnte man in einem vergleichbaren Fall einfach nachsehen wie die Software funktioniert, und müsste nicht herumraten, wie es bei Lastpass nun der Fall ist.

Die Migration an sich hat bei mir gut funktioniert, man nutzt entsprechend der Anleitung den Export von Lastpass und holt diese Daten dann nach Bitwarden.

Nach dem ersten Eindruck ist die Oberfläche etwas weniger gefällig, als die von Lastpass, aber nicht in einem für mich abschreckenden Maß. Etwas Feintuning kann man dann noch machen und die Anzahl der Iterationen für die Schlüsselableitung (KDF) erhöhen. Sie liegt per Voreinstellung bei 100.000, also auf dem Level, welches Lasspass bei neuen Nutzer*innen setzt. Aber man kann sie hochsetzen, und heutige Smartphones verkraften auch deutlich höhere Werte:

Bitwarden: KDF-Iterationen bearbeiten

Zur Erinnerung: Die Anzahl der Iterationen erhöht direkt den Aufwand, den Angreifer in einem Szenario wie dem Datendiebstahl bei Lastpass erbringen müssen und hier hat man neben der Komplexität des Masterpassworts noch eine weitere Stellschraube. Der Wert von mehr als einer Million scheint auf meinem Geräten keine Schwierigkeiten zu bereiten, auch auf dem alten iPad Mini als wohl leistungsschwächsten Gerät dauert das Öffnen des Tresors nur eine Sekunde.

Ich habe meinen Lastpass Account noch nicht gekündigt und werde noch ein paar Wochen beobachten, wie sich Bitwarden schlägt, aber Passwortänderungen werden nun nur noch über den neuen Passwortmanager gemacht.

Umgang mit den bisher bei Lastpass gespeicherten Passworten

Ich muss davon ausgehen, dass mein kompletter Passworttresor heute in den Händen von Kriminellen ist. Zusammen mit den Tresoren von Millionen von anderen Lastpass Nutzer*innen. Trotz der oben benannten kritischen Punkte bei der Verschlüsselung gehe ich nicht davon aus, dass meine Daten schon geknackt wurden. Aus diesen Gründen:

  1. Ich stelle vermutlich kein speziell interessantes Ziel dar, welches besondere Aufmerksamkeit und umfangreiche Investitionen an Rechenzeit rechtfertigt
  2. Bei einer opportunistischen Vorgehensweise der Angreifer – leichte Ziele vor schweren Zielen angehen – sind die Nutzer*innen, die eine noch kleinere Anzahl von PKDF-Iterationen hatten (vielleicht nur eine einzige!) wohl eher ‚dran‘ als ich. Allerdings gibt es keine vollständige Information darüber, in welchem Maße die schwachen Iterationszahlen vorhanden sind, wann ich nach dieser Logik als ‚dran‘ wäre
  3. Mein Masterpasswort war nicht schwach und erfüllte die oben von mir selbst aufgestellten Massgaben
  4. Ich habe bisher keine ungewöhnlichen Aktivitäten bei meinen diversen Konten bemerkt

Trotzdem…es wäre absurd zu glauben, dass nicht irgendwann die Daten meines Tresors zugänglich werden, sei es in ein paar Wochen, Monaten oder Jahren, die Logindaten müssen also geändert werden. Allerdings habe ich hunderte von Logins in meinem Tresor, es ist daher eine Priorisierung notwendig. Das ist meine Reihenfolge:

Priorität 1: Zentrale Mail- und Betriebssystemkonten

An wichtigsten sind die Google Konten. Nicht nur enthalten sie selbst jede Menge wichtige Daten, sie sind auch bei vielen Services als Adressen eingetragen für Passwortresets. Wer diese Konten kapert, der kann sich dann auch ohne gestohlenen Passworttresor den Zugriff auf viele Konten sichern.

In gewisser Weise gilt das auch für die Konten bei Microsoft und Apple, die den Zugriff auf die Betriebssysteme dieser Anbieter ermöglichen und ebenfalls zentrale Angriffspunkte sind.

Priorität 2: Finanzen und große Einkaufsplattformen

Danach kommen direkt die Konten bei Banken und Onlinefinanzdienstleistern. Ein Zugriff darauf kann unmittelbaren finanziellen Schaden erzeugen, auch wenn hier heute immer ein weiterer Faktor wie eine dynamische TAN benötigt wird. Auch Plattformen wie Amazon gehören für mich dazu, da hier ebenfalls das Potential zu wesentlichen finanziellen Schäden besteht.

Priorität 3: Eigene Webseiten und Social Media

Eine Übernahme meiner digitalen Identität im Netz würde über Jahre aufgebaute Repräsentationen zerstören und hat das Potential auch andere zu schädigen, falls Angreifer versuchen sollten sich auf diese Weise Vertrauen zu erschleichen.

Priorität 4: Der große Rest

Danach bleiben immer noch eine Menge von Konten, für die eine Lösung gefunden werden muss. Bei vielen wird sich eher die Frage stellen ob man sie nicht komplett aufgibt, statt das Passwort zu ändern. Denn jeder Service, der Daten von einem verwaltet, ist letztlich ein potentielles Angriffsziel, über das Daten abfließen können.

Leseempfehlung: ‚Countdown to Zeroday‘ von Kim Zetter

Es ist schon etwas Zeit vergangen seit der letzten Leseempfehlung hier, aber meine gerade beendete Urlaubslektüre hat sich für mich sehr gelohnt. Es ist Countdown to Zero Day: Stuxnet and the Launch of the World’s First Digital Weapon (ISBN 0-77043-617-X) von Kim Zetter. Zwar ist das Buch schon aus dem Jahr 2014 und angesichts der schnellen Entwicklungen im IT Bereich daher nicht mehr ganz up to date. 

Aber es ist trotzdem lesenswert, denn die Stuxnet Schadsoftware ist bis heute (2022) ein einzigartiges Beispiel für eine digitale Waffe, die auch zum Einsatz kam bzw. deren Einsatz entdeckt wurde.

Die Autorin nimmt auf den 500 Seiten alle Aspekte in Augenschein, vielleicht manchmal schon zu umfassend, darunter diese:

Die Sicht der Sicherheitsforscher

Die Personen, die mit der Analyse der ungewöhnlich komplexen Schadsoftware befasst waren, insbesondere bei Symantec und dem deutschen Unternehmen Langner, erfahren eine umfassende Porträtierung. Und die für sie neuen Fragestellungen:

  • Ist es insbesondere für ein US Unternehmen wie Symantec eigentlich opportun eine von der US Regierung beauftragte Operation zu (zer)stören?
  • Wie ist es mit den möglichen persönlichen Risiken, denen man sich dabei im Gegensatz zur Analyse irgendeiner beliebigen Virussoftware aussetzt?
  • Ist man in irgendeiner Weise mitschuldig, wenn der digitale Angriff aufgedeckt wird und die Geheimdienste ihre Strategie dann offenbar auf Mordanschläge umstellen?

Die Funktion der Waffe

Es gibt ein umfangreiche Beschreibung der ‘Nutzlast’ der Schadsoftware, sozusagen des digitalen Sprengkopfs. Dieser bestand aus auf die spezielle Steuerungssoftware von Siemens, die attackiert wurde, zugeschnittenen Elementen, die so ganz anders funktionieren als der Code, den Sicherheitsforscher im Umfeld gängiger Betriebssysteme wie Windows oder Linux gewohnt sind, was die Analyse sehr erschwerte.   

Das Ziel der Waffe

Die Schadsoftware richtete sich – das kann heute wohl als sicher gelten – gegen das iranische Nuklearprogramm bzw. den Teil, in dem die Urananreicherung mit tausenden von Zentrifugen erfolgt. 

Und war damit ein Teil eines über Jahrzehnte – bis heute – andauernden Konflikts zwischen dem Iran, der USA, Israel, aber auch weiteren Staaten. Hier rollt das Buch die verschiedenen Parteien auf, wobei es naturgemäß schwierig ist die eigentlich Verantwortlichen zum Reden zu bringen oder auch nur zu benennen.

Ein wesentlicher Teil des Buches befasst sich auch mit der Frage ob so eine Schadsoftware ein kriegerischer Akt ist. Das ist keine unwichtige Frage, denn die Alternativen aus Sicht der USA und Israels wären eindeutige kriegerische Akte wie Luftangriffe.

Und würden die USA – wenn sie in ähnlicher Weise angegriffen würden – so eine Attacke genauso einschätzen, wie sie es damals als Angreifer getan haben?

Was braucht es sonst noch um so eine Waffe zu entwickeln

Was in der Berichterstattung über Stuxnet oft zu kurz kam ist die Frage wie es überhaupt technisch möglich war eine Software zu entwickeln, die in offenbar sehr subtiler Weise komplexe Hardware – die Zentrifugen der Urananreicherung – beschädigen und in ihrer Leistung einschränken kann.

Hier wird klar, dass solche Angriffe kaum ohne einen umfangreichen Maschinenpark und langen Vorlauf realisierbar sind.   

War Stuxnet erfolgreich

Die Antwort auf diese Frage ist überraschend kompliziert und vielfältig. Da niemand der Personen, die es am besten wissen könnten, ein Interesse hat die tatsächlichen Fakten offenzulegen gibt es nur umfangreiche Indizien, die die befragten Expert*innen aber auch wieder ganz unterschiedlich auslegen.

Interessant ist auch die Frage ob die Autor*innen der Schadsoftware hätten aggressiver vorgehen sollen. Es wäre vermutlich ‘leicht’ gewesen tausende von Zentrifugen zu zerstören, aber damit hätte man die Iraner auch direkt darauf gestoßen, dass irgendetwas grundsätzlich nicht stimmt. 

Der Umgang staatlicher Stellen mit Zero Day Lücken

Stuxnet nutzte eine – zumindest für damalige Verhältnisse – ungewöhnliche große Anzahl von Zero Day Lücken – also vor ihrer Entdeckung in Schadsoftware zumindest bei den jeweiligen Softwareanbietern wie Microsoft unbekannte Lücken – aus. Insgesamt waren es 4.

Hier wird der Konflikt diskutiert den staatliche Stellen haben, die auf der einen Seite die Sicherheit ihrer Bürger und der Infrastruktur sichern sollen, aber auf der anderen Seite solche Lücken für Geheimoperationen in Reserve halten möchten. Teilweise sogar die gleichen staatlichen Stellen.

Seit damals hat sich einiges getan was Bug Bounty Programme angeht, aber der Markt für solche Lücken in wichtigen Systemen ist eigentlich nur noch größer geworden und die Preise viel höher, die Unternehmen wie Apple, Google oder Microsoft bieten müssen, damit sie halbwegs sicher sein können das Fehler in ihren global eingesetzten Produkten bei ihnen gemeldet werden, und nicht bei einer der vielen Plattformen, die sie an den Meistbietenden verkaufen.

Die Büchse der Pandora – geöffnet, aber nicht genutzt?

Das Ende des Buches wird die Metapher der Büchse der Pandora verwendet: Haben die Personen, die Stuxnet auf den Iran und letztlich auf die Welt losgelassen haben damit einen Präzedenzfall geschaffen, der sich nicht mehr ungeschehen macht? Ähnlich den Detonationen der ersten Atombomben?

Dieser Argumentation kann man sich kaum verschließen, aber es ist heute – 8 Jahre nach dem Erscheinen des Buches – festzustellen, dass vergleichbare Ereignisse seitdem nicht wieder bekannt geworden sind. Auch im aktuellen Angriffskrieg Russlands gegen die Ukraine scheinen solche Mittel eher nachrangig – wenn überhaupt – zum Einsatz zu kommen.

Tatsächlich kommen heute große Infrastrukturausfälle durch digitale Angriffe vor, siehe z. B. den Angriff auf die Colonial Pipeline, der zu massiven Störungen der Energieversorgung in den USA führte. Aber diese Angriffe werden von Kriminellen ausgeführt, denen es um Geld geht, nicht von Staaten oder Geheimdiensten. Und die viel simplere Sicherheitslücken ausnutzen und auf diese Weise teilweise überraschend tief in hochwichtige Systeme eindringen.

Das liegt vielleicht daran, dass sich eine digitale Waffe oft nur einmal einsetzen lässt, danach ist ihr Wirkmechanismus bekannt und kann abgestellt werden. Und der Angegriffene bekommt mit der Schadsoftware auch eine Blaupause dafür, wie diese Waffe funktioniert, und kann sie nachbauen. Das macht den Einsatz riskant und trotz der ‘Vorteile’ – hauptsächlich wie schwer es ggf. ist nachzuweisen, wer für einen Angriff verantwortlich war – nur für wenige Szenarien attraktiv. 

Empfehlung

Wer sich für IT Sicherheit interessiert, aber dabei nicht rein für die Bits und Bytes, der findet hier interessanten Lesestoff in einer Tiefe, die sich mir damals, als das Thema ganz aktuell war, so nicht erschlossen hat.

Und 8 Jahre später die Prognosen zur Ausbreitung und zum Einsatz von digitalen Waffen mit der Realität vergleichen zu können ist ebenfalls spannend.

Komplexität 🤜🤛 IT Sicherheit: 2 interessante Beispiele

Beschäftigt man sich regelmäßig mit IT Sicherheitsthemen – etwa in dem man jede Woche den Security Now Podcast hört – gibt es immer wieder Momente in denen man völlig davon überzeugt ist, dass das Internet nur von Kaugummi und Klebeband zusammengehalten wird. Aber oft sind es auch Themen, die tief in die unheimlich komplex gewordenen Infrastukturen und Technologien führen, mit denen wir täglich hantieren. Das sind zwei Beispiele aus den letzten Wochen, die ich besonders spannend fand:

Trojan Source – UTF-8 und Tricks mit dem bidi Encoding 🔀

Aus Security Now 843: Zwei britische Forscher haben ein spannendes Paper mit dem Titel ‚Trojan Source: Invisible Vulnerabilities‚ veröffentlicht, welches im Endeffekt diese Kernaussage hat:

Bei der Prüfung eines Programmcodes kann man nicht mehr davon ausgehen, dass der Code, den man vor sich auf dem Bildschirm sieht, der gleiche Code ist, der später vom Compiler ‚gesehen‘ und in ein Programm übersetzt wird

So wie das Trojanische Pferd auch nicht das war, was es zu sein schien…Wenn man darüber einen Moment nachdenkt zieht es einem nach und nach das Fundament unter dem Füßen weg, auf dem die Überprüfung von Softwarequalität und -sicherheit von jeher stand:

Ein Mensch schaut sich in einem Editor den Quellcode, den ein anderer Mensch – oder inzwischen auch eine Maschine – geschrieben hat, versucht ihn zu verstehen und vergleicht ihn mit der Funktion, die der Code laut Pflichtenheft oder Eigenbeschreibung oder Stack Overflow Kommentar haben soll.

Im Paper werden nun unterschiedliche Verfahren beschrieben, wie man in Quellcode, der als Unicode gespeichert ist, subtile Täuschungen einschmuggeln kann. Und dabei kommt die Komplexität moderner Zeichensatzcodierungen, die den Anspruch haben letztlich jedes relevante Schriftsystem der Welt – und möglicherweise auch extraterrestrische – korrekt darstellen zu können, uns die Quere:

Neben vergleichsweise simplen Ticks wie dem Einfügen von breitenlosen und damit unsichtbaren Leerzeichen (Zero Width Space ZWSP), die Stringvergleiche scheitern lassen können, oder der Verwendung von Homoglyphen, die etwa zur Einführung alternativer Methodenaufrufe genutzt werden können, sind es die Nutzungen der Bidirectional Commands und davon gibt es einen ganzen Block:

Tabelle mit den UTF-8 Zeichen für Richtungswechsel. Quelle: https://www.w3.org/International/questions/qa-bidi-unicode-controls

Die lassen sich sogar verschachteln und ähnlich wie bei einem Stack in der Programmierung gibt es POP Anweisungen um Verschachtelungen wieder zu beenden und damit eine Schachtelungsebene nach oben zu gehen:

Tabelle mit den UTF-8 Zeichen für Richtungswechsel. Quelle: https://www.w3.org/International/questions/qa-bidi-unicode-controls

Gerade mit dem Isolates, die komplette Gruppen von Zeichen als gemeinsames Element behandeln, und Kombinationen von BiDi Anweisungen lassen sich leicht Fälle konstruieren, bei denen etwas, dass im Quellcodeeditor so aussieht:

...
/* Wenn Sicherheitsprüfung bestanden, dann return; */
if (check == true) 
     return;
else 
     throw new Exception("Keine Berechtigung!");

für den Compiler hingegen so erscheint:

...
/* Wenn Sicherheitsprüfung bestanden, dann */ return;
if (check == true) 
     return;
else 
     throw new Exception("Keine Berechtigung!");

Hier wird also aus dem scheinbaren Kommentar am Ende eine Programmanweisung, die die Logik komplett aushebelt. Das solche subtilen Änderungen manchmal weitreichende Probleme verursachen, dafür ist der goto fail;-Bug ein gutes Beispiel, den Apple vor Jahren in seinem Betriebssystem hatte. Hier sah der fehlerhafte Abschnitt so aus:

if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
	goto fail;
	goto fail;

Richtig wäre aber diese Variante gewesen:

if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
	goto fail;
goto fail;

Die dritte Zeile durfte also nicht eingerückt sein. Manchmal reicht schon ein TAB um den Unterschied zu machen und in diesem Fall gab es Vermutungen, dass vielleicht jemand dafür bezahlt worden sein könnte diesen subtilen Fehler an einer entscheidenden Stelle einzubauen. Das Risiko der Entdeckung wäre gering gewesen und man hätte sich leicht damit herausreden können, dass es sich um einen Tippfehler gehandelt hat. Mit Hilfe der BiDi-Trickserei wäre dieser Fehler nicht einmal bei einem sehr sorgfältigen Code Review sichtbar gewesen.

Da die Forscher bereits reale Beispiele für die Anwendung dieser Technik gefunden haben ist das keine rein theoretische Bedrohung. Da sich solcher Code sogar per Copy-and-Paste übernehmen lässt sind beliebte Vorgehensweisen in der modernen Softwareentwicklung ebenfalls gefährdet. Also noch mehr gefährdet, als sie es immer schon waren 🙈

Was kann man tun?

Grundsätzlich wird man wohl abwarten müssen bis die Werkzeuge wie Editoren, Compilier und vielleicht auch Linter sich dieses Problems annehmen. Bis dahin gibt es vielleicht diese Faustformeln:

  • Gerade in den Quellcode eingebrachte Texte wie Kommentare und Strings sind Einstiegspunkte für diese Art von Angriff
  • Die Auswirkung der bidi-Tricksereien enden beim nächsten Zeilenumbruch. Eine einheitliche Quellcodeformatierung, die z. B. eingebettete Kommentare nicht in der gleichen Zeile stehen lässt wie Code, kann ein paar Varianten vermutlich aushebeln
  • Bei der Nutzung von fremden Programmcodes muss man noch stärker als bisher schon auf deren Qualität achten. Was immer schon notwendig, und immer schon schwierig war

HTTP Request Smuggeling 🧱⛏️

Aus Security Now 846: Auch dieses Problem wird durch Komplexität verursacht, aber auf einer ganz anderen Ebene: Hier geht es darum, dass zwei oder mehr hintereinander geschaltete Webserver, die am Bedienen eines Webrequests beteiligt sind, das dabei verwendete HTTP Protokoll nicht einheitlich interpretieren.

Und im Endeffekt unterschiedliche Vorstellungen davon haben, welche Webrequests sie eigentlich gerade verarbeiten.

Dieses Problem ist kein ganz neues Problem, aber heute noch relevanter, da es inzwischen gängige Praxis ist, dass mehr als ein Server am Ausliefern einer Seite beteiligt ist:

  • Proxy Server werden vor den eigentlichen Applikationsserver geschaltet, um die Last zu verringern
  • Webserver wie Apache oder nginx liegen vor den Applikationsservern um TLS zu terminieren oder Loginfunktionen – z. B. Shibboleth – zu übernehmen
  • Loadbalancer sind Netzwerkkomponenten, die die Zugriffe auf nachgelagerte Server verteilen, um Lasten gleichmäßig verarbeitbar zu machen
  • Dienste wie Cloudflare bieten ihren Kunden durch vorschaltete Systeme Schutz vor Denial of Service Angriffen, die eigentlichen Server sind nicht mehr direkt erreichbar
  • Und alle denkbaren Kombinationen davon….

Für die effiziente Kommunikation zwischen diesen Servern werden verschiedene Webrequests gerne hintereinander gehängt, damit sie sich schnell über die gleiche Verbindung übertragen lassen.

Aber wie schafft man es dem einen Server etwas anderes vorzugaukeln, als dem später drankommenden Server? In dem man die zwei Optionen, die der HTTP Standard als Mittel bietet um die Länge eines Request zu definieren – und damit bei hintereinander gehängten Requests zu definieren, wo der eine aufhört und der andere beginnt – so trickreich nutzt, dass die beteiligten Server zu unterschiedlichen Ansichten darüber gelangen, wo die Grenze zwischen zwei Requests liegt. Auch wenn es laut dem Standard eigentlich klar wäre, wie vorzugehen ist:

“According to the HTTP/1.1 standards, if both Content-Length and Transfer-Encoding headers are passed, Transfer-Encoding takes precedence.”

Quelle auf Medium

Auf diese Weise kann es bei anfälligen Serverkombinationen – und laut diesem Paper sind das viele – gelingen einen Zugriff auf einen Backend Server abzusetzen, der eigentlich von den davor geschalteten Servern gefiltert werden sollte. Das kann insbesondere dann relevant sein, wenn die vorgeschalteten Server das Login- und Rechtemanagement übernehmen.

Für eine bestimmte Variante des Request Smugglings vulnerable Serverkombinationen laut diesem Paper

Auch hier ist es nicht leicht etwas zu tun. Wie immer muss man natürlich seine Server aktuell halten, so gibt es z. B. für Tomcat inzwischen einen Patch für CVE-2021-33037, der auch mit HTTP Request Smuggeling zu tun hat. Aber auf das Verhalten vieler Komponenten, wie z. B. Loadbalancer, hat man wenig bis keinen Zugriff.

Eine Lösung ist es vielleicht die kritischen Entscheidungen einer Applikation – also die Rechte- und Zugriffskontrolle – möglichst weit nach hinten zu verlagern, bis in die Applikationsserver. Das nimmt einem Optimierungsmöglichkeiten, aber dafür ist der Server, der am Ende die Requests verarbeitet, auch derjenige, der entscheidet welche Requests zulässig sind.

Hafnium im Gartenshop

Die wahlweise Hafnium oder ProxyLogon genannte Gruppe von Sicherheitslücken in Microsofts Exchange Servern dominierte in den letzten Wochen die IT Sicherheitsthemen. Und selbst wenn IT Profis wie die Kollegen in der Uni die Lücken schnell geschlossen haben kann einen das Thema betreffen. Daran erinnert diese Mail eines Webshops, bei dem ich vor Jahren mal etwas bestellt habe, und die gestern eintraf:

Screenhot einer Mail mit der Information darüber, dass der Exchange Server eines Webshops gehackt wurde

Nicht alle Admins von Exchange Servern waren schnell genug um den direkt nach Bekanntwerden der Lücke einsetzenden, massenhaften Scans nach verwundbaren Servern zuvor zu kommen. Vermutlich gibt es 10.000e von Systemen, die schon mit Webshells oder anderen Hintertüren ausgestattet wurden (Nachtrag: manche offenbar auch gleich mehrfach). Und ein reines Patchen der Exchange Lücken beseitigt diese Zugänge dann nicht mehr.

Die DSGVO zwingt nun die Betreiber zumindest im europäischen Raum dazu ihre Kund*innen über solche Vorfälle zu informieren. Und ich würde wetten, dass das nicht die letzte entsprechende Mail war, die ich bekommen werde. Natürlich nur, wenn gehackte Betreiber sich gesetzeskonform verhalten bzw. überhaupt entdecken, dass sie gehackt wurden.

Was kann man tun?

Bei der Gelegenheit die Erinnerung an den schönen Have i been pwned? Dienst:

https://haveibeenpwned.com/

Der benachrichtigt einen, wenn mit der eigenen Mailadresse verknüpfte Kontodaten irgendwo im (Dark)Web auftauchen, oft auch verbunden mit der Information von welchem Dienst diese Daten gestohlen wurden. Ich habe in den letzten Jahren schon mehrere entsprechende Meldungen bekommen und zum Glück hatte ich bei den jeweiligen Diensten schon individuelle, nur für den jeweiligen Dienst geltende Passworte verwendet, so dass mit den gestohlenen Zugangsdaten nicht noch weitere Konten von mir missbraucht werden konnten.

Was zum nächsten Tipp führt: Heute ist die Verwendung eines Passwortmanagers unumgänglich um

  • sehr sichere (also lange und komplett zufällige) und
  • für jeden Dienst einzigartige

Logindaten zu verwenden. Wer sich dabei nicht auf die in heutigen Webbrowsern eingebauten Passwortmanager verlassen möchte, der findet hier einen aktuellen Überblick.

Wie lang darf eigentlich ein class-Attribut sein?

Ich arbeite nicht erst seit gestern mit HTML, aber diese Frage habe ich mir nie gestellt. Der aktuelle Security Now Podcast (Folge #810) mit seiner Beschreibung der interessanten ‘Prime+Probe 1, JavaScript 0: Overcoming Browser-based Side-Channel Defenses’ Forschungsarbeit hat mich erst darauf gebracht: Darin geht es um einen Ansatz um Nutzer*innen im Webbrowser ganz ohne Javascript zu tracken und der trickreiche Ansatz um mal wieder Cache Timings als Seitenkanal zu nutzen verwendet – Achtung! – 2 Millionen Zeichen lange Klassennamen. Zitat:

CSS Prime+Probe Implementation. Figure 3 shows a code snippet implementing CSS Prime+Probe, using CSS Attribute Selectors to perform the attack. Specifically, Line 9 defines a div with a very long class name (two million characters).

Kann das sein? Warum sollte die HTML Spezifikation derart lange Namen erlauben? Hätte ich vorher darüber nachgedacht wäre mein Tipp vermutlich bei 1024 oder maximal 32.768 Zeichen gelandet. Das sollte auch für sehr sprechende und exzessive Anwendungen von CSS Klassennamen ausreichen, wie sie z. B. die BEM Vorgehensweise nahelegt.

HTML Code mit sehr langem class-Attribut

Aber die Antwort, warum die Spezifikation solche langen Namen erlaubt, scheint einfach zu sein: Sie macht hier überhaupt keine Vorgabe! Demnach setzen nur die konkreten HTML Implementierungen der Webbrowser Grenzen, schon um zu verhindern, dass solche absurden Inhalte den Speicher zum überlaufen bringen. Aber wenn es solche Grenzen gibt, dann liegen sie offenbar weit jenseits dessen, was sich ‘vernünftig’ anfühlt.

Ob die Browserhersteller angesichts solcher Tricksereien nun anfangen engere Begrenzungen zu definieren? In regulären Webanwendungen sind jedenfalls kaum Anwendungen vorstellbar, die mehr als 1024 Zeichen für Klassennamen verwenden. Oder?

BoringSSL und die FIPS 140-2 Zertifizierung

Vor inzwischen mehr als 3 Jahren verkündete Adam Langley in seinem Blog den Beginn der Arbeiten an BoringSSL, einem Fork von OpenSSL, der speziell auf die Anforderungen von Google zugeschnitten ist. Anlass waren die verschiedenen Probleme in SSL/TLS Implementierungen, insbesondere der Heartbleed Bug in OpenSSL, der damals für viel Aufsehen sorgte. Mit BoringSSL schuf Google sich eine bereinigte SSL/TLS Implementierung, die schon knapp ein Jahr später in die großen Google Produkte Chrome & Android einging und zum Betrieb der Google Services im Netz verwendet wurde. Für Google ist das Projekt offenbar ein Erfolg, da sie damit endlich eine einheitliche Basis für diesen sicherheitsrelevanten Code schaffen konnten, die sie nach eigenem Gutdünken weiterentwickeln können.

Ist BoringSSL eine Alternative?

Wer OpenSSL einsetzt, oder LibreSSL, den anderen damals entstandenen Fork, kann sich die Frage stellen ob ein Library, welches von Google entwickelt wird, vielleicht die bessere Alternative ist? ‘Besser‘ ist dabei ein Adjektiv mit mehreren Aspekten, darunter Rückwärtskompatibilität (mit OpenSSL), Stabilität, Sicherheit, Codereife, Funktionsumfang und Lizenzierung. Google stellt auf der BoringSSL Seite dazu diese Hinweise direkt an den Anfang:

“BoringSSL is a fork of OpenSSL that is designed to meet Google’s needs.

Although BoringSSL is an open source project, it is not intended for general use, as OpenSSL is. We don’t recommend that third parties depend upon it. Doing so is likely to be frustrating because there are no guarantees of API or ABI stability.

Programs ship their own copies of BoringSSL when they use it and we update everything as needed when deciding to make API changes. This allows us to mostly avoid compromises in the name of compatibility. It works for us, but it may not work for you.”

Das kann man nicht gerade als aktives Werben um neue NutzerInnen verstehen. In jedem Fall muss man damit rechnen einen gewissen ’Preis’ für die Nutzung eines leistungsfähigen, von einem hochkompetenten Entwicklerteam weiterentwickelten Pakets zu bezahlen, und zwar in Form vorzuhaltender eigener Entwicklerkapazitäten, damit man im Fall von Änderungen an BoringSSL in den eigenen Produkten entsprechend nachsteuern kann. Auf der anderen Seite ist heute das Risiko eines kompletten Refactorings von BoringSSL wohl eher gering, dazu ist selbst Google nicht mehr so ohne weiteres in der Lage angesichts von Millionen – oder gar Milliarden – von Android Geräten, die sich nur schwer aktualisieren lassen.

Seit ein paar Tagen gibt es eine neue Seite im BoringSSL Repository, die das Thema der FIPS Validierung behandelt. Dabei geht es nicht um das komplette Projekt, sondern um einen Teilbereich, genannt BoringCrypto. Dies könnte für Unternehmen, die nur entsprechend zertifizierte Produkte einsetzen dürfen (Finanzbereich, etc.), noch einmal einen Stolperstein bei der Nutzung beseitigen. Aber was ist FIPS 140-2 eigentlich und verbessert es wirklich die Sicherheit von BoringSSL?

Was ist FIPS 140-2 und was macht es ‘sicher’

Der ‘Federal Information Processing Standard (FIPS) Publication 140-2’ ist ein Standard der US Regierung, der – ausgeführt vom NIST – Anforderungen an kryptographische Module sowohl in Hardware wie auch Software definiert. Er legt damit verbindlich fest welche Anforderungen an entsprechende Module gestellt werden (z. B. in Form einer Liste der notwendigen/zulässigen kryptographischen Algorithmen) und auch das Verfahren, über das Anbieter entsprechender Produkte diese Zertifizierung erhalten können. Dabei wird in 4 Level unterschieden, die jeweils immer höhere Anforderungen stellen, z. B. in Bezug auf die Verhinderung bzw. Feststellung von Manipulationsversuchen.

Dieser Standard ist neben den Common Criteria wohl der wichtigste IT Sicherheitsstand weltweit. Eine FIPS Zertifizierung erhöht damit die Sicherheit eines Produkts in jedem Fall. Oder?

Die Snowden Enthüllungen

Eine Anforderung im FIPS Zertifizierungsprozess ist die Garantie, dass eine zertifizierte Software sich selbst auf Konsistenz prüfen kann. Siehe dazu im letzten Abschnitt mehr. Dies kann nur auf eine Weise erreicht werden, die man aus heutiger Sicht nicht mehr unbedingt als letzten Stand der sicherheitsbewussten Programmierung sehen muss. In der BoringSSL Seite zu FIPS findet sich daher an einer Stelle der Satz

‘This might make building ROP chains easier for an attacker, but so it goes.’

Ein weiterer Kritikpunkt – der z. B. in der entsprechenden OpenSSL Seite vorgebracht wird – ist die Langsamkeit des Zertifizierungsprozesses. Nun braucht eine sorgfältige Zertifizierung ihre Zeit, aber auf der anderen Seite ist es heute wichtiger denn je bei gefundenen Fehlern schnell Bugfixes verbreiten zu können. Denn selbst nach einer Zertifizierung ist es unwahrscheinlich, dass jeder einzelne Fehler gefunden wurde. Wenn aber eine Fehlerkorrektur dann eine erneute Zertifizierung erforderlich macht vergehen schnell mal einige Monate. In dieser Zeit haben Angreifer dann ausgerechnet in den Industrien mit besonderen Sicherheitsanforderungen, die zur Nutzung FIPS-zertifizierter Lösungen gezwungen sind, ggf. leichtes Spiel.

Ein letzter, massiver Kritikpunkt entsteht allerdings aus dem mit den Snowden Enthüllungen massiv gewachsenen Misstrauen gegen die US-Geheimdienste und ihre Verquickungen mit den Standardisierungsbehörden. Insbesondere betraf dieses Misstrauen damals einen in den Standard gebrachten Algorithmus zur Generierung von Zufallszahlen, der immer schon von Kryptographen misstrauisch beäugt worden war, sich nun aber als sehr wahrscheinlich mit einer bewusst konstruierten Hintertür versehen erwies. Durch die langsamen Standardisierungsprozesse war es dann ein sehr zeitaufwändiger Prozess diesen Algorithmus aus Produkten zu entfernen, bis dahin schlummerte er als potentielles Einfallstor in den als ‘sicher’ zertifizierten Produkten.

Insgesamt ist die Sache also ein zweischneidiges Schwert, und für EntwicklerInnen eines Libraries wie BoringSSL immer mit der Frage verbunden was ihnen wichtiger ist: Ein Produkt zu entwickeln, welches nach den bekannten Maßstäben der IT Sicherheit ganz vorne ist, oder zusätzlichen, teilweise bürokratischen Aufwand auf sich nehmen um am Ende bei einem möglicherweise in Teilaspekten weniger sicheren Produkt zu landen, welches dafür dann aber in besonders sicherheitsbedürftigen Bereichen eingesetzt werden – und dort vielleicht andere, weniger gut gepflegte Lösungen verdrängen – kann. Oder den Aufwand noch weiter zu erhöhen und parallele Stränge des eigenen Produkts zu pflegen, die beiden Anforderungen gerecht werden.

Wie macht man Software FIPS kompatibel

Aber nun wieder zurück zu der Frage welche Anforderungen eigentlich entstehen, wenn man eine C/C++ Programmierung mit den FIPS Vorgaben in Einklang bringen will?

‘FIPS-140 mandates that a module calculate an HMAC of its own code in a constructor function and compare the result to a known-good value. Typical code produced by a C compiler includes large numbers of relocations’

Wie man diesen Spagat löst, darüber geht der größere Teil der BoringSSL Seite und er erklärt auch recht gut wie ein C/C++ Compiler im Detail vorgeht und welche Dinge man ihm abgewöhnen muss, damit dieses Ziel erreichbar wird. Möglicherweise haben die Google Leute hier nur damit begonnen die Erfahrungen nachzuhalten, die sie entweder selbst gemacht haben oder große Android Nutzer wie Samsung (PDF), die auf BoringSSL basierende Komponenten bereits in den FIPS Prozess eingebracht haben.

Zwei Jahre Android Security Rewards – Was hat sich verändert?

Vor nun zwei Jahren hat Google mit den Android Security Rewards sein spezielles Bug-Bounty-Programm für Android gestartet. Kurz bevor mit den ersten Stagefright Sicherheitslücken die Kritik an der damaligen, desolaten Sicherheitslage Androids ein Allzeithoch erreichte. Im Android Entwicklerblog hat Google nun ein Fazit dazu gezogen, wie sich die Situation seit damals entwickelt hat. Der Post ist recht kurz, aber trotzdem in seinen Details interessant:

Android Update - Rot

Ein steter Strom von Bugreports

Man kann wohl sagen, dass dieses Bug-Bounty-Programm heute funktioniert: Im letzten Jahr sind mehr als 450 Reports eingegangen. Es vergeht damit wohl kaum ein Tag bei Google, an dem nicht eine Fehlermeldung eintrifft. Das ist zunächst einmal ein echter Erfolg, auch wenn daraus natürlich Schlagzeilen entstehen wie z. B. diese hier: „Android Was 2016’s Most Vulnerable Product.

Da Google den Android Quellcode im Android Open Source Project (AOSP) veröffentlicht kann sich hier faktisch jedeR an der Fehlersuche beteiligen und damit Geld und Anerkennung verdienen. Und tatsächlich tut dies eine große Zahl von Leuten.

In gewisser Weise bestätigt Android damit das von Open Source Verfechtern gern ins Feld geführte Argument, wonach die Offenheit auch gleichzeitig für eine bessere Sicherheit sorge, weil eben viele Menschen ohne große Hürden nach Fehlern suchen können. Auf der anderen Seite zeigt aber der Erfolg des Bug-Bounty-Programms auch was für ein wichtiger Faktor der finanzielle Anreiz sein kann. Dieser Anreiz fehlt bei vielen Open Source Projekten.

Mehr Geld, mehr Bugreports?

1,1 Millionen Dollar hat Google laut dem Bericht in den letzten 12 Monaten ausgeschüttet, was einer durchschnittlichen Summe von mehr als 10.000$ pro Sicherheitsforscher entspräche. Natürlich gibt es Personen / Gruppen, die durch besonders viele Meldungen herausstechen, Google selbst hebt hier das C0RE Team hervor, welches allein 118 Reports eingereicht und dafür 300.000$ erhalten hat.

Die höchsten Belohungsstufen wurden dabei aber bisher nicht erreicht, Google hebt diese Belohnungen nun auf das 4- bzw. 5-fache der bisherigen Werte. Damit könnte man nun 6-stellige Summen allein für einen einzigen Bugreport erhalten.

Google steht hier – wie heute alle großen IT Unternehmen – in starker Konkurrenz zu staatlichen Stellen aus aller Welt, die für ihre Geheimdienste nach ‚Cyberwaffen‘ Ausschau halten und sich dazu privater Dienstleister bedienen, für die die Suche nach Einbruchsmöglichkeiten in populäre Software zu einem profitablem Geschäft geworden ist. Hier kann man mit einem funktionierenden Exploit in das weltweit meistgenutzte Betriebssystem vermutlich noch weitaus höhere Gewinne erzielen.

Das ein hoher Belohnungspreis ein Bug-Bounty-Programm nicht automatisch erfolgreich machen muss hat der gescheiterte Versuch von Googles Project Zero gezeigt: Dieses wollte mit dem Project Zero Price ein eigenes Programm auf die Beine zu stellen, welches ebenfalls 6-stellige Summen für hochwertige Angriffe auf Android in Aussicht stellte. Es erhielt aber keine einzige relevante Einreichung und wurde wieder eingestellt.

Ein breiter aufgestelltes Programm wie die Android Security Rewards kann da durchaus erfolgreicher sein, auch wenn bzw. gerade weil seine Belohnungsstaffelung bei deutlich kleineren Summen beginnt: Dadurch erhöht sich die Zahl der beitragenden ForscherInnen und der Versuch einzelne Fehler zu horten, bis sie sich zu einem leistungsfähigeren Exploit kombinieren lassen, ist dann mit dem großen Risiko verbunden, dass jemand anderes einen der Fehler findet, die Belohnung erhält und Google die Lücke schließt.

Welche Geräte sind für sicherheitsbewusste Android NutzerInnen kaufbar?

Im Oktober 2015 – gezwungen durch das Stagefright Debakel – entschied sich Google einen lange überfälligen Schritt zu machen: Damals begann das Programm der monatlichen Android Sicherheitsupdates. Bis dahin gab es den absurden Zustand, in dem Google Meldungen über Sicherheitslücken zwar einsammelte, aber faktisch niemand zeitnah davon profitieren konnte. Durch die neuen Updates waren zuerst nur die direkt von Google kontrollierten Android Geräte wieder auf einem akzeptablen Sicherheitslevel, aber allmählich auch die Produkte einiger anderer Hersteller.

Android Upate

Und auch darüber gibt der aktuelle Blogpost Auskunft: Bei welchen Herstellern von Android Geräten ist meine Chance groß, dass diese zeitnah Sicherheitsupdates bekommen? Google sagt dabei zum einen dies:

Over 100 device models have a majority of their deployed devices running a security update from the last 90 days

Die dann gezeigte Tabelle mit konkreten Geräten lässt trotz ihrer etwas anderen Semantik (‚This table shows the models with a majority of deployed devices running a security update from the last two months‘) eigentlich nur einen Schluss zu: Wer keines der wenigen direkt von Google kommenden Gerät kaufen kann oder will, der sollte zu einem Samsung Gerät greifen. Samsung hat mit Abstand die größte Zahl von Geräten in dieser Liste und kann damit wohl als Vorbild bei der Updatepolitik gelten (wobei es hier wohlgemerkt nicht um Updates der Android Version geht, dass ist noch mal ein ganz anderes Thema).

Fazit: Auf dem richtigen Weg (aber der Weg ist noch weit)

Google ist es augenscheinlich gelungen ein lebendiges Umfeld von Sicherheitsforschern zu schaffen, die zur Android Sicherheit beitragen. Die ausgeschütteten Summen – auch wenn es sich dabei inzwischen um einen Millionenbetrag handelt – sind dabei vermutlich immer noch ‚günstig‘. Muss man das Fazit ziehen, dass Android angesichts der weiterhin hohen Zahl von monatlichen Fehlerkorrekturen besonders unsicher ist?

Das finde ich schwer zu beurteilen, auch andere (Betriebs-)Systeme haben durchaus ansehnliche Zahlen an korrigierten Fehlern vorzuweisen und faktisch ist jeder korrigierte Fehler einer weniger, den jemand anderes schon im Geheimen gefunden und ausgenutzt haben könnte. Nur falls auch in den kommenden Jahren die Zahl der in Android gefundenen Fehler so hoch bleibt wäre das ein sicheres Zeichen, dass mit der Codebasis bzw. der Weiterentwicklung etwas grundsätzlich nicht in Ordnung ist.

Weiterhin das größte Problem des Android Ökosystems ist aber das Fehlen von Updates für die Masse der inzwischen mehr als 2 Milliarden Geräte. Auch wenn Google die ‚mehr als 100 Modelle‘ nicht genau benennt, bei denen die Mehrheit der NutzerInnen wenigstens ein maximal 3 Monate altes Sicherheitslevel erreicht hat, kann man auf Grund der Vielzahl von Android Geräten – siehe die immer wieder gern zitierte Auswertung von OpenSignal aus dem Jahr 2015 – davon ausgehen, das dies nur ein Bruchteil der in aktiver Nutzung befindlichen Geräte ist.

Auch hier muss es die Zeit erst zeigen, ob die Seamless Updates, die mit Android N eingeführt wurden, und die in Android O mit dem Project Treble geplante stärkere Separierung von Betriebssystemteilen in der Lage sein werden eine signifikante Verbesserung zu bringen. Angesichts der gewohnt langsamen Ausbreitung neuer Android Versionen kann man von diesen Verbesserungen aber bestenfalls in einigen Jahren einen sichtbaren Effekt erwarten.

Bis dahin wird es wohl insbesondere den im Hintergrund von Google durchgeführten Prüfungen im Play Store und auf den Endgeräten überlassen bleiben Angriffe zu verhindert.

Google baut eine eigene Root-CA auf

Vor ein paar Tagen hat Google in seinem Security Blog bekannt gegeben selbst zu einer Zertifizierungsstelle (Certificate Authority / CA) zu werden. Diese kann man unter der Adresse https://pki.goog/ erreichen. CAs sind heute entscheidende Stellen in der Public Key Infrastructure (PKI) des Webs, die erst die sichere Kommunikation z. B. zwischen Webbrowser und Webserver ermöglichen.

Welches Problem will Google damit für sich lösen?

Google ist zum einen ein Unternehmen, welches einen enormen Bedarf an Zertifikaten hat, der durch zwei Faktoren bedingt wird:

  1. Die schiere Anzahl der zu sichernden Onlinedienste
  2. Googles schnelle Zertifikatsrotation, die Zertifikate heute nach 3 Monaten auslaufen lässt

Dann hat Google das Thema der IT Sicherheit wie kaum ein zweites Unternehmen im Blick und treibt es an allen Ecken voran, auch im Bereich der Zertifizierungsstellen. Gleichzeitig sind Google Zertifikate oft das Ziel bei Kompromittierungen von Zertifizierungsstellen, da Googles Dienste nun mal von vielen Nutzern besucht und damit für Angreifer besonders wichtig sind.

Google hat hier  in den letzten Jahren über seine Marktmacht mit Chrome als dominierendem Webbrowser und Android als dominierendem Mobilbetriebssystem immer mal wieder kräftig an den Zügeln gezogen, wenn eine CA Mist gebaut hat.

Was stimmt nicht mit mit dem heutigen System der Zertifizierungsstellen?

Das heute existierende System der Zertifizierungsstellen ist in der Lage unsere Webbrowser-Webserver-Kommunikation gegen massenhaftes Abhören zu sichern, wenigstens seit es Initiativen wie Let’s encrypt gibt, die Serverbetreibern die dazu notwendigen Zertifikate kostenfrei und mit geringem Aufwand automatisiert zur Verfügung stellen können. Die Verschlüsselung ist aber nur der eine Aspekt bei einer PKI: Der andere ist die Sicherstellung der Authentizität meines Kommunikationspartners. Damit ist gemeint, dass ich – wenn ich z. B. auf ‘https://www.google.com’ gehe – auch tatsächlich direkt auf einer zu Google gehörenden Webseite lande, und nicht auf einer gefälschten Seite bzw. über einen mithörenden Mittelsmann kommuniziere.

Hier kommen die CAs ins Spiel, die mir garantieren sollen, dass das Zertifikat, welches mir beim Besuch von google.com präsentiert wird, auch tatsächlich Google gehört. Eine CA kann dabei ihre Aufgabe nur erfüllen, wenn sie es schafft mit ihren Wurzelzertifikaten in die gängigen Webbrowser und Betriebssysteme aufgenommen zu werden. Damit ihr das gelingt muss sie ihre Sorgfalt bei der Vergabe von Zertifikaten beweisen.

So weit, so gut. Ein grundlegendes Problem ist dabei allerdings, dass mein Webbrowser danach zunächst jeder der mitgelieferten CAs uneingeschränkt vertraut. Dies sind im Firefox heute mehr als 150 Zertifikate von mehr als 50 Herausgebern und jedes Zertifikat – und sogar davon abgeleitete Unterzertifizierungsstellen – ist in der Lage ein ‘gültiges’ Zertifikat für google.com zu unterzeichnen. Natürlich muss so etwas immer mal wieder schief gehen, Beispiele siehe oben.

Google hat hier in den letzten Jahren in mehreren Schritten versucht diese Probleme zumindest teilweise in den Griff zu bekommen:

  • Certificate Pinning in Chrome: In Chrome ist ein kleines Set von CAs fest einkodiert, die prinzipiell für Google Zertifikate ausstellen könn(t)en. Dadurch hat sich Chrome in den vergangenen Jahren immer wieder als Melder von Verstößen gegen die Sicherheit oder die Regelungen von CAs erwiesen.
  • Dieser Ansatz ließ sich natürlich nicht auf das komplette Web skalieren, von Google kommt daher das inzwischen in einem RFC definierte HPKP, welcher aber noch nicht alle Browser unterstützen. Auch schützt es Benutzer nicht beim ersten Besuch einer Webseite.
  • Abkehr von SHA-1: Die Ablösung von SHA-1 als Signaturalgorithmus für Zertifikate wurde von Google besonders aggressiv vorangetrieben.
  • Certificate Transparency (CT): Dieses Projekt beschreibt wie ein endloses Logbuch aller jemals von CAs ausgegebenen Zertifikate effizient geführt und online zugreifbar gemacht werden kann. Es gibt eine Implementierung von Google, aber inzwischen auch von CAs. Certificate Transparency ermöglicht es Webseitenbetreibern gezielt zu prüfen ob für ihre Webseiten illegitime Zertifikate ausgestellt wurden.
  • Chrome und CT: Google hat für den Herbst 2017 angekündigt, dass Chrome beginnen wird bestimmte Zertifikate nur noch dann zu honorieren, wenn die Certificate Transparency verfügbar ist.

Google hat die CAs hier in den letzten Jahren teilweise vor sich hergetrieben und sich damit durchaus einiges an Kritik eingefangen. Für Google selbst ist der Aufbau einer eigenen CA vermutlich nur ein letzter Baustein in einem System, dass sie bereits mit einem Browser (Chrome), Betriebssystemen (Android, ChromeOS), Protokollen (SPDY und QUIC) und einigen der wichtigsten Internetdienste der Welt nahezu vollständig im Griff haben und weiterentwickeln möchten. Google schafft sich damit nun auch an dieser Stelle ein eigenes Experimentierfeld, in dem sie beweisen können, dass sich ihre Ideen für die Zukunft des Netzes in großem Maßstab umsetzen lassen.

Wird Google Zertifikate frei anbieten bzw. verkaufen?

Abgesehen vom Vorantreiben der Internetsicherheit wird Google seine PKI sicher in Zukunft mit anderen Diensten wie der Domänenregistrierung verknüpfen. Unklar ist allerdings ob sie tatsächlich zu einer CA werden wollen, die jedem Zertifikate anbietet.

Aus dem Policy Dokument der Google PKI kann man nach meinem Verständnis entnehmen, dass Google zumindest zur Zeit nicht mit kostenfreien Angeboten wie Let’s encrypt konkurrieren will. Ich lese das aus der Beschreibung des Verfahrens zur Überprüfung der Identität von Antragsstellern bei der Zertifikatsbeantragung. Hier gibt es u. a. einen Aspekt, der eine Überprüfung der postalischen Adresse fordert. Das ist ein über die Domänenvalidierung der Gratisdienste hinausgehender Schritt, der sich nicht voll automatisieren lässt.

Meine Vermutung ist daher, dass Google zumindest mittelfristig nicht mit den existierenden CAs in direkte Konkurrenz treten, sondern seine CA nur für die eigenen Dienste nutzen wird. Auch damit wird diese CA allerdings schnell zu einer der CAs werden, deren Zertifikate den größten Teil des Internetverkehrs sichern.

Wann werden die Google Root Zertifikate in Webbrowsern auftauchen?

Google selbst weist in seinem Blogpost darauf hin, dass es einige Zeit dauert die Wurzelzertifikate für eine neue CA zu verbreiten. Hier müssen zunächst die großen Browseranbieter überzeugt werden die Zertifikate aufzunehmen. Gleiches gilt für die Betriebssystemhersteller (praktischerweise in einigen Fällen die gleichen Unternehmen). Und es müssen noch viele andere Dinge wie die Updategeschwindigkeiten der jeweiligen Produkte bedacht werden. Vermutlich wird man die Zertifikate zuerst in den Google-eigenen Produkten wie Chrome, ChromeOS und Android finden können, auch wenn Google bei Mozilla den entsprechenden Prozess schon im letzten Dezember angestoßen hat.

Google ist allerdings nicht dafür bekannt Dinge, die sie unbedingt wollen, von den Zeitplänen anderer abhängig zu machen. Daher hat man zwei bereits in Browsern und Betriebssystemen vorhandene Wurzelzertifikate gekauft und kann mit diesen schon jetzt nach eigenem Gutdünken verfahren. Faktisch ist damit Google bereits zur Root CA geworden. Der vorherige Screenshot zeigt eines dieser Zertifikate in Chrome.

Was soll man von der ganzen Sache halten?

“You can now have a website secured by a certificate issued by a Google CA, hosted on Google web infrastructure, with a domain registered using Google Domains, resolved using Google Public DNS, going over Google Fiber, in Google Chrome on a Google Chromebook. Google has officially vertically integrated the Internet.” – aduffy, 27.01.2017 auf ycombinator

Auf ycombinator findet man eine sehr ausführliche und meist gute Diskussion zu der Frage welche Auswirkungen dieser Schritt hat. Natürlich gibt es viele, die das zitierte Szenario eines über alle Ebenen des Internets integrierten Konzerns für bedrohlich / monopolistisch halten. Andere stellen die Frage warum man Google eigentlich so viel Vertrauen entgegen bringen sollte um nun auch noch ihrer CA zu trauen?

Die zweite Frage ist dabei für mich die einfachere: Wenn ich von meinem Android Smartphone über eine Google Suche eine Seite im Chrome Browser öffne vertraue ich Google sowieso schon sehr, sehr weitgehend. Wenn Google dann auch noch die Zertifikate verantwortet, die wenigstens die Google Dienste schützen, fällt für mich eine Stelle weg, der ich bisher auch noch vertrauen musste (die zuvor verwendete CA). Das ist eine Verbesserung.

Die Frage der Machtkonzentration bzw. des Monopols ist da wohl eher eine Gefühlsfrage: Aus meiner Sicht hat Google das Thema der Internetsicherheit in den letzten Jahren sehr vorangebracht und ist dabei in schwierigen Fragen wie z. B. der Bestrafung von versagenden CAs mehr oder weniger auf der richtigen Seite geblieben. Mit einer eigenen CA kann Google im besten Fall demonstrieren wie eine leistungsfähige und sichere PKI aussehen kann. Ich sehe das Ganze also positiv.

Eine andere Frage ist vielleicht die, ob dadurch CAs verschwinden werden? Heute sehen sich die existierenden Zertifizierungsstellen am unteren Ende durch Let’s encrypt bedrängt, welches für viele Webdienste Zertifikate in vollkommen ausreichender Qualität bereitstellt. Am oberen Ende mag es in Zukunft eine Konkurrenz durch die Google CA geben, aber nicht ohne Grund haben viele Länder eigene CAs gegründet und werden die ganz unabhängig von einem Google Angebot betreiben. Wenn dafür einige der kleineren CAs, die möglicherweise Probleme damit haben einen seriösen Betrieb zu leisten, am Ende verschwinden, so ist das für die Sicherheit des Internets dann eher gut.

Anti-DoS Tomcat Valve auf Github veröffentlicht

Auf Github findet sich jetzt unter dem Namen Anti-DoS Valve ein Werkzeug, welches beim Betrieb von Tomcat Servern nützlich sein kann um diese vor Überlastungen durch böswillige Akteure im Netz zu schützen. Dazu implementiert das Valve eine dynamische Zugriffsratenlimitierung, die sich umfangreich konfigurieren lässt. Zur Simulation der Auswirkungen unterschiedlicher Konfigurationen habe ich ein Google Drive Sheet veröffentlicht. Der Code steht unter der Apache Lizenz, kann also frei verwendet werden.

Woher kommt die Idee

Das Valve ist eine verallgemeinerte Version einer kleinen Programmierung, die ich im vergangenen Jahr kurzfristig erstellen musste, nachdem unsere Server immer mal wieder unter Überlastungen litten, die offenbar durch auf gekaperten Rechnern laufende Webcrawler verursacht wurden. Diese Zugriffe waren teilweise so aggressiv, dass sie Auswirkungen auf unsere regulären Nutzer hatten.

Zur Begrenzung dieser unwillkommenen Zugriffe standen zunächst unterschiedliche Optionen im Raum, aber die Option ein Tomcat Valve zu implementieren setzte sich am Ende aus diesen Gründen durch:

  • Ein Valve ist durch seine Verortung im Tomcat Server nahe an der Geschäftslogik bzw. an den Leuten, die wissen was auf dem Applikationsserver läuft. Eine Verortung etwa auf Netzwerkebene hätte einen nicht unerheblichen Wissenstransfer zwischen unterschiedlichen IT Bereichen erfordert
  • Da es sich bei den Angriffen – auch böswillige Webcrawler kann man dabei als Angreifer sehen – nicht um umfangreiche (D)DoS Angriffe handelte war eine Gegenmaßnahme auf Ebene der Applikationsserver ausreichend
  • Der Aufwand für die Programmierung des Valves war auf Grund der vorhandenen Erfahrungen vergleichsweise gering
  • Der Einsatz eines Filters mit identischer Funktion, der innerhalb der Webapplikationen eingesetzt würde, erzeugt im Vergleich zu einem Valve einen höheren Aufwand in der Konfiguration

Was macht das Valve

Ziel ist es unwillkommene Belastungen der eigenen Server so weit begrenzen zu können, dass sie nicht mehr in der Lage sind negative Auswirkungen auf die regulären Nutzer zu entfalten. Dabei soll die Schutzfunktion dynamisch sein, sich also selbstständig auf neue Angreifer einstellen und diese blockieren können. Und schließlich soll der Overhead dieser zusätzlichen Filterung, die zunächst für alle im Tomcat Server eingetreffenden Requests anspringt, möglichst klein sein. In der aktuellen Version arbeitet das Valve dabei auf der Ebene einzelner IP Adressen, für die Limitierungen durchgesetzt werden können.

Für die konkrete Implementierung wurden dann Erfahrungen genutzt, die ich früher bei anderen Programmierungen zu Ratenlimitierungen gemacht hatte, insbesondere beim Aufbau unserer Identity Provider Infrastruktur und der dort durchgesetzten Begrenzung der Anzahl von möglichen Versuchen zum Erraten eines Passworts.

Um die Implementierung ressourcenschonend zu gestalten – insbesondere in einer DoS Situation, wo schnell abertausende von Requests in kurzer Zeit eintreffen können – wird für die Ermittlung der aktuellen Zugriffsrate einer IP Adresse keine gleitende Auswertung gemacht, sondern es wird nur über die Anzahl der Zugriffe innerhalb eines bestimmten Zeitintervalls (in der Programmierung Slot genannt) Buch geführt. Wird innerhalb eines solchen Slots die Anzahl der erlaubten Zugriffe überschritten, so werden alle weiteren Zugriffe bis zum Ende des Slots abgelehnt. Damit nicht mit jedem neuen Slot das Spiel von vorn beginnt kann ein Anteil der in früheren Slots gezählten Zugriffe übernommen werden. Auf diese Weise sind sowohl die Datenhaltung im Valve wie auch Rechenaufwand gering und nehmen auch in einer Hochlastphase nicht wesentlich zu.

Über die Konfigurationsoptionen können dabei nahezu alle Eigenschaften gesteuert werden, neben dem Grenzwert der Zugriffe pro Slot auch die Slotlänge und der Umfang der aus früheren Slots übernommenen Requestanzahlen. Mit diesem einfachen Mittel lassen sich durchaus komplexe Filterungen realisieren.

Es gibt im Valve noch weitere Optionen, über die sich steuern lässt auf welchen Adressen die Ratenlimitierung überhaupt wirksam werden soll (hier kann man z. B. Requests auf statische Inhalte wie JS oder CSS Dateien ausschließen um schärfere Einstellungen zu realisieren) und ob bestimmte IP Adressen oder Adressbereiche generell von einer Filterung ausgenommen werden sollen (z. B. Adressen aus dem Intranet, um interne Nutzer nie zu beeinträchtigen).

Wie legt man los

Während die grundsätzliche Inbetriebnahme des Valves sehr einfach ist (Clone von Github, Ausführen von Maven Install, JAR in Tomcat/lib Verzeichnis kopieren, Valve Konfiguration in server.xml ergänzen), liegt die eigentliche Herausforderung darin die für den eigenen Anwendungsfall passenden Konfigurationsparameter zu finden. Hier gilt es die richtige Balance zu finden zwischen zu engen Einstellungen, die auch die regulären Benutzer beeinträchtigen können, und zu offenen Parametern, die die Angreifer nicht richtig im Zaum halten können und damit auch wieder die regulären Benutzer beeinträchtigen.

In der README findet sich ein eigener Abschnitt dazu, wie man bei der Inbetriebnahme vorgehen kann. Der Kernpunkt ist es hier ein ausreichendes Wissen über die reguläre Nutzung der eigenen Dienste zu haben, also welche Zugriffszahlen OK sind und welche ein böswilliges bzw. störendes Level erreichen. Die Auswertung der Tomcat Access Logfiles ist dabei der Schlüssel. Hat man diese Werte kann man in dem Simulator Sheet vergleichen welche Auswirkungen eine bestimmte Konfiguration hat und damit prüfen, ob sie in der Lage ist die Spreu vom Weizen zu trennen. Diese Knackpunkte gibt es dabei der Erfahrung nach:

  • Wie häufig greifen Suchmaschinen zu? Gutartige Suchmaschinen zeichnen sich meist durch gleichmäßige Zugriffe aus und haben keine Zugriffsspitzen. Je nach Valve Konfiguration kann es aber vorkommen, dass auch solche Zugriffsformen gesperrt werden, die dauerhaft unter den pro Slot erlaubten Zugriffsraten bleiben.
  • Dienen die eigenen Webapplikationen als Service Endpunkt, der von anderen Applikationsservern in großem Umfang genutzt wird? Wenn es sich dabei um gewollte Fälle handelt, so sollte man die entsprechenden Adressen bzw. Adressbereiche grundsätzlich freischalten, damit die Valve Konfiguration nicht auf Grund solcher Einzelfälle zu offen gestaltet sein muss.
  • Wie viele Request löst ein Benutzer beim ersten Besuch (also mit leerem Cache) der eigenen Seiten aus? Hier erreichen moderne Webseiten auf Grund der vielen Komponenten häufig erstaunliche Zahlen, wobei die Masse der Zugriffe auf statische Inhalte entfällt. Um auch hier die Valve Konfiguration nicht zu offen gestalten zu müssen ist es meist sehr sinnvoll die Zugriffe auf statische Inhalte nicht mit in die Zugriffszählungen eingehen zu lassen. Diese Zugriffe sollten sowieso nicht die Hauptlastverursacher in einer dynamischen Webapplikation sein und die böswillige Akteure werden sie sowieso nicht abrufen.
  • Kommen reguläre Benutzer in großer Zahl über Proxies auf den eigenen Server, so dass sich hinter einzelnen IP Adressen faktisch viele Benutzer verbergen?

Auch bei sehr sorgfältiger Vorbereitung ist es aber notwendig zumindest in der ersten Zeit nach der Aktivierung des Valves die Logging Informationen im Auge zu behalten und zu beobachten ob Adressen gesperrt werden, die man eigentlich zulassen möchte.

Ist das Valve richtig konfiguriert kann man es in gewisser Weise ‚vergessen‘, da es danach Angriffe automatisch im Zaum halten kann. Änderungsbedarfe ergeben sich dann nur noch bei Modifikationen an den im Server installierten Anwendungen, die das Lastverhalten beeinflussen. Trotzdem sollte ein Monitoring fortgesetzt werden, schon allein um zu sehen ob Angriffe erfolgen und in welchem Umfang.

Was sind die Grenzen

Das Anti-DoS Valve kann seinem Namen nur in einem Teilaspekt des weiteren Themas (D)DoS gerecht werden. Es wird z. B. nicht bei riesigen Überflutungen helfen, die schon die Netzwerkebene überlasten. Es hat aber seine Daseinsberechtigung in dem Bereich, der unterhalb des Angriffslevels liegt, der sich auf Netzwerkebene einfach erkennen lässt:

Im Fall unserer Server werden heute pro Tag normalerweise mehr als eine Million Requests verarbeitet. Starke Belastungen können aber schon entstehen, ohne das sich diese Zahl insgesamt vervielfacht, sofern die Zugriffe auf die entsprechenden Adressen gebündelt werden. An genau dieser Stelle kann das Valve eingesetzt werden, in dem es insbesondere die Zugriffe auf die Adressen reguliert, die geeignet sind hohe Belastungen zu erzeugen. Dafür ist eine Kenntnis der entsprechenden Applikationen und ihrer sensiblen Punkte notwendig.

Die ursprüngliche Version des Valves hat dabei den angestrebten Zweck bisher erfüllt und sich als sehr stabil erwiesen.

Monitoring per JMX

Das Valve kann sehr weitgehend per JMX administriert und beobachtet werden. In der JConsole präsentiert es sich dabei so:

Auf diese Weise können Konfigurationsänderungen auch am laufenden Server durchgeführt werden und gleichzeitig der aktuelle Status z. B. von blockierten IP Adressen beobachtet werden.

Ideen für die Weiterentwicklung

Die bisherige Implementierung hatte das Ziel möglicht einfach gehalten zu sein und ist auf den bisherigen Einsatzzweck zugeschnitten. Für eine Verallgemeinerung der Funktion bieten sich aber eine Reihe von Erweiterungen an:

  • Testmodus: Ein Option das Valve im Server so zu betreiben, dass nur Loggings über Blockaden erfolgen, aber keine echten Blockaden. Auf diese Weise könnten Konfigurationen zunächst risikofrei getestet werden.
  • Zähler auf Ebene von Subnetzen: Nicht nur echte DDoS Attacken verteilen ihre Zugriffe auf viele Ausgangsrechner, auch bei Webscrapern / böswilligen Crawlern kann dies beobachtet werden. Hier wäre eine Verallgemeinerung der Programmierung interessant, die in der Lage ist Zähler nicht nur auf Ebene von einzelnen IP Adressen zu führen. Die Implementierung des Monitors, der die Zugriffszählung durchführt, ist bereits entsprechend verallgemeinert worden.
  • Möglichkeit mehrere Instanzen des Valves im Server nutzen zu können: Zwar kann man heute das Valve mehrfach in einem Tomcat konfigurieren, aber die Monitor Instanz ist nicht getrennt und per JMX wird nur eine Instanz des Valves gezeigt. Die Nutzung unterschiedlicher Valve-Instanzen in einem Server kann nützlich sei falls unterschiedliche Konfigurationen für verschiedene Webapplikationen gefahren werden sollen.
  • Verbesserungen für den Einsatz in Serverfarmen: Heute müssen Konfigurationsänderungen an allen Servern separat erfolgen, auch gibt es keine Möglichkeit wie sich Instanzen des Anti-DoS Valves auf unterschiedlichen Servern verständigen können. In unserer Serverfarm beeinträchtigt uns das heute nicht, aber bei großen Farmen könnte so etwas nützlich sein.

Falls jemand Lust hat an dem Projekt mitzumachen: Einfach melden 🙂