Ping des Todes! FreeBSD behebt crashtastischen Fehler im Netzwerktool PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Ping des Todes! FreeBSD behebt crashtastischen Fehler im Netzwerktool

Eines der ersten Low-Level-Netzwerktools, von dem jeder Computerbenutzer erfährt, ist das Venerable ping Dienstprogramm.

Benannt nach dem gleichnamigen Soundeffekt aus jeder Kriegsfilmszene der alten Schule mit U-Booten, ist der Befehl ein metaphorisches Echo (sehen Sie, was wir dort gemacht haben?) der Unterwasserversion von RADAR, bekannt als SONAR.

Sie senden einen Ping (eher wie ein doinnnng-Geräusch, in Realität) in die salzigen Tiefen, und indem Sie messen, wie lange es dauert, bis sein unheimliches Echo zu Ihnen zurückkommt, und indem Sie die Schallgeschwindigkeit im umgebenden Ozean schätzen, können Sie die Entfernung zu dem Objekt berechnen, das das Echo erzeugt hat.

Angesichts der Tatsache, dass Sie wahrscheinlich schon einmal die Abkürzung TCP/IP gehört haben, die als allgemeine Beschreibung des Protokollklebers verwendet wird, der das Internet antreibt, ist es interessant, ping verwendet TCP/IP technisch überhaupt nicht.

Tatsächlich ist TCP/IP die Abkürzung für Übertragungskontrollprotokoll über das Internetprotokoll, und bezieht sich auf einen ziemlich hochrangigen Mechanismus, um Daten so über das Internet zu senden, dass das Netzwerk selbst viel von dem "Hat das eigentlich richtig funktioniert?" Aufwand für dich.

Beispielsweise ist bei TCP-Verbindungen garantiert, dass alle von Ihnen gesendeten Datenblöcke entweder intakt am anderen Ende ankommen oder einen Fehler verursachen, damit Sie wissen, dass sie es nicht geschafft haben.

Darüber hinaus werden TCP-Daten korrekt gepuffert, selbst wenn verschiedene Datenblöcke unterschiedliche Wege über das Internet nehmen (z. B. aufgrund von Lastausgleich, vorübergehenden Ausfällen oder anderen behebbaren Fehlern) und selbst wenn einige Blöcke länger brauchen, um anzukommen als andere hoch und am anderen Ende in der richtigen Reihenfolge präsentiert.

Ping ist anders

Das ping Der Befehl wird jedoch normalerweise verwendet, um zu überprüfen, ob ein Computer, an dem Sie interessiert sind, überhaupt online ist, insbesondere wenn er nicht die Art von High-Level-TCP-Verbindungen akzeptiert, die Sie erwarten würden, z. B. das Empfangen von E-Mails oder das Zulassen von SSH-Anmeldungen.

Auf diese Weise können Sie schnell feststellen, ob ein Ausfall wahrscheinlich auf einen Ausfall des Netzwerks oder des Servers selbst zurückzuführen ist oder darauf, dass einzelne Dienste, die auf diesem Server ausgeführt werden, nicht ordnungsgemäß gestartet werden.

Dadurch ping verwendet ein viel niedrigeres Protokoll als TCP.

Tatsächlich, ping verwendet nicht einmal TCPs lässigeren Cousin UDP, kurz für Benutzer-Datagramm-Protokoll, eine schnelle und einfache Möglichkeit, Datenblöcke zu übertragen, die im Volksmund als Send-and-Hope (oder, wenn Sie zynisch sind, als Spray-and-Pray) bezeichnet wird.

UDP selbst informiert Sie nicht, ob Ihre Daten am anderen Ende angekommen sind oder nicht, und selbst wenn sie intakt ankommen, verfolgt UDP nicht die Reihenfolge, in der Ihre Pakete ursprünglich gesendet wurden, sodass es sie nicht neu anordnen kann das andere Ende, wenn sie dort außerhalb der Reihenfolge ankommen.

Ping, für das, was es wert ist, verwendet ein Very-Low-Level-Tatsächlich-Protokoll, das speziell für Fehlerbehebungs- und Netzwerk-Neukonfigurationszwecke entwickelt wurde und als ICMP bekannt ist, oder Nachrichtenprotokoll für die Internetkontrolle.

Typischerweise direkt im Kernel des Betriebssystems gehandhabt, sodass ICMP/IP-Pakete mit ziemlicher Sicherheit durchkommen, auch wenn keine Netzwerksoftware auf höherer Ebene korrekt ausgeführt wurde, enthält ICMP insbesondere zwei spezielle Nachrichtentypen:

  • Geben Sie 0x08 ein. Offiziell angerufen ICMP EchoDieser eine Art Päckchen wird normalerweise als Echoanforderung bezeichnet. Es ist was die ping Programm sendet, um nach aktiven Computern im Netzwerk zu suchen.
  • Geben Sie 0x00 ein. Offiziell angerufen ICMP Echo Reply, dieser Pakettyp ist genau das, was es sagt. Ein Computer, der aktiv, online und nicht zum Blockieren des ICMP-Echo-Verkehrs konfiguriert ist, soll diese Art von Paket direkt an den Computer zurücksenden, der es angefordert hat.

