Zusammenfassung

  • RFC 1948 beschrieb einen Angreifer, der die Anfangsnummer einer echten Verbindung ablas, die IP-Adresse eines vertrauten Rechners fälschte und die nächste Nummer des Servers erriet, um eine Antwort zu bestätigen, die er nie sah.
  • Die vorgeschlagene Berechnung behielt die laufende Zeitkomponente M für Neuauflagen derselben Verbindung und addierte einen geheimen Versatz F pro Kombination aus zwei Adressen und zwei Ports. Eine beobachtete Nummer verriet nicht länger die Startlinie einer anderen Kombination.

Der Dieb trat zunächst ganz ordentlich auf: Er öffnete selbst eine TCP-Verbindung und notierte die Anfangsnummer des Servers. RFC 1948 vom Mai 1996 zeigte, wie diese Probe bei der Vorhersage der nächsten Nummer half. Danach gab sich der Angreifer als Rechner aus, dem der Server aufgrund seiner IP-Adresse vertraute. Die Serverantwort erreichte den wirklichen Rechner, nicht den Angreifer. Mit einer guten Vorhersage und einem zum Schweigen gebrachten Original konnte der Angreifer trotzdem die letzte Bestätigung schicken. Ein befehlsfähiger Dienst, der auf Adressvertrauen baute, ließ den falschen Besucher herein.

Das Leck lag zwischen zwei Gesprächen. Die echte Verbindung offenbarte eine initiale Sequenznummer, ISN. Berkeley-abgeleitete TCP-Kerne erhöhten diese Nummer laut RFC 1948 in berechenbaren Schritten mit der Zeit und jeder neuen Verbindung. Das gefälschte Gespräch brauchte die folgende ISN. Wer sie aus der ersten ableiten konnte, beendete den Verbindungsaufbau ohne Blick auf die Antwort an die vorgetäuschte Adresse. Der Nummernautomat verriet seinen nächsten Zettel.

Einfach jede Nummer auswürfeln? RFC 793, die ursprüngliche TCP-Spezifikation, ließ eine Uhr für Anfangsnummern voranschreiten. Bei einer späteren Verbindung derselben Endpunkte sollten alte Pakete einer früheren Inkarnation ihren Platz verlieren. RFC 1948 erwähnte außerdem TIME-WAIT-Heuristiken in BSD-abgeleiteten Systemen. Unterschiedliche Gespräche brauchten getrennte Anfangspunkte; wiederholte Inkarnationen eines Gesprächs brauchten zeitlichen Abstand. Reiner Zufall passte nur zu einer Hälfte der Aufgabe.

RFC 1948 teilte sie auf. Eine TCP-Verbindung wird durch lokale IP-Adresse und Port sowie entfernte IP-Adresse und Port bestimmt. Für dieses Vierertupel sollte die Anfangsnummer M + F(Vierertupel) lauten. M war die weiterlaufende Uhr. F war ein Versatz aus dem Tupel und geheimem Material. Jedes Tupel bekam eine eigene Nummernspur; bei erneutem Gebrauch desselben Tupels schob die Uhr die Startlinie weiter. Die Spur am Nachbarschalter blieb aus der eigenen Probe unbekannt.

Der Versatz musste von außen unberechenbar sein. RFC 1948 schlug einen kryptografischen Hash über Tupel und geheime Daten vor und nannte das damals verfügbare MD5 als Beispiel. Zufallszahl, Rechnergeheimnis, Startzeit und Maschinenidentität kamen als Bestandteile in Betracht. Ein durchschaubares F hätte dem Dieb den Fahrplan zurückgegeben. Die Formel ersparte zugleich das dauerhafte Speichern aller bereits geschlossenen Verbindungen.

Mit einem neuen Geheimnis verschob sich aber eine alte Spur. Wenn eine laufende Maschine ihren Schlüssel wechselte und dasselbe Tupel erneut auftrat, konnten frühere Pakete noch unterwegs sein. RFC 1948 verlangte dann entweder erhaltenen Zustand der beendeten Verbindung oder Ruhe für zwei maximale Segmentlebenszeiten. Der Schlüssel verbarg die Unterschiede zwischen Spuren; die Uhr sorgte für Ordnung innerhalb einer Spur. Beim Austausch des Schlosses musste der alte Gastverkehr bedacht werden.

Der spätere RFC 6528 von 2012 machte den Entwurf zum Standard, löste RFC 1948 ab und aktualisierte RFC 793. Er beschrieb die Pseudozufallsfunktion samt Vierertupel und Geheimschlüssel genauer, hielt M + F fest und behandelte Schlüssellänge sowie Wechsel. Der Eingriff von 1996 blieb erhalten: Zeit führte eine Verbindungsidentität weiter, ein Geheimnis trennte sie für Außenstehende von den anderen.

Der Dieb durfte weiterhin einen Zettel ziehen. RFC 1948 nahm ihm das Lineal, mit dem er aus dieser Nummer den Anfang am nächsten Schalter ausmaß. Dessen Versatz lag hinter dem Tresen.