Viren, Spyware, Datenschutz 11.241 Themen, 94.650 Beiträge

News: Fehler passieren!

Fatale Sicherheitslücke von Apple bei SSL

xafford / 20 Antworten / Flachansicht Nickles

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.

Quelle: opensource.apple.com

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:

Die verantwortliche Zeile im Code ist grau hinterlegt.

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.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Olaf19 xafford „Speicher war wohl der Hintergrund. Commodore wollte damals ...“
Optionen

Ich hatte ab 1987 erst den Atari 1040 ST/F, später den Mega ST4. Hauptmotivation der Anschaffung, immerhin für satte 2.000 DM: ich wollte Basic programmieren lernen.

Damals war das GFA Basic äußerst populär; ich hatte mich aber für Omikron entschieden, da ich das von einem befreundeten Kommilitonen kannte, der damit astronomische Berechnungen mit 19-stelliger Genauigkeit durchführen wollte [mein Username Olaf19 ist damit leider nicht erklärt - die 19 war immer schon eine Lieblingszahl von mir, warum auch immer].

Beide Basic-Dialekte hatten gemeinsam, dass man auf den bereits damals verpönten GOTO-Befehl praktisch komplett verzichten konnte. Es ließen sich eigene Prozeduren und Funktionen definieren, inkl. Parameterübergabe, und am Ende solcher Subroutinen wurde mit RETURN wieder an die Stelle zurückgesprungen, wo die Prozedur aufgerufen worden war (vorzeitiges Abbrechen mit EXIT, oder noch schlimmer: EXIT 2 oder gar EXIT 3, wenn um mehr als 1 Strukturebene zurückgesprungen werden sollte, war möglich, galt aber als äußerst unfein).

Pascal-Fans haben trotz aller Möglichkeiten, auch in Basic gut strukturiert zu programmieren, eifrig die Nase gerümpft über GFA und Omikron. C-Programmierung war damals auch schon populär (das Code-Beispiel von oben sieht sehr nach C aus, die Struktur mit den geschweiften Klammern ist typisch für C), und die ganz Harten - wie mein Kommilitone! - haben sich sogar an Assembler herangewagt.

10 GOTO 20
20 GOTO 10

Das erinnert mich spontan an die Musiksoftware Emagic Logic (heute: Apple Logic Pro oder Express). Die hängte sich dann und wann einfach so auf und brachte dann immer eine Alertbox auf den Schirm, mit der Meldung:

Circular structure... pls. report to Emagic how you managed to do this

:-)

Greetz
Olaf

Die Welt ist ein Jammertal ohne Musik. Doch zum Glueck gab es Bach, Beethoven, Haendel und Goethe (Helge Schneider)
bei Antwort benachrichtigen