In den Standardbibliotheken der Programmiersprachen Rust und Go wurden Schwachstellen festgestellt, die mit der fehlerhaften Verarbeitung von IP-Adressen mit octalen Ziffern in den Adressparserfunktionen verbunden sind. Diese Schwachstellen ermöglichen es, die Überprüfungen der gültigen Adressen in Anwendungen zu umgehen, beispielsweise um auf Loopback-Adressen (127.x.x.x) oder Intranet-Subnetze bei SSRF-Angriffen (Server-Side Request Forgery) zuzugreifen. Diese Schwachstellen setzen den Zyklus von Problemen fort, die zuvor in den Bibliotheken node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE-2021-29921), Data::Validate::IP (Perl, CVE-2021-29662) und Net::Netmask (Perl, CVE-2021-29424) identifiziert wurden.
Gemäß der Spezifikation sollten Zeichenfolgenwerte IP-Adressen, die mit null beginnen, als oktale Zahlen interpretiert werden, aber viele Bibliotheken berücksichtigen dieses Merkmal nicht und werfen die Null einfach ab, indem sie den Wert als dezimale Zahl behandeln. Zum Beispiel ist die Zahl 0177 im octalen System gleich 127 im dezimalen. Ein Angreifer könnte eine Ressource anfordern, indem er den Wert „0177.0.0.1“ angibt, der in dezimaler Darstellung „127.0.0.1“ entspricht. Bei Verwendung einer problematischen Bibliothek erkennt die Anwendung nicht, dass die Adresse 0177.0.0.1 im Subnetz 127.0.0.1/8 enthalten ist, kann jedoch tatsächlich bei der Anfrage auf die Adresse „0177.0.0.1“ zugreifen, die von den Netzwerkfunktionen als 127.0.0.1 behandelt wird. Ähnlich kann auch die Überprüfung über Intranet-Adressen getäuscht werden, indem Werte wie „012.0.0.1“ angegeben werden (äquivalent zu „10.0.0.1“).
In Rust war die Standardbibliothek „std::net“ von dem Problem betroffen (CVE-2021-29922). Der IP-Adressparser dieser Bibliothek warf die Null vor den Werten in der Adresse ab, aber nur, wenn nicht mehr als drei Ziffern angegeben wurden, beispielsweise wird „0177.0.0.1“ als ungültiger Wert betrachtet, während für 010.8.8.8 und 127.0.026.1 ein falsches Ergebnis zurückgegeben wird. Anwendungen, die std::net::IpAddr zur Analyse von vom Benutzer angegebenen Adressen verwenden, sind potenziell anfällig für SSRF-Angriffe (Server-Side Request Forgery), RFI (Remote File Inclusion) und LFI (Local File Inclusion). Die Schwachstelle wurde in der Rust-Version 1.53.0 behoben.

In der Programmiersprache Go ist die Standardbibliothek "net" von einem Problem betroffen (CVE-2021-29923). Die eingebaute Funktion net.ParseCIDR ignoriert führende Nullen bei oktalen Zahlen, anstatt sie zu verarbeiten. Beispielsweise kann ein Angreifer den Wert 00000177.0.0.1 übermitteln, der bei der Überprüfung in der Funktion net.ParseCIDR(00000177.0.0.1/24) als 177.0.0.1/24 interpretiert wird, nicht als 127.0.0.1/24. Das Problem zeigt sich auch auf der Kubernetes-Plattform. Die Schwachstelle wurde in der Go-Version 1.16.3 und der Beta-Version 1.17 behoben.


Quelle: opennet.ru
