Sicherheitsrelevanter Bug in net-Bibliothek von Go und Rust
Die Bibliothek net in Go und Rust verhält sich nicht standardkonform und verschluckt führende Nullen. Angreifer könnten so falsche IP-Adressen einschleusen.
Die Bibliothek net
kümmert sich in den Programmiersprachen Go und Rust um den Umgang mit IP-Adressen und TCP- und UDP-Verbindungen. In der Implementierung der IPv4-Adressprüfung wich der Code aber vom De-Facto-Standard ab und behandelte Adressen in oktaler Darstellung falsch. Das hätten Angreifer ausnutzen können, um Verkehr auf ihre IP-Adressen umzuleiten.
Den Fehler fanden die Sicherheitsforscher Cheng Xu, Victor Viale, Sick Codes, Kelly Kaoudis, John Jackson, Nick Sahler und opennota, informierten die Maintainer von Rust und Go und stellten ihre Erkenntnisse im Rahmen der Konferenz DEF CON vor, nachdem Patches fĂĽr die Sprachen bereitstehen.
Oktale Uneindeutigkeit
IPv4-Adressen können in unterschiedlichen Formaten angegeben werden. Üblich ist eine Darstellung mit vier Blöcken im dezimalen System mit Werten zwischen 0 und 255. Selten und mehr ein historisches Relikt, aber auch möglich, ist eine Angabe in vier Blöcken im Oktalsystem. 255 im Dezimalsystem entspricht 377 in oktaler Darstellung. Weil man einer Zahl von außen nicht ansieht, ob sie im Dezimal- oder im Oktalsystem notiert ist, ist das etablierte Verfahren, die vier Blöcke je mit einer führenden Null aufzufüllen. Die Heise-IP-Adresse 193.99.144.80 kann man also auch als 0301.0143.0220.0120 darstellen. Browser können damit zum Beispiel umgehen. Es meldet sich in beiden ein Heise-Server (der angezeigte Zertifikatsfehler entsteht, weil der Browser beim direkten Öffnen einer IP-Adresse den Host-Header nicht mitschickt).
Mit dieser Uneindeutigkeit und der Darstellung mit führenden Nullen befasst sich auch ein Dokument der IETF. Dort werden die uneindeutigen Adressen und auch die Lösung, oktalen Adresen Nullen voranzustellen, zwar kritisiert, sie seien aber "far too widespread to ignore." Als Entwickler einer IPv4-Bibliothek muss man sich um diesen Sonderfall also kümmern.
Genau das taten aber die Entwickler der net
-Bibliotheken nicht, die in Go und Rust zum Einsatz kommen. Anstatt die vierstelligen Blöcke als Oktalzahlen zu behandeln, ließen sie die führende Null einfach unter den Tisch fallen und behandelten die Zahlen wie dezimale Zahlen. In vielen Fällen führt das schlicht zu ungültigen Adressen – die Adresse 301.143.220.120 existiert nicht, weil 301 größer als 255 ist. Sicherheitsrelevant und verhängnisvoll kann das werden, wenn die betroffenen Bibliotheken dazu benutzt werden, IP-Adressen zu validieren, etwa um Zugriffe anhand der IP-Adresse zu erlauben. Im schlimmsten Fall interpretiert ein Server eine oktale Adresse falsch und kontaktiert den falschen Server.
Die Entdecker sehen durchaus die Gefahr, dass Angreifer dadurch eine Server-Side-Request-Forgery-Attacke erfolgreich umsetzen und einen Server dazu bringen könnten, statt einer vertrauenswürdigen eine externe Adresse unter Kontrolle der Angreifer zu kontaktieren. Damit das gelingt, müssten Angreifer aber eine genau passende IP-Adresse in ihrem Besitz haben, um gezielt Verkehr umzuleiten. Das klingt unwahrscheinlich, es ist im Rahmen von massenhaften Versuchen bei vielen Systemen aber durchaus im Bereich des Möglichen, dass Angreifer irgendwann erfolgreich sind.
Programmiersprache aktualisieren
Entwickler, die Systeme in Rust oder Go bauen, die IP-Adressen vom Nutzer entgegennehmen und mit der Bibliothek net
verarbeiten, sollten auf die aktuelle Version von Rust und Go aktualisieren und ihre Anwendungen damit neu kompilieren.
In Go ist das Problem erst in der Beta 1.17 repariert. Für Rust hat Mit-Entdecker Cheng Xu am 29. März einen Fix vorgeschlagen, der schon am 31. März angenommen wurde. Ab Rust 1.53 ist das Problem beseitigt.
(jam)