In dem Tool zur Datenübertragung über das Netzwerk, curl, und der parallel dazu entwickelten Bibliothek libcurl wurde eine Schwachstelle (CVE-2023-38545) entdeckt, die zu einem Pufferüberlauf führen kann und potenziell die Ausführung von Angreifer-Code auf der Client-Seite ermöglicht, wenn mit dem curl-Tool oder einer Anwendung, die libcurl verwendet, auf einen HTTPS-Server zugegriffen wird, der von einem Angreifer kontrolliert wird. Das Problem tritt nur auf, wenn in curl der Zugriff über den SOCKS5-Proxy aktiviert ist. Bei direktem Zugriff ohne Proxy tritt die Schwachstelle nicht auf. Die Schwachstelle wurde in der curl-Version 8.4.0 behoben. Der Sicherheitsforscher, der den Fehler entdeckte, erhielt eine Belohnung in Höhe von $4660 im Rahmen der Internet Bug Bounty-Initiative auf Hackerone.
Die Schwachstelle wird durch einen Fehler im Hostnamenauflösungs-Code vor dem Zugriff auf den SOCKS5-Proxy verursacht. Bei einer Länge von bis zu 256 Zeichen übergibt curl den Hostnamen sofort an den SOCKS5-Proxy zur Auflösung auf dessen Seite, während bei einem Namen, der länger als 255 Zeichen ist, auf den lokalen Resolver umgeschaltet wird und bereits die bestimmte Adresse an den SOCKS5-Proxy übergeben wird. Aufgrund eines Fehlers im Code konnte das Flag, das angibt, dass eine lokale Auflösung erforderlich ist, während der langsamen Aushandlung der Verbindung über SOCKS5 auf einen falschen Wert gesetzt werden, was dazu führte, dass der lange Hostname in den für die Speicherung vorgesehenen Puffer geschrieben wurde. IP-Adressen oder einen Namen, der 255 Zeichen nicht überschreitet.
Der Website-Besitzer, auf den curl über den SOCKS5-Proxy zugreift, kann einen Pufferüberlauf auf der Client-Seite initiieren, indem er einen Weiterleitungsstatuscode (HTTP 30x) zurückgibt und im Header 'Location:' eine URL mit einem Hostnamen übergibt, dessen Größe im Bereich von 16 bis 64 KB liegt (der Wert von 16 KB ist durch die minimale Größe bedingt, die erforderlich ist, um den zugewiesenen Puffer zu überlaufen, während der Wert von 65 KB sich auf die maximal zulässige Länge eines Hostnamens in einer URL bezieht). Wenn in den libcurl-Einstellungen die Weiterleitung von Anfragen erlaubt ist und der verwendete SOCKS5-Proxy ausreichend langsam ist, wird der lange Hostname in einen kleinen Puffer geschrieben, dessen Größe von vornherein geringer ist.
Die Schwachstelle betrifft hauptsächlich Anwendungen, die auf libcurl basieren, und tritt in dem curl-Tool nur auf, wenn die Option '—limit-rate' mit einem Wert kleiner als 65541 verwendet wird – in libcurl wird standardmäßig ein Puffer mit einer Größe von 16 KB zugewiesen, während im curl-Tool ein solcher Puffer mit 100 KB ausgestattet ist, jedoch variiert diese Größe je nach Wert des Parameters '—limit-rate'.
Daniel Stenberg, der Autor des Projekts, erwähnte, dass die Schwachstelle 1315 Tage lang unentdeckt blieb. Es wurde außerdem gesagt, dass 41 % der zuvor entdeckten Schwachstellen in curl wahrscheinlich hätten vermieden werden können, wenn curl in einer Sprache geschrieben worden wäre, die einen sicheren Umgang mit dem Speicher gewährleistet, jedoch ist nicht geplant, curl in naher Zukunft in eine andere Sprache umzuschreiben. Als Maßnahmen zur Erhöhung der Sicherheit des Codes wird vorgeschlagen, die Testwerkzeuge zu erweitern und aktiver Abhängigkeiten zu nutzen, die in Programmiersprachen geschrieben sind, die einen sicheren Umgang mit dem Speicher ermöglichen. Außerdem wird die schrittweise Ersetzung von Teilen von curl durch Varianten, die in sicheren Sprachen wie dem experimentellen HTTP-Backend Hyper, das in Rust implementiert wurde, geschrieben sind, in Betracht gezogen.
Quelle: opennet.ru
