Empfohlenes Webinar: Vorstellung von Parasoft C/C++test CT für kontinuierliche Tests und Compliance-Exzellenz | Zum Video

Analysieren der OpenSSL-Punycode-Schwachstelle (CVE-2022-3602)

Parasoft-Würfel-Logo 300x300
8. Dezember 2022
4 min lesen

Punycode-Angriffe sind Phishing-Angriffe, die Domains verwenden, um bekannte Marken zu imitieren. In diesem Beitrag analysieren wir die hochgradige Punycode-Schwachstelle CVE-2022-3602.

Am 1. November 2022 gab das OpenSSL-Projekt zwei Sicherheitslücken mit hohem Schweregrad in OpenSSL bekannt. Da diese beiden Schwachstellen im Zusammenhang mit dem Parsing von Punycode standen, wurden sie umgangssprachlich als Punycode-Schwachstellen bezeichnet. In diesem Beitrag analysieren wir CVE-2022-3602.

OpenSSL ist eine Bibliothek zum Erstellen und Verwalten der Identität und sicheren Kommunikation zwischen Computern, indem eine sichere Sockets-Schicht und zugehörige Tools bereitgestellt werden. Es ist sowohl auf Windows- als auch auf Linux/Unix-Systemen zusammen mit einer Vielzahl von eingebetteten Plattformen weit verbreitet.

Diese Schwachstellen betrafen OpenSSL v3.0.0 bis v3.0.6.

Übersicht über Punycode-Schwachstellen

Das Verständnis von Punycode ist eine entscheidende Voraussetzung, um diese verwandten OpenSSL-Schwachstellen zu verstehen. Wie in RFC 3492 definiert, ist Punycode eine Möglichkeit, eine ASCII-Zeichenfolge zu verwenden, um eine Unicode-Zeichenfolge zu codieren. Diese Punycode-Strings werden intern verwendet, wenn Domains aufgelöst werden, die Unicode-Zeichen enthalten.

In OpenSSL v3.0.6 crypto/punycode.c Es gibt einen Off-by-one-Fehler in Zeile 184, wo if (ausgeschrieben > max_aus) sollte stattdessen sein if (ausgeschrieben >=max_aus). Wenn OpenSSL versucht, ein Zertifikat zu verarbeiten, das eine manipulierte E-Mail-Adresse mit einer Punycode-Domain enthält, kann der resultierende Pufferüberlauf zu einem Programmabsturz oder einer Remote-Code-Ausführung führen.

Proof-of-Concept-Übersicht

Um die Schwachstelle in OpenSSL mit Insure++ zu demonstrieren, verwenden wir die öffentlich verfügbare Proof-of-Concept erstellt von Data Dog Security Labs. Dieser Proof-of-Concept ist dahingehend eingeschränkt, dass er nicht immer einen Absturz, aber immer ein Problem mit Speicherbeschädigung verursacht Insure++ erkennen kann. Wenn Sie an einem detaillierten Einblick in die Schwachstelle und den Proof of Concept interessiert sind, Schauen Sie sich ihren Blog-Beitrag an.

Demo-Setup

Für unsere Demonstration haben wir zwei virtuelle Maschinen, die mit demselben LAN verbunden sind. Auf der virtuellen Maschine des „Opfers“ wird Windows 10 und die angreifbare Version von OpenSSL ausgeführt, die mit Insure++ instrumentiert ist. Auf der virtuellen Maschine des „Angreifers“ wird Ubuntu ausgeführt und der Proof-of-Concept der Data Dog Security Labs verwendet. Für diese Demo lautet die IP-Adresse des „Opfers“ 192.168.1.10 und die IP-Adresse des „Angreifers“ 192.168.1.20.

Zuerst richten wir unsere virtuelle Windows 10-„Opfer“-Maschine ein. Um OpenSSL aus der Quelle zu erstellen, müssen wir Visual Studio 2022 und Parasoft Insure++ installieren. Zu den weiteren Voraussetzungen gehören „Strawberry Perl“, NASM und „Git für Windows“, die ebenfalls unter Windows installiert und enthalten sein sollten PATH.

Als Nächstes klonen wir das OpenSSL-Git-Repository aus github.com/openssl/openssl.git und überprüfen Sie das Tag der anfälligen Version mit dem folgenden Befehl.

git checkout -b v3.0.6 tags/openssl-3.0.6

Danach müssen wir die Build-Konfigurationen ändern, um ein Build-Profil zu erstellen, das Insure++ verwendet, um OpenSSL während des Builds zu instrumentieren. Dazu erben wir vom Visual C Windows 64-Bit-Build-Profil, indem wir einige kleine Änderungen für Insure++ vornehmen. Offen Konfigurationen/10-main.conf und fügen Sie nach Zeile 1421 Folgendes ein.

"VC-WIN64A-INSURE" => {
inherit_from => [ "VC-WIN64A" ],
CC => "versichern",
LD => "inslink",
},

