Zephyrnet-Logo

Heimrouter mit NetUSB-Unterstützung könnten ein kritisches Kernel-Loch haben

Datum:

Jetzt, da ein Patch an die Anbieter verteilt wurde, haben die Forscher von Sentinel One dies getan veröffentlichte Details eines besorgniserregenden Fehlers in einem IoT-Softwaretreiber namens NetUSB.

Das Produkt stammt von einem taiwanesischen Hardware- und Softwarehersteller namens Kcodes, die sich wie folgt beschreibt:

[A] führender Anbieter und Entwickler von USB-over-IP-Technologieprodukten. Heute sind über 20 % der weltweiten Netzwerkgeräte mit der KCodes-Lösung eingebettet.

Die Idee ist gut: NetUSB ist ein virtueller Anschluss für USB-Hardware, sodass Sie eine Reihe verschiedener USB-Geräte direkt an Ihren Router anschließen und dann von einigen, vielen oder allen anderen Geräten in Ihrem Netzwerk aus remote darauf zugreifen können .

Anstatt ein USB-Gerät wie ein Laufwerk, einen Drucker oder einen TV-Tuner gemeinsam zu nutzen, indem Sie es abwechselnd an Ihre verschiedenen Laptops, Desktops und Mobiltelefone anschließen, schließen Sie das USB-Gerät dauerhaft an das virtuelle Zentrum Ihres Netzwerks an, indem Sie es anschließen zu Ihrem Router.

Dann teilen Sie es mit einem „virtuellen USB-Kabel“, das die USB-Daten über Ihr drahtloses Netzwerk statt über ein physisches Kabel mischt – ähnlich wie Sie mit Windows Laufwerksbuchstaben, Verzeichnisse und Dateien über das Netzwerk umleiten können NET USE Befehl.

Kernel-Treiber offen für Internetverkehr

Sentinel-One-Forscher Max van Amerongen dachte, es könnte einen Code geben, in den man sich einarbeiten sollte er untersuchte einen NetGear-Router im Jahr 2021 und fand einen Kernel-Treiber, der auf TCP-Port 20005 auf Netzwerkverbindungen wartet.

Bezeichnenderweise hat der Treiber die Netzwerkschnittstelle abgehört 0.0.0.0, was eine Abkürzung für „alle Schnittstellen“ ist, also abdeckt localhost, das interne LAN und die extern angeschlossene WAN-Schnittstelle.

Die verwendete Netzwerkschnittstelle für localhost ist nur für Programme zugänglich, die direkt auf dem Router selbst laufen – tatsächlich ist die „Netzwerkkarte“ für diese Schnittstelle vollständig in Software implementiert und erhält normalerweise die IP-Nummer 127.0.0.1 in IPv4-Netzwerken.

Das interne LAN hat in der Regel eine sogenannte „private“ IP-Nummer 192.168.x.x or 10.x.x.x, das nur im LAN selbst gültig ist und daher standardmäßig von außen nicht zugreifbar ist.

Sondern Ihre WAN-Schnittstelle, wofür WAN kurz ist Weitverkehrsnetz, und bedeutet frei übersetzt „das Internet in seiner Gesamtheit“, hat normalerweise eine öffentliche IP-Nummer, die oft automatisch von Ihrem ISP vergeben wird, wenn Ihr Router hochfährt.

Sie sollten davon ausgehen, dass Ihre WAN-Schnittstelle von überall auf der Welt sichtbar und zugänglich ist.

Mit anderen Worten, TCP-Netzwerkdienste, die explizit auf dem WAN-Port oder implizit durch Angabe einer Catchall-IP-Nummer lauschen 0.0.0.0, sind im Allgemeinen ausgesetzt, können von fast jedem untersucht und (wenn fehlerhaft) von fast jedem ausgenutzt werden.

Schlimmer noch, die meisten Computer, die nach Verbindungen von der Außenwelt lauschen – ob zufällig oder absichtlich –, werden automatisch, regelmäßig und wiederholt gefunden und angegriffen.

Selbst wenn Sie nicht offen für Besucher werben, wie Sie es vielleicht tun würden, wenn Sie Ihren eigenen Webserver oder Ihre eigene Blogging-Site betreiben, werden Sie sowohl von Forschern als auch von Gaunern gefunden, ohne es wirklich zu versuchen, normalerweise innerhalb von Minuten nach dem Hochfahren Ihres Routers.

