Bei Apple-Produkten gibt es aktuell einen ziemlich fatalen Fehler bei der Umsetzung von SSL - verschiedene Seiten haben bereits darüber berichtet. Mittlerweile gibt es für IOS bereits ein Update, welches aktuell ausgeliefert wird. Allerdings ist auch OSX betroffen, für welches es zum jetzigen Zeitpunkt jedoch noch kein Update gibt.
Um die Tragweite dieser Lücke abschätzen zu können muss man wissen, was SSL macht. Genau genommen macht SSL zwei Dinge:
- Per SSL wird eine Verbindung verschlüsselt, damit der Inhalt des Datenaustausches zweier Systeme im Netz nicht durch Dritte unberechtigt gelesen werden kann.
- Zudem soll SSL garantieren, dass das andere System mit dem sich der eigene Computer unterhält auch das ist, wofür es sich ausgibt.
Bei der aktuellen Lücke patzt Apple beim zweiten Punkt, denn die Prüfung des Zertifikates des anderen Systems findet nicht statt - jedes System kann also behaupten beispielsweise www.sparkasse.de zu sein. Dadurch ist natürlich auch die Verschlüsselung der Verbindung nichts mehr wert, denn ein böswilliger Nutzer kann, wenn er sich im gleichen Netz wie der Apple-Nutzer befindet, dessen Anfragen unbemerkt auf einen eignen Server umlenken und so sensible Daten abgreifen oder manipulieren.
xafford meint:
Doch was ist das genaue Problem? Hierzu ein Screenshot des betreffenden Codes mit Hervorhebung der schuldigen Code-Zeile und einer Erklärung dazu:
Der Fehler ist recht banal, denn eine Anweisung zum Sprung auf eine andere Code-Stelle wurde versehentlich(?) doppelt eingefügt. Dass hierdurch ein so fatales Problem entsteht ist aber erst dadurch möglich, dass der Programmierer hier wohl Tipp-Arbeit sparen wollte. Das will ich genauer erläutern.
Sogenannte If-Abfragen kann man unterschiedlich formulieren, zum Beispiel so:
if ( a = b ) { do_something(); }
oder so wie in obigem Code:
if ( a = b ) do_something();
Im letzten Fall gibt es jedoch eine Besonderheit: lässt man die geschweiften Klammern weg, so gilt die Abfrage nur für die nächste Anweisung, der fehlerhafte Code hat also in Wirklichkeit folgende Bedeutung:
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) { goto fail; } if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) { goto fail; } goto fail; if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) { goto fail; }
Die Zeile in der das Zertifikat wirklich geprüft wird wurde also nie erreicht, denn "goto fail" wird immer vorher ausgeführt. Dies bedeutet, dass die Ausführung an dieser Stelle unterbrocken wird und an der Stelle weiter ausgeführt wird, wo "fail" definiert ist - der Code nach diesem Goto kommt nicht zur Ausführung.
Hierzu kommt noch, dass die Variable err, die einen Fehler signalisieren und als Rückgabewert dient an der betreffenden Stelle im Normalfall den Wert 0 (Null) hat, die Funktion also immer zurück gibt, dass kein Fehler aufgetreten ist.
Der Fehler ist so banal wie fatal - jeder betroffene Nutzer sollte schnellstmöglich das Update einspielen.