Starten Sie nun eine „x64 Native Tools Command Prompt for VS 2022“ und navigieren Sie zu dem Ort, an dem Sie das OpenSSL-Quell-Git-Repository geklont haben. Führen Sie den folgenden Befehl aus, um die Quelle für unser Insure++-Build-Profil zu konfigurieren.

perl Konfigurieren Sie VC-WIN64A-INSURE

Wenn der vorherige Befehl erfolgreich war, können wir mit dem nächsten Befehl bauen. Dadurch wird OpenSSL mit Visual Studio erstellt, während Insure++ den generierten Code instrumentiert.

nmake

Sie können sehen, wie der Code in der Insure++ GUI kompiliert wird, wie im folgenden Bild zu sehen ist.

Screenshot, der Parasoft Insure++-Kompilierungscode zeigt.

Wenn der Build erfolgreich war, sind wir mit der Konfiguration unserer virtuellen „Opfer“-Maschine fertig. Installieren Sie für die virtuelle Maschine des „Angreifers“ einfach Ubuntu und klonen Sie das Proof-of-Concept-Git-Repository aus github.com/DataDog/security-labs-pocs.git.

Ausführen des Proof of Concept in der Demoumgebung

Navigieren Sie auf der virtuellen Maschine des „Angreifers“ vom Stammverzeichnis des Proof-of-Concepts-Repositorys von Data Dog Security Labs, das wir geklont haben, zu Proof-of-Concept-Exploits/openssl-punycode-vulnerability/vagrant/WindowsCrash. In diesem Verzeichnis befinden sich präparierte Zertifikate und Schlüssel, die die Schwachstelle reproduzieren, wenn ein OpenSSL-Server damit gestartet wird. Es ist keine anfällige Version von OpenSSL erforderlich, um diese Dateien zu verwenden, daher starten wir einen OpenSSL-Server mit der Version, die mit Ubuntu geliefert wird. Der folgende Befehl startet einen OpenSSL-Server mit den Proof-of-Concept-Schlüsseln und -Zertifikaten.

openssl s_server -accept 3000 -CAfile ca.crt -cert test.crt -key test.key.pem -state

Da der OpenSSL-Server auf unserer virtuellen Maschine des „Angreifers“ läuft, können wir unseren mit Insure++ instrumentierten OpenSSL-Client auf der virtuellen Maschine des „Opfers“ verwenden, um die Schwachstelle zu reproduzieren und zu analysieren. Navigieren Sie auf der virtuellen Maschine „Opfer“ vom Stammverzeichnis des OpenSSL-Repositorys, das wir geklont haben, zu =apps= und führen Sie den folgenden Befehl aus.

openssl.exe s_client -connect 10.10.10.7:3000

Wenn sich der „Opfer“-Client mit dem „Angreifer“-Server verbindet, erkennt Insure++ den Speicherschreibüberlauf und zeigt ihn in der GUI an, wie im folgenden Bild zu sehen.

Screenshot, der zeigt, wie Parasoft Insure++ den Speicherschreibüberlauf erkennt und in der GUI anzeigt.

Analysieren der Schwachstelle mit Insure++

Wie im vorherigen Bild zu sehen, hat Insure++ eine Vielzahl von Speicherproblemen bei diesem Lauf von OpenSSL erkannt. Konzentrieren wir uns insbesondere auf den Fehler im Zusammenhang mit dieser Punycode-Schwachstelle. Klicken Sie in der Insure++ GUI auf die WRITE_OVERFLOW= in=punycode.c on like 187. Sie sollten etwas Ähnliches wie das Folgende sehen.

Screenshot der Parasoft Insure++ GUI, der die erkannte Punycode-Schwachstelle zeigt.

Sie können sehen, dass Insure++ die Schwachstelle korrekt als CWE-120 identifiziert hat, was mit dem Eintrag für CVE-2022-3602 in der übereinstimmt NIST-Eintrag. Darunter sehen wir ein Diagramm, das das unseres ursprünglichen 2048-Byte-Puffers zeigt, den Aufruf von Speicherbewegung() schreibt 12 Bytes an das Ende des Puffers, wovon 8 Bytes im Puffer sind und die letzten 4 Bytes überlaufen. Dieses Ergebnis stimmt mit den Ergebnissen überein, die im oben erwähnten Blog der Data Dogs Security Labs veröffentlicht wurden. Darunter werden die genauen Adressbereiche angezeigt. Schließlich können Sie im Fenster einen Stack-Trace und ein Code-Snippet sehen.

Zusammenfassung

Ich hoffe, ich habe einige der einzigartigen Funktionen und Fähigkeiten von Insure++ zusammen mit unserer neuen GUI demonstriert. Diese Funktionen machen Insure++ zu einer großartigen Ergänzung für die Tools eines Sicherheitsforschers, insbesondere bei der Arbeit mit Fuzzing, Schwachstellenforschung und speicherbasierten Angriffen.

Möchten Sie sehen, wie Sie mit Insure++ automatisch Speicherschreibüberläufe erkennen?