Das IPv4-Netzwerk kann ungefähr 4 Milliarden verschiedene gleichzeitig verbundene und eindeutig identifizierbare Geräte unterstützen (das liegt daran, dass eine 32-Bit-Netzwerknummer maximal 2 annehmen kann32 andere Werte und 232 = 4,294,967,296)…

…aber bei heutigen Netzwerkgeschwindigkeiten kann selbst eine vergleichsweise bescheidene kommerzielle Internetverbindung alle möglichen IP-Nummern ausprobieren – Milliarden davon! – in Stunden oder sogar Minuten.

Einfach ausgedrückt, jemand, der Ihren anfälligen Router finden möchte, kann und wird dies tun, ohne Sie speziell angreifen zu müssen, da es überraschend einfach ist, darauf abzuzielen jemand durch buchstäblich versuchen jedermann.

Pufferüberlauf

Van Amerongen brauchte nicht lange, um ein Problem im Code zu finden, der eingehende Netzwerkdaten im Kcodes-NetUSB-Treiber verarbeitete.

Wie bei vielen TCP-Protokollen besteht der erste Schritt darin, den Befehl, den der Benutzer ausführen möchte, einzulesen und zu identifizieren.

Wenn Sie schon einmal mit HTTP gearbeitet haben, wissen Sie, dass eingehende Befehle in den ersten paar Bytes des ersten Netzwerkpakets angegeben werden, wobei für Menschen lesbare Bytesequenzen wie verwendet werden GET, HEAD, POST und OPTIONS.

In NetUSB werden Befehle mit numerischen Codes angegeben, nicht mit Textzeichenfolgen, und van Amerongen entdeckte einen mit der Nummer 0x805F (32,863), der von einer aufgerufenen C-Funktion verarbeitet wurde SoftwareBus_dispatchNormalEPMsgOut.

(Wir wissen nicht, was ein EP Nachricht bedeutet in diesem Zusammenhang, aber das spielt keine Rolle, denn es ist nicht der Befehl selbst, der die Lücke erzeugt, sondern die Vorbereitung für die Verarbeitung des Befehls.)

Nachdem diese Funktion nach Nummer ausgewählt wurde, liest sie einen 32-Bit-Wert ein, der die Größe der Nachricht angibt, die der Benutzer senden möchte, und weist genügend Kernel-Speicher zu, um das zu speichern, was als nächstes kommt.

Abgesehen davon, dass der Code nicht ganz so funktioniert, weil er tatsächlich „so viel Speicher wie der Benutzer angefordert hat, plus zusätzliche 17 Bytes, die wir während der Verarbeitung verwenden“.

Diese zusätzlichen 17 Bytes führen die Sicherheitslücke ein.

Im Pseudocode macht der Treiber Folgendes:

 U32 size = read(socket,4); // get 32-bit size from network void* buff = kernel_alloc(size+17); // allocate the needed memory, plus 17 additional bytes if (buff == NULL) { error(...); } // make sure there was enough memory [... accept data into buff...]

Später liest der Code Daten vom anderen Ende ein – bis zu, aber nicht unbedingt, size Bytes wert – und kopiert dann alle empfangenen Daten in den zugewiesenen Speicherbereich buff.

Sie haben wahrscheinlich das Problem erkannt.

Wenn der Benutzer den Treiber auffordert, eine große Menge an RAM durch Einstellung zuzuweisen size auf, sagen wir, einen Wert von 3 Milliarden (was in 32 Bit passt – siehe oben), die kernel_alloc() wird mit ziemlicher Sicherheit fehlschlagen und die Funktion wird ordnungsgemäß fehlschlagen.

Aber wenn der Benutzer nach fast, aber nicht ganz fragt, 232 Bytes RAM, dann ergibt sich die tatsächlich angeforderte Menge beispielsweise als (0xFFFFFFFF + 17).

Abgesehen davon, dass mit nur 32 Bits gespielt werden kann, weist die oben gezeigte Summe ein „Millennium-Bug“-Problem auf, weil (0xFFFFFFFF + 17) = 0x10000010, was 33 Bits lang ist.

