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.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 131 Beiträge

(Bild: Shutterstock)

Von
  • Rainald Menge-Sonnentag

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.

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.

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.

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)