Entdecken Sie das TÜV-zertifizierte GoogleTest mit Agentic AI für C/C++-Tests!
Details ansehen »
Zum Abschnitt springen
Zurück zu den Blog-ErgebnissenParasoft-Blog
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
Am 26. Januar 2021 veröffentlichte Qualys einen Blogbeitrag , in dem sie ihre Erkenntnisse zur Heap-Overflow-Schwachstelle in sudo, CVE-2021-3156, beschrieben, 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 anhand dieser Sicherheitslücke die Erkennung von Speicherüberschreibungen und -überlesevorgängen mit Parasoft Insure++ demonstrieren. 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 der Escape-Sequenz des letzten Anführungszeichens überschreibt die Funktion das Nullbyte des Strings, was zu einem Pufferüberlauf führt. Eine detaillierte Beschreibung dieser Sicherheitslücke finden Sie im Original- Blogbeitrag von Qualys . Ähnliche Details werde ich bei der Analyse der Ergebnisse von Insure++ behandeln.
Um die Sicherheitslücke in Insure++ zu reproduzieren, müssen wir eine anfällige Version von sudo herunterladen und mit Insure++ kompilieren. Der Quellcode für sudo v1.9.5p1, die aktuellste anfällige Version, ist hier auf der sudo-Website verfügbar . Stellen Sie nach dem Entpacken des Quellcodes sicher, dass sich Insure++ in Ihrem PATH befindet und setzen Sie den CC-Wert auf „insure gcc“, bevor Sie configure ausführen.
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 ab 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 ab Zeiger ist bereits außerhalb der Grenzen, wie wir im ersten Speicherfehler gesehen haben, jeder indizierte Zugriff mit ab 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 ab 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