Liken:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com MUSTER: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) Bytes Daten. 64 Bytes von 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 time=84.0 ms 64 Bytes von 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 time=85.1 ms 64 Bytes von 192.0.66.227 192.0.66.227 (3): icmp_seq=53 ttl=84.8 time=3 ms --- news-sophos.go-vip.net Ping-Statistiken --- 3 Pakete gesendet, 0 empfangen, 2004 % Paketverlust, Zeit 84.025 ms RTT min/ avg/max/mdev = 84.644/85.062/0.446/XNUMX ms

Um zu sehen ping In Aktion auf einer etwas niedrigeren Ebene verwenden wir den Lua-Code, den Sie am Ende des Artikels finden, um ein eigenes ICMP-Echo-Paket zu erstellen und die Antwort zu lesen, die zurückkommt, falls vorhanden:

$ sudo luax ping.lua nakedsecurity.sophos.com ICMP ECHO-Anfrage wird an 192.0.66.227 gesendet --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |.....Zo.PingRequ| 00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estMessage BB5A6| 00000020 46 31 44 |F1D | Zurückgekommen--> 00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |.........Zo.Ping| 00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |RequestMessage B| 00000030 42 35 41 36 46 31 44 |B5A6F1D |

Übrigens mussten wir verwenden sudo oben, um unser Skript mit Superuser-Rechten auszuführen, da wir eine sogenannte roher IP-Socket – eines, das in jedes zugrunde liegende Format, das wir mögen, verarbeitet werden kann, einschließlich TCP, UDP und, wie hier benötigt, ICMP.

Auf vielen Linux/Unix-Systemen ist die ping Der von Ihrer Distribution bereitgestellte Befehl funktioniert, ohne explizit Root-Rechte zu erhalten, normalerweise weil er mit speziellen Sicherheitsfunktionen oder mit seinen installiert wird setuid Flag gesetzt, was bedeutet, dass es mit der Ausführung unter einem anderen Benutzerkonto als dem Benutzer beginnt, der es ausgeführt hat.

Gut designed ping Programme verwerfen natürlich automatisch ihre zusätzlichen Privilegien, sobald sie den benötigten Raw-Socket geöffnet haben.

Wir haben diesen Code zum Löschen von Berechtigungen aus Gründen der Kürze aus unserem Beispielskript weggelassen. Du kannst den ... benutzen posix.unistd.setpid() Funktion, um nach dem Erstellen des Sockets, aber vor dem Senden oder Empfangen von Daten, zu einem nicht privilegierten Konto zu wechseln.

Prüfung der Antwort

Wie Sie vielleicht im Datendump unseres obigen Skripts erkennen, enthält die Netzwerk-Socket-Funktion, die wir verwenden, um Daten vom antwortenden Server zurückzulesen, nicht nur die ICMP-Echo-Reply-Daten, sondern auch die Low-Level-IP (Internetprotokoll-Header). im zugrunde liegenden Paket.

Wir haben nicht versucht, diese Daten zu parsen oder anderweitig zu verarbeiten, aber FreeBSD ping Das Programm muss dies tun, um die Antwort zu verstehen, einschließlich aller Fehlermeldungen, die zurückkommen.

Besitzt das ping auf irgendeine Weise abgelehnt wird, enthält die Echo-Antwort normalerweise nicht nur ihre eigenen IP-Header (wie oben gezeigt), sondern auch eine Referenzkopie der IP-Header und der ICMP-Daten, die in der ursprünglichen ausgehenden Anfrage erschienen sind.

IPv4-Paket-Header sehen normalerweise ähnlich aus wie oben, wo die IP-Header beginnen 45 00 00 37... und fahren Sie für insgesamt 20 Bytes fort, bis einschließlich der als angezeigten Bytes ...XX XX XX XX, das ist die IP-Adresse meines Laptops.

Liken:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX |.... | IP-Version und Header-Länge: 0x45 (4 = IPv4, 5 = fünf 32-Bit-Wörter, also 20 Bytes Diensttyp und Überlastungsdaten: 0x00 Gesamtlänge des Pakets: 0x0037 (dezimal 55) Sequenzinformationen: F6 AF 00 00 Time-to -live (linke Sprünge): 0x35 (Dezimal 53) Protokolltyp: 0x01 (ICMP) Prüfsumme: 0x947F (Dezimal 38015) IP-Nummer des sendenden Computers: C0 00 42 E3 (192.0.66.227 = nakedsecurity.sophos.com) IP des Empfängers (my Laptop): XX XX XX XX (ANONYMISIERT = meine eigene IP-Nummer)

FreeBSDs ping Programmierer gingen anscheinend davon aus, dass Header dieser Art tatsächlich immer genau 20 Bytes lang sein würden, basierend auf diesem Header-Längenwert im ersten Byte von 0x45, bezeichnet IPv4 (0x4?) mit einem 5-DWORD (0x?5) oder 20-Byte-Header.

Mit nur 20 Bytes, um die man sich Sorgen machen musste, ordneten die Programmierer Puffer mit fester Größe auf dem Stapel zu, in denen sie eine Kopie der IP-Header in der Antwort sowie alle eingebetteten IP-Header aus der ursprünglichen Anfrage aufbewahren konnten, falls eine Fehlerbedingung zu behandeln war .

Sie können sich denken, wohin das führt.

Das erste Byte im IPv4-Header kann legal einen beliebigen Wert haben 0x45 (die minimale Headergröße von 5 DWORDs oder 20 Bytes, wie gezeigt) bis zu 0x4F (bezeichnet 15 DWORDs, da 0xF dezimal 15 oder insgesamt 60 Byte Header-Daten sind), wodurch optional zusätzliche 40 Byte Header-Daten möglich sind.

Diese seltenen, aber legalen zusätzlichen Header-Bytes können für verschiedene funky und ungewöhnliche „Features“ mit merkwürdigen Namen wie z Selektive gerichtete Übertragung, Experimentelle Flusskontrolle und Upstream-Multicast-Paket – Dinge, von denen wir gehört, aber nie wissentlich benutzt oder gar gesehen haben.

Hüten Sie sich vor Cyberkriminellen, die Sie auf die Probe stellen

Wie Sie sich vorstellen können, werden Sie angesichts der Tatsache, dass diese zusätzlichen Felder fast nie verwendet werden, möglicherweise nie ein IPv4-Paket mit etwas anderem als sehen 0x45 am Anfang und mit insgesamt 20 Byte Header-Daten, es sei denn, Sie sind einem Haufen Cyberkrimineller begegnet, die bereit sind, Sie auf die Probe zu stellen.

Leider kann ein Angreifer nicht viel davon abhalten, einen Server zu manipulieren, der errät, ob Sie FreeBSD verwenden, und absichtlich übergroße ICMP/IP-Echo-Reply-Pakete generiert, um einen zu provozieren Stapelpufferüberlauf in Ihrem ping

Wenn Sie jemals überprüfen, ob ihr Server aktiv ist (was Sie sogar oder vielleicht sogar tun könnten, wenn Sie denken, dass es verdächtig ist!), könnten Sie mit einer Sprengfalle-Antwort ins Visier genommen werden.

Bestenfalls Ihre ping Programm stürzt ab; im schlimmsten Fall jedoch, wie der FreeBSD-Sicherheitsratgeber großzügig zugibt, „Es kann für einen böswilligen Host möglich sein, die Remote-Code-Ausführung in Ping auszulösen.“

Zum Glück, wie die FreeBSD-Autoren auch hinweisen, „Der Ping-Prozess läuft in einer Capability-Modus-Sandbox auf allen betroffenen Versionen von FreeBSD und ist daher sehr eingeschränkt, wie er mit dem Rest des Systems an dem Punkt interagieren kann, an dem der Fehler auftreten kann.“

Mit anderen Worten, Sie müssen definitiv patchen, aber die Risiken können als gering angesehen werden.

Bemerkenswert ist, dass ping Das Programm ist nicht nur in einer Sandbox gesperrt, sondern wird nicht als Root ausgeführt, wenn der fehlerhafte Code erreicht wird, wie in der Sicherheitsempfehlung bestätigt: "Wann ping läuft, erstellt es den Raw-Socket, der für seine Arbeit benötigt wird, und widerruft dann seine erhöhten Privilegien.

Wie oben beschrieben, sind Superuser-Befugnisse nur erforderlich, um einen Roh-IP-Socket vom Betriebssystem zu erwerben, nicht um ihn zu verwenden sendto() und recvfrom() funktioniert danach auf diesem Socket.

Diesem Fehler wurde die offizielle Kennung gegeben CVE-2022-23093; es ist in der Sicherheitsempfehlung dokumentiert FreeBSD-SA-22:15.ping.

Was ist zu tun?

  • Wenn Sie ein FreeBSD-Benutzer sind, Aktualisieren Sie einfach die betroffenen Versionen (FreeBSD 12 und FreeBSD 13) auf die neuesten Versionen, in denen dieser Fehler behoben ist.
  • Wenn Sie ein Netzwerkprogrammierer sind, Stellen Sie immer sicher, dass Sie Paketkopfzeilen berücksichtigt haben, die auf ungewöhnliche Größenabweichungen hindeuten könnten. Die Tatsache, dass Sie selbst noch nie eine Variation gesehen haben, hindert Sie nicht daran, morgen mit einem Paket konfrontiert zu werden, das ungewöhnlich, aber vollkommen legal ist.
  • Wenn Sie ein Netzwerkmanager sind, Erwägen Sie das Blockieren von IPv4-Paketen mit IP-Headern, die nicht 20 Byte groß sind. Wenn Sie wirklich zulassen müssen, dass einige Softwareprodukte ungewöhnliche IPv4-Header-Optionen verwenden, ziehen Sie in Betracht, diese ungewöhnlichen Pakete zu protokollieren, um herauszufinden, warum.

Pass auf dich auf da draußen!


BEISPIELCODE ZUR DEMONSTRATION VON PING-VERKEHR


Zeitstempel:

Mehr von Nackte Sicherheit