Die Summe läuft also über und wird wieder in 32 Bits als nur 0x10 (16) „gequetscht“, genauso wie AD1999+1 aufgrund des Y1900K-Bugs auf das Jahr AD2 zurückspringen würde, wenn Sie nur zwei Ziffern zur Verfügung hätten das Jahr darstellen.

Mit anderen Worten, ein Angreifer könnte nach 2 fragen32-1 Datenbyte (0xFFFFFFFF); würde fälschlicherweise einen Puffer von nur 16 Bytes erhalten; und konnten dann so viele Daten senden, wie sie wollten, ob das 100 Bytes, 1000 Bytes oder tatsächlich jede Menge bis zu 0xFFFFFFFF Bytes waren…

…aber alle Bytes ab dem 17. würden einen Pufferüberlauf verursachen.

Sentinel One ging bei diesem Angriff nicht weiter und hielt es für „schwierig, einen Exploit für diese Schwachstelle zu schreiben“, obwohl van Amerongen weise feststellte, dass:

Wir glauben, dass es nicht unmöglich ist, und daher müssen Benutzer mit Wi-Fi-Routern möglicherweise nach Firmware-Updates für ihren Router suchen.

Was ist zu tun?

  • Wenn Sie einen Router haben, der NetUSB zum Mounten von Geräten über das Netzwerk anbietet, suchen Sie nach einem Update. Beachten Sie, dass nur zu prüfen, ob Ihr Router TCP-Verbindungen auf Port 20005 abhört (z. B. mit Nmap) reicht allein nicht aus, aber es ist ein nützlicher Hinweis darauf, dass Sie möglicherweise ein Problem haben, wenn Sie wissen, wie man Port-Scans durchführt.
  • Hören Sie standardmäßig nicht auf allen Netzwerkschnittstellen, es sei denn, Sie müssen es wirklich. Wenn Sie Code schreiben, um eingehende Netzwerkverbindungen zu akzeptieren und zu verarbeiten, nehmen Sie die geringstmöglichen Privilegien in Anspruch und öffnen Sie Ihre Konnektivität so wenig wie möglich.
  • Wenn Sie Code schreiben, der Speicher auf Anraten eines nicht vertrauenswürdigen Außenstehenden zuweist, prüfen Sie immer, ob sinnvolle Grenzen gesetzt sind. Auch wenn dieser Pufferüberlauf nicht möglich wäre, können wir uns nicht vorstellen, warum das so ist SoftwareBus_dispatchNormalEPMsgOut Funktion müsste jemals irgendwo in der Nähe von 4 GByte RAM zuweisen. (Laut Sentinel One sollte der Patch von NetGear das Limit auf einschränken size auf nur 16 MB.)
  • Prüfen Sie immer auf ganzzahligen Überlauf und Unterlauf, wenn Sie mit nicht vertrauenswürdigen Eingaben rechnen. Überlauf ist, wo positive Zahlen zu groß werden und wie in diesem Fall zum Anfang des Bereichs umlaufen; und Unterlauf ist, wo Zahlen unter Null enden und stattdessen effektiv bis zum Ende des Bereichs umlaufen.

Underflow mag zunächst verwirrend klingen, aber wenn Sie vorzeichenbehaftete und vorzeichenlose Zahlen verwechseln, Unterlauf führt in der Regel zu enorm Überlauf.

Sie können sich das vorstellen, indem Sie sich einen Kilometerzähler eines alten Autos vorstellen, der 00001 anzeigt und 2 km rückwärts läuft: Nach dem ersten Kilometer würde er korrekt auf 00000 zurückspulen, aber nach dem zweiten Kilometer würde er anscheinend vorwärts springen und 99999 anzeigen.

Der Kilometerzähler hat keine Möglichkeit, negative Werte anzuzeigen, wodurch 00000 und 99999 in seinem Zahlenzyklus nebeneinander stehen, mit dem Ergebnis, dass er seinen eigenen „Uhr“-Arithmetikstil hat, bei dem 99999 + 2 1 ergibt, und 1 – 2 ergibt 99999


Quelle: https://nakedsecurity.sophos.com/2022/01/11/home-routers-with-netusb-support-could-have-critical-kernel-hole/

spot_img

Neueste Intelligenz

spot_img