8 geben: Python-Standard-Library ignoriert das Oktalystem in IP-Adressen
Die Library ipaddress prüft IP-Adressen seit 2019 nicht mehr auf führende Nullen. Ein Patch ist in Sicht, aber noch nicht veröffentlicht.
Sicherheitsforscher haben auf ein Sicherheitsrisiko bei der Auflösung von IP-Adressen in der Python-Library ipaddress
hingewiesen. Die Bibliothek dient zum Verarbeiten von IPv4- und IPv6-Adressen und bietet unter anderem Komfortfunktionen zum Erzeugen von Adressobjekten aus Strings. Sie ignoriert aber fĂĽhrende Nullen als Kennzeichnung, dass die Adresse als Oktalzahl angegeben ist.
Die Forscher hatten im März auf die gleiche Problematik in dem npm-Paket Netmask hingewiesen, das inzwischen in einer aktualisierten Version verfügbar ist, die Oktalzahlen korrekt auswertet. Für die Python-Bibliothek existiert noch kein Patch. Anfangs hatte die in Python 3.3 eingeführte Bibliothek Eingaben noch auf potenzielle Oktalzahlen geprüft. Auch in der Dokumentation findet sich ein Hinweis auf die Prüfung.
UnĂĽblich, aber unsicher
Zwar hatte die Library auch früher die Werte mit einer führenden Null nicht umgerechnet, aber aufgrund der Unklarheit einen Fehler ausgegeben. In den Patch-Notes zu Version 3.8.0a4 findet sich jedoch die Änderung, dass die Library führende Nullen ignoriert, statt sie als Hinweis auf Oktalzahlen zu werten. Der zugehörige Pull Request stammt aus dem Mai 2019.
In der Tat interpretieren zwar die meisten Browser als auch viele Kommandozeilentools die führende Null als Hinweis auf eine Oktalzahl, aber die Nutzung dürfte weitgehend unüblich sein, wie unter anderem die Reaktionen im Forum auf die Heise-Meldung zur Schwachstelle in Netmask gezeigt hat. Gerade deshalb lässt sich der Fehler jedoch ausnutzen.
Eine Null mit viel Gewicht
Bei der Auswertung von IP-Adressen zeigt eine fĂĽhrende 0 ĂĽblicherweise an, dass die Adresse nicht im Dezimalformat, sondern im Oktalsystem angegeben ist. So geht ein ping
zu der vermeintlich externen Adresse 0177.0.0.1
auf den localhost 127.0.0.1
. Der Aufruf in Chrome und anderen Browsern fĂĽhrt ebenfalls auf die interne Adresse.
Damit öffnet sich ein möglicher Angriffsvektor auf Software, die ipaddress
verwendet: Während die Zieladresse im Browser eine lokale ist, erkennt sie eine Python-Anwendung womöglich als extern. Dasselbe gilt umgekehrt für die Adresse 0127.0.0.1
, die ipaddress
als lokal interpretiert, die aber im Browser auf die Adresse 87.0.0.1
fĂĽhrt.
Analog dazu sind die privaten Adressbereiche mit den CIDR-Notationen 10.0.0.0/8
, 172.16.0.0/12
und 192.168.0.0/16
durch das Einfügen einer führenden 0 vermeintlich nach wie vor privat, aber beim Auflösen durch den Browser im öffentlichen Adressraum aufgehängt. Auf die Weise lassen sich unter anderem SSRF-Angriffe (Server-side Request Forgery) umsetzen, wenn eine Anwendung ipaddress
nutzt, um zu entscheiden, ob ein Request erlaubt ist.
Diskussionen rund um die 0
Derweil findet in der Issues-Verwaltung von Python eine Diskussion darüber statt, wie und in welchen Releases die Community die Schwachstelle beheben wird. Während manche keine große Dringlichkeit erkennen, geht der Tenor in die Richtung, dass ein Fix nicht nur für das kommende Python 3.10, sondern auch für die ebenfalls betroffenen Versionen 3.8 und 3.9 erforderlich ist.
Weitere Details zum Fund der Schwachstelle finden sich in dem Blogbeitrag der Sicherheitsforscher. Der Fund dürfte nicht der letzte seiner Art sein, was die grundsätzliche Frage in den Raum stellt, ob es nicht allgemein sinnvoller wäre, die wenig genutzte und leicht zu übersehende Auszeichnung von Oktalzahlen über eine führende Null in vielen Anwendungen und Browsern zu überdenken. Auch wenn sie historisch gewachsen ist, ist sie deutlich weniger offensichtlich als beispielsweise die Kennzeichnung von Zahlen im Hexadezimalsystem über 0x
oder im Dualsystem ĂĽber 0b
, die jeweils neben der fĂĽhrenden Null einen Buchstaben enthalten.
(rme)