Wie funktioniert Heartbleed: Der Code hinter dem Internet Security Alptraum
Nun Sie sicherlich Heartbleed gehört haben, verschlüsselt das Loch in der Internetsicherheit, die unzählige ausgesetzt Transaktionen zu jeder Angreifer, der wusste, wie man es zu missbrauchen. Aber wie funktioniert es eigentlich? Sobald Sie es brechen, ist es eigentlich unglaublich einfach. Und ein wenig komisch. Aber vor allem erschreckend.
Überblick über unsere Heartbleed lesen hier, aber im Allgemeinen Bedingungen Sie, was, die es ein Fehler im so genannten OpenSSL, ein Sicherheitsprotokoll ist, mit dem Computer und einem Server wissen, dass sie, sie sagen, sie sind. Es verließ Sehenswürdigkeiten wie Yahoo, Flickr und Imgur anfällig für Datendiebstahl für Jahre. Es ist ziemlich beängstigend Zeug, und lohnt sich ein genauerer Blick. Glücklicherweise ist es draußen für jedermann zu sehen.
Die Schönheit der Open-Source-Projekt wie OpenSSL ist, dass jeder Code betrachten kann; Es gibt keine Möglichkeit, alles drin mit Absicht verbergen. In der Tat sehen Sie genau wo Heartbleed geboren wurde und wo es behoben wurde, obwohl Sie möglicherweise nicht in der Lage, Kopf oder Zahl davon zu machen.
Das macht es so überraschend, dass Heartbleed für so lange unbemerkt. Zwei Jahre in der Schusslinie, selbst erfahrene Programmierer unsichtbar versteckt. Aber einmal schneiden Sie ins Herz der was falsch gelaufen, das Problem ist so klar wie Tag und umwerfend einfach.
Mein Herzschlag hören
Heartbleed ist kein Problem mit TLS/SSL-Technologien, die das Internet zu verschlüsseln. Es ist nicht einmal ein Problem mit wie OpenSSL in der Theorie funktioniert. Es ist nur eine dumme Codierung Fehler.
Wenn zwei Server bereit, einen verschlüsselten Handshake zu machen, führen sie etwas, nennt einen Herzschlag, ein Akt von der der Fehler seinen unglaublich schrecklichen Namen erhält.
Takte sind eine Möglichkeit für zwei Computer, die miteinander um sicherzustellen, dass der andere noch am Leben, ist so, dass wenn etwas während eines Prozesses schiefgeht, es gehen nicht zu sprechen sind. Sie tun dies, indem Sie Daten hin und her zu einander.
An den Server sendet der Client (das bist du) seinen Herzschlag (Ihre Bank sagen), und der Server übergibt es gleich wieder. So, wenn etwas schief läuft während der Transaktion (z. B. wenn ein Computer buchstäblich explodiert) voneinander wissen, weil die Herztöne synchron bekommen. Es ist wie dafür sorgen, dass beide Spindeln in eine Kassette bewegen, wenn du es spielst. Wenn eine Spindel aufhört und die andere hält geht, bricht etwas.
Es ist ein einfaches Verfahren, replizierte Millionen Mal am Tag auf der ganzen Welt. Aber irgendwie genervt Versionen von OpenSSL gelang es vermasseln. Sean Cassidy erklärt es wunderbar – und verrückte eingehend – auf seinem Blog Typ Existenzkrise. Aber die tatsächliche Verletzung, die das Internet in die Knie zu bringen ist passiert in diesem winzigen Codezeile:
Memcpy (bp, pl, Nutzlast);
Festhalten Sie dies wird noch ein wenig technisch, aber wir werden follow-up mit einer plumpen Metapher zu versuchen und klare Dinge ein wenig an Ihren Hintern.
Einfach (soweit möglich), Memcpy ist ein Befehl, der Daten kopiert, und es erfordert drei Stücke von Informationen an die Arbeit zu erledigen; Das sind die Begriffe in Klammern. Das erste Bit der Info ist das endgültige Ziel der Daten, die kopiert werden soll. Das zweite ist der Speicherort der Daten, die kopiert werden soll. Die dritte ist, dass die Menge der Daten des Computers wird zu finden, wenn es geht um die Kopie zu machen. In diesem Fall der bp ist ein Ort auf dem Servercomputer, pl ist, wo die eigentlichen Daten Clients gesendet wie ein Herzschlag, und Nutzlast ist eine Zahl, die wie große pl sagt.
Wichtig zu wissen, dass das Kopieren von Daten auf Computern schwieriger als es ist scheint denn es wirklich keine solche Sache wie "leer" Speicher gibt. Bp, die Stelle wo der Kundendaten ist kopiert werden, ist also nicht wirklich leer. Stattdessen ist es voll von Daten, die in diesem Teil des Computers vor saß. Der Computer wird nur als leer da, die Daten zum Löschen markiert wurde. Bis es mit neuen Daten gefüllt ist, ist das Ziel bp eine Reihe von alten Daten, die abgesegnet worden ist, um überschrieben werden. Es ist immer noch da.
Jetzt wenn Memcpy die Daten von pl nimmt und es in bp schlägt, deckt im Idealfall es auf alles, was alt, Datenmüll in bp. Immerhin sagt Nutzlast wie groß pl ist, und der Raum bei bp wurde geschaffen, um genau die gleiche Größe; eine perfekte Passform. Wenn es ohne eine Anhängevorrichtung losgeht, ist alles, die früher bei bp zerstört und mit der pl -Daten gefüllt. Und das ist, was an den Client gesendet wird: genau das, was sie in erster Linie geschickt. Was du mit Links ist ordentlich, die kleinen 1:1 Transaktion wo was geht auch wieder herauskommt.
Es funktioniert super – es sei denn, Nutzlast liegen. Wenn Nutzlast sagt, dass pl 64 KB ist, wenn es wirklich 0 KB, Sie haben ein Problem. Memcpy schafft eine große 64 KB Größe Landebahn bei bp , das voll von Datenmüll, aber dann bekommt keiner von den alten Daten bei bp überschrieben, denn es nichts gibt um es zu ersetzen, da pl tatsächlich leer ist. In der Praxis wird das bedeutet was Altdaten in bp vor den Herzschlag saß zurück an den Client übergeben. Manchmal, dass die Daten ist harmlos, manchmal ist es Ihre Banking-Passwort. So oder so, es landet irgendwo sollte es nicht.
Ich hab es? Kurzum: Lol Hoppla!
Eine ungeschickte Metapher
Okay, das ist verwirrend. Hier ist eine einfachere Möglichkeit, es zu verstehen, nehmen den Code aus ihm heraus völlig.
Stellen Sie sich vor, Sie haben eine ganze Reihe von Fotos, und du wirst zu einem Geschäft für ein Feld, um sie zu halten. Der Mann, der Laden läuft, sehr dumm und kann gar nicht zählen.
Sie gehen in diesem Shop mit 100 Fotos, und Sie schlagen sie auf die Theke zu sagen "Ich habe 100 Fotos." Der Besitzer Augen leuchten vor Freude. "Ich habe eine Box für alle!", sagt er. "Ich habe eine 100 Foto-Box!" Er zieht eine Schachtel unter der Theke hervor und sagt "hier ist es! Jemand ließ es hier voller Fotos, aber niemand braucht sie nicht mehr. "
Dann er ein Foto aus der Box nimmt, es brennt, stellt eines Ihrer Fotos in. Er tut dies immer wieder, bis er aus Fotos zu setzen in ist. Am Ende dieses Prozesses die Box ist jetzt voll von Ihren Fotos, und er schiebt es an Sie zurück. Sie haben Ihre Kiste voller Fotos und die alten Fotos werden zerstört. Hurra! Ein ordentlich wenig 1:1 Austausch.
Aber stellen Sie sich vor, Sie gab ihm nur eine anstelle von 100 Fotos. Sie Fuß bis zur Theke, eine schurkische Grinsen Grinsen, schlagen Sie Ihr ein Foto und sagen "Ich habe 100 Fotos." Wieder, der Besitzer hat eine Box für Sie, und zieht eine Kiste voll mit 100 Fotos, die jemand übrig. Wieder, er nimmt ein Foto out of the Box, brennt es und bringt Ihnen in. Dann – nach nur einem Foto – er ist alles aus Fotos, und weil er sehr dumme und kann garnicht zählen, er nimmt dadurch seinen Job getan und er schiebt die Box zurück zu Ihnen, mit Ihr ein Foto und 99 von jemand anderem. Er hat dein Wort für es, trotz aller Beweise entgegen genommen.
Dies bedeutet, dass Sie zu Fuß mit 99 Fotos, die Ihnen nicht gehören, und vielleicht einer von ihnen einer nackten Person ist! Punktzahl! Noch besser ist, ist dieser Kerl so dumme er sogar Null Fotos aus einer Null-Menge an Fotos unterscheiden kann. Wenn Sie nur sagen, Sie haben 100 Fotos und geben ihm buchstäblich nichts, geben er immer noch eine Schachtel mit 100 Fotos Ihnen, das jemand anderem gehört.
Im Falle von Heartbleed sind die Fotos Datenbits. Manchmal passen diese Datenmengen zusammen um eine e-Mail oder ein Kennwort oder ein Benutzername sein. Manchmal passen sie sogar zusammen um zu sein, eine große Website Passwort, einen Signaturstempel mit seinem Namen drauf und den Schlüsselcode zu seinem Sicherheitssystem. Die Auswahl von Botschaften, die Sie erhalten ist zufällig, aber Sie können es so oft wie Sie wollen, und schließlich Sie etwas gutes bekommen tun. Nur immer wieder gefragt, für Boxen.
Heartbleed bewusst ruchlosen Leute tun können: halten Sie fragt einen Server Informationen über und über, bis es wieder etwas saftig sendet.
Kleine Fehler bekommt ein kleines Update
Das Update? So einfach wie der Fehler.
* Art und Nutzlast Länge zuerst lesen * /
Wenn (1 + 2 + 16 > s-> s3-> rrec.length)
Return 0;
/ * schweigend verwerfen * /
Hbtype = * p ++;
N2S (p, Nutzlast);
Wenn (1 + 2 + Nutzlast + 16 > s-> s3-> rrec.length)
Return 0;
/ * schweigend verwerfen / RFC 6520 Sek. 4 * /
PL = p;
Dieses Stück Code hat zwei sehr einfache Jobs, erklärt Sean Cassidy. Die erste ist gegen Nulllänge Herzschläge zu überprüfen; stellt sicher, dass wenn Sie sagen, dass Sie die Server-Fotos geben, die du es eine Zahl ungleich Null von Fotos gibst. Der zweite Teil stellt sicher, dass du gibst die Anzahl der Fotos, was Sie sagen, dass du bist. Das war's.
Diese Art von Fehler ist üblich. Es hat sogar einen Namen: einen Puffer zu lesen Fehler. Wenn Sie jemals Code geschrieben haben, wissen Sie, dass "vergessen, eine offensichtliche Sache, Benutzereingaben zu überprüfen, die nie wirklich wahrscheinlich falsch zu tun" ist einer der häufigsten Fehler, die Sie jemals machen werde. Ich erinnere mich noch meine C++ Gymnasiallehrer pochen auf uns, die Länge der Eingabe des Benutzers zu überprüfen. Immer. Nur weildas ist, warum.
Zum Glück dieser OpenSLL Fehler ist einfach und die Lösung ist einfach ausrollen, obwohl, das ist sehr wenig, um den Schaden zu beheben, die bereits getan. Am Ende kommt es an diesem schrecklich und wunderbar Grundsatz des Rechnens, dass wir alle kommen gegen an einem Punkt oder anderen haben: ein Computer tut genau das, was Sie sagen, es zu tun, nichts weniger nicht mehr. Und weil dieser Computer vollkommen gehorsam ist und daher auch stumm wie die Hölle, Sie nicht leisten können.
Dank Ryan Giglio und Nathan Halabuda um Hilfe Auffrischung meiner Erinnerung wie Code funktioniert. Sie können in die Tiefe mit tollen Erklärer des Sean Cassidy noch tiefer tauchen.