Gehen Sie einen schnelleren, intelligenteren Weg zur KI-gestützten C/C++-Testautomatisierung. Erfahren Sie mehr >>
Analyse von Baron Samedit (Sudo CVE-2021-3156)
Baron Samedit ist eine große Pufferüberlauf-Schwachstelle, die sich auf das Linux-Ökosystem auswirkt. Als neue Form der Schwachstelle versteht nicht jeder, was Baron Samedit ist und wie es sich auf Linux/Unix-Distributionen auswirken kann. Dieser Beitrag führt Sie durch alles, was Sie über diese Pseudo-Schwachstelle wissen müssen.
Zum Abschnitt springen
Zurück zu den Blog-ErgebnissenBaron Samedit ist eine große Pufferüberlauf-Schwachstelle, die sich auf das Linux-Ökosystem auswirkt. Als neue Form der Schwachstelle versteht nicht jeder, was Baron Samedit ist und wie es sich auf Linux/Unix-Distributionen auswirken kann. Dieser Beitrag führt Sie durch alles, was Sie über diese Pseudo-Schwachstelle wissen müssen.
Am 26. Januar 2021 veröffentlichte Qualys a Blog Sie beschreiben ihre Erkenntnisse zur Heap-Overflow-Sicherheitslücke in sudo, CVE-2021-3156, die sie „Baron Samedit“ nannten.
Sudo ist ein zentrales Tool in vielen verschiedenen Linux / Unix-Distributionen, mit dem Benutzer Programme mit erhöhten Sicherheitsberechtigungen ausführen können. Es ist eine Komponente, die üblicherweise in Linux, BSD, macOS, AIX, Solaris und anderen enthalten und installiert ist.
Ich werde Parasoft demonstrieren ++ versichern Erkennung von Speicherüberschreibungen und -überlesevorgängen mithilfe dieser Sicherheitslücke. Insure++ ist ein Speicher-Debugging-Tool, das patentierte Instrumentierungstechniken nutzt, um Speicherlecks und andere Speicherprobleme schnell zu identifizieren.
Insure ++ erleichtert das Erkennen, Verstehen und Beheben solcher Fehler erheblich als das Verwenden herkömmlicher Debugging-Tools und -Techniken.
Wenn anfällige Versionen von sudo (v1.8.2 - v1.9.5p1) mit einem Befehl im Shell-Modus ausgeführt werden und das Befehlszeilenargument mit einem einzelnen Backslash endet, kommt es zu einem Pufferüberlauf von sudo user_args Zeichenfolge tritt aufgrund eines Fehlers in der Art und Weise auf, wie Befehlszeilenargumente nicht maskiert werden.
Beim Entfernen des letzten "-Zeichens überschreibt die Funktion den Null-Terminator des Strings, was zu einem Pufferüberlauf führt. Eine detaillierte Beschreibung der Sicherheitslücke finden Sie im Original. Qualys Blog. Ich werde ähnliche Details behandeln, wenn wir die Ergebnisse von Insure ++ analysieren.
Um die Sicherheitsanfälligkeit in Insure ++ zu replizieren, müssen wir eine anfällige Version von sudo herunterladen und mit Insure ++ kompilieren. Die Quelle für sudo v1.9.5p1, die neueste anfällige Version, ist verfügbar hier auf der sudo website. Stellen Sie nach dem Entpacken des Quellcodes sicher, dass sich Insure ++ auf Ihrem Computer befindet PATH und stellen Sie Ihre CC zu "versichere gcc" vor dem Ausführen konfigurieren.
Sie sollten auch ein anderes Präfix festlegen, um das System sudo gegebenenfalls nicht zu überschreiben. Von hier laufen um und make install wie üblich.
Der Artikel von Qualys enthielt einen einfachen Proof-of-Concept-Befehl, der die Sicherheitsanfälligkeit durch Pufferüberlauf demonstriert. Es ist wie folgt:
sudoedit -s '' 'perl -e 'print "A" x 65536''
Ersetzen Sudoedit mit dem Pfad zu dem, den Sie kompiliert haben, und führen Sie den Befehl aus.

