Parasoft C/C++test 2022.2 unterstützt MISRA C:2012 Amendment 3 und eine Entwurfsversion von MISRA C++ 202x. Erfahren Sie mehr >>

Analyse von Baron Samedit (Sudo CVE-2021-3156)

Von Anthony Mendez

23. Februar 2021

4  min lesen

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.

Am 26. Januar 2021 veröffentlichte Qualys a Blog Beschreiben ihrer Ergebnisse zur Sicherheitsanfälligkeit durch Heap-Überlauf in sudo, CVE-2021-3156, die sie als „Baron Samedit“ bezeichneten.

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.

Analyse von Baron Samedit (CVE-2021-3156) mit Insure ++

Ich werde Parasoft demonstrieren ++ versichern Speicherüberlesen und Überschreibenerkennung mithilfe dieser Sicherheitsanfälligkeit. Insure ++ ist ein Speicher-Debugging-Tool, das schnell patentierte Instrumentierungstechniken verwendet Identifizieren Sie Lecks und andere Speicherprobleme.

Insure ++ erleichtert das Erkennen, Verstehen und Beheben solcher Fehler erheblich als das Verwenden herkömmlicher Debugging-Tools und -Techniken.

Übersicht über Sicherheitslücken bei Baron Samedit (CVE-2021-3156)

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.

Wenn das letzte '\' Zeichen nicht maskiert wird, überschreibt die Funktion den Nullterminator der Zeichenfolge, was zu einem Pufferüberlauf führt. Eine gründliche Aufschlüsselung der Sicherheitsanfälligkeit finden Sie im Original Qualys Blog. Ich werde ähnliche Details behandeln, wenn wir die Ergebnisse von Insure ++ analysieren.

Einrichtung mit Insure ++

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.

Exploit ausführen

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.

Screenshot des Befehls zum Ausführen des Exploits CVE-2021-4156

Das können wir an der erkennen malloc Nachricht, dass der Proof of Concept ordnungsgemäß ausgeführt wurde.

Ergebnisse analysieren

Lassen Sie uns sehen, was Insure ++ gefunden hat, indem Sie die Ergebnisse im Insra-Fenster untersuchen.

Screenshot des Leseüberlaufs von Insure ++ sudoers.c (971) für CVE-2021-4156

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 aus Zeiger liest ein Byte außerhalb des Zwei-Byte-Speicherblocks, auf den er zeigt.

Beachten Sie, dass der Speicherblock zwei Bytes umfasst, da der erste das Zeichen '\' und der zweite das Nullterminator ist. Ein Stack-Trace zeigt uns, dass dies in der set_cmnd () Funktion.

Die Bildschirmaufnahme von Insure ++ sudoers.c (972) hat einen fehlerhaften Index für CVE-2021-4156 gelesen

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

Screenshot des Leseüberlaufs von Insure ++ sudoers.c (974) für CVE-2021-4156

Der nächste Speicherfehler ist ein Leseüberlauf, der in Zeile 974 aufgetreten ist. Hier dereferenzieren wir den Zeiger außerhalb der Grenzen aus 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.

Screenshot des Schreibüberlaufs von Insure ++ sudoers.c (974) für CVE-2021-4156

 

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 Überlaufbefehlszeichenfolge, die wir im Proof of Concept bereitgestellt haben, bestand aus einem '\' - Zeichen, einem Leerzeichen, 65536 'A'-Zeichen und einem impliziten Nullterminator mit insgesamt 65539 Byte.

Screenshot des Leseüberlaufs von Insure ++ sudoers.c (976) für CVE-2021-4156

Der nächste Speicherfehler tritt außerhalb von auf if Suchen Sie nach '\' Zeichen. Warum verursacht dies jetzt einen Schreibüberlauf? Da bisherige Speicherfehler die beschädigt haben zu Zeiger auf Punkt außerhalb seines Speicherblocks, alle nachfolgenden Schreibvorgänge mit diesem Zeiger führen zu einem Schreibüberlauf.

Screenshot des Schreibüberlaufs von Insure ++ sudoers.c (978) für CVE-2021-4156

 

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.

Fazit

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.

Text mit der Aufschrift Laufzeit- und Speicherfehlererkennung und -visualisierung mit Parasoft Insure ++ mit Handlungsaufforderungstaste Laden Sie das Whitepaper herunter

Von Anthony Mendez

Anthony ist ein leitender Softwareentwickler bei Parasoft, der sich auf Laufzeitfehlererkennung, statische Analyse, Reverse Engineering, Schwachstellenanalyse und Ausnutzung konzentriert.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.