Das können wir an der erkennen malloc Nachricht, dass der Proof of Concept ordnungsgemäß ausgeführt wurde.
Lassen Sie uns sehen, was Insure ++ gefunden hat, indem Sie die Ergebnisse im Insra-Fenster untersuchen.

Wir können sehen, dass der erste Speicherfehler ein Leseüberlauf ist, der in auftritt sudoers.c in Zeile 971. Insra sagt uns, dass die von Zeiger liest ein Byte außerhalb des Zwei-Byte-Speicherblocks, auf den er zeigt.
Beachten Sie, dass der Speicherblock zwei Bytes umfasst, da das erste Byte das Zeichen " und das zweite der Null-Terminator ist. Ein Stacktrace zeigt uns, dass dies in der set_cmnd () Funktion.

Der nächste Speicherfehler ist ein Lesevorgang von einer fehlerhaften Adresse in sudoers.c auf Linie 972. Seit dem von Zeiger ist bereits außerhalb der Grenzen, wie wir im ersten Speicherfehler gesehen haben, jeder indizierte Zugriff mit von wird ein schlechter Index sein.

Der nächste Speicherfehler ist ein Leseüberlauf, der in Zeile 974 aufgetreten ist. Hier dereferenzieren wir den Zeiger außerhalb der Grenzen von und schreiben Sie es in den Puffer, auf den der zeigt zu Zeiger.
Beachten Sie, dass Insure ++ den Ursprung dieser Speicherblöcke in allen vorhergehenden Speicherfehlern verfolgt. Insure ++ ist sich bewusst, dass der Speicherblock, den wir lesen, außerhalb der Grenzen dessen liegt, was ursprünglich als definiert wurde argv Parameter in der Main() Methode in sudo.c.

Der nächste Speicherfehler ist ein Schreibüberlauf in derselben Anweisung wie zuvor. Jetzt wird Insure ++ beim Schreiben in den Puffer ausgelöst zu Zeiger zeigt auf. Beachten Sie, dass die Größe des Puffers zu zeigt auf 65539 Bytes. Die im Proof of Concept bereitgestellte Überlauf-Befehlszeichenfolge bestand aus einem "-Zeichen, einem Leerzeichen, 65536 'A'-Zeichen und einem impliziten Null-Terminator mit insgesamt 65539 Bytes.

Der nächste Speicherfehler tritt außerhalb von auf if Überprüfen Sie, ob "-Zeichen vorhanden sind. Warum führt dies jetzt zu einem Schreibüberlauf? Da frühere Speicherfehler die zu Zeiger auf Punkt außerhalb seines Speicherblocks, alle nachfolgenden Schreibvorgänge mit diesem Zeiger führen zu einem Schreibüberlauf.

Hier sehen wir die endgültige Speicherbeschädigung, bei der das Programm null die Zeichenfolge beendet. Das ist absolut das richtige Verhalten! Der Schreibüberlauf tritt jedoch auf, weil die zu Der Zeiger ist beschädigt und zeigt bereits außerhalb des Speicherblocks, den er haben sollte.
Wir können sehen, dass Parasoft Insure ++ die Analyse dieser Speicheranfälligkeit erheblich vereinfacht hat. Wir konnten schnell den Ort der Lese- und nachfolgenden Schreibüberläufe identifizieren, wissen, welche Variablen beteiligt waren, und sehen, wie sich der ungültige Zeiger auf nachfolgende Speicheroperationen auswirkte. In Kombination mit einer guten Testabdeckung und Fuzzing kann Insure ++ viele komplexe Speicherfehler viel einfacher verstehen, diagnostizieren und beheben.
Weiterführende Inhalte