Parasoft-Logo Suche

Entdecken Sie das TÜV-zertifizierte GoogleTest mit Agentic AI für C/C++-Tests!
Details ansehen »

Parasoft-Blog

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

By Parasoft • December 8, 2022 • 4 min gelesen
December 8, 2022 | 4 min gelesen
By Parasoft
Weißer Text auf marineblauem Hintergrund links: Analyzing OpenSSL Punycode Vulnerability (CVE-2022-3602). Auf der rechten Seite befindet sich Code im Hintergrund mit einem pinkfarbenen beleuchteten Dreieck mit Erläuterungspunkt im Vordergrund, der vor einer gefundenen Schwachstelle warnt.

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 mithilfe von Insure++ zu demonstrieren, verwenden wir den öffentlich verfügbaren Proof of Concept von Data Dog Security Labs . Dieser Proof of Concept hat die Einschränkung, dass er nicht immer einen Absturz verursacht, aber stets einen Speicherfehler auslöst , den Insure++ erkennen kann . Wenn Sie sich für eine detaillierte Analyse der Schwachstelle und des Proof of Concept interessieren, lesen Sie den entsprechenden Blogbeitrag.

Demo-Setup

Für unsere Demonstration haben wir zwei virtuelle Maschinen im selben LAN verbunden. Die virtuelle Maschine des „Opfers“ läuft unter Windows 10 und der anfälligen Version von OpenSSL, instrumentiert mit Insure++. Die virtuelle Maschine des „Angreifers“ läuft unter Ubuntu und nutzt den Proof of Concept von Data Dog Security Labs. Für diese Demo lautet die IP-Adresse des „Opfers“ 192.168.1.10 und die des „Angreifers“ 192.168.1.20.

Zuerst richten wir unsere virtuelle Windows 10-Maschine ein. Um OpenSSL aus der Quelle zu erstellen, müssen wir Visual Studio 2022 und Parasoft Insure++ installieren. Weitere Voraussetzungen sind „Strawberry Perl“, NASM und „Git für Windows“, die ebenfalls installiert und in die Windows-Umgebung integriert sein sollten. PATH.

Als nächstes klonen wir das OpenSSL-Git-Repository von github.com/openssl/openssl.git und checken die anfällige Versionskennung mit dem folgenden Befehl aus.

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-Eingabeaufforderung für VS 2022“ und navigieren Sie zum geklonten OpenSSL-Quell-Git-Repository. Führen Sie den folgenden Befehl aus, um die Quelle für unser Insure++-Buildprofil 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, ist die Konfiguration unserer virtuellen „Opfer“-Maschine abgeschlossen. Für die virtuelle „Angreifer“-Maschine installieren Sie einfach Ubuntu und klonen das Proof-of-Concept-Git-Repository von github.com/DataDog/security-labs-pocs.git.

Ausführen des Proof of Concept in der Demoumgebung

Navigieren Sie auf der virtuellen Maschine „Angreifer“ vom Stammverzeichnis des von uns geklonten Data Dog Security Labs Proof of Concepts-Repository 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 des Opfers vom Stammverzeichnis des geklonten OpenSSL-Repositorys zu =apps= und führen Sie den folgenden Befehl aus.

openssl.exe s_client -connect 10.10.10.7:3000

Wenn der „Opfer“-Client eine Verbindung zum „Angreifer“-Server herstellt, 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 sehen, dass Insure++ die Schwachstelle korrekt als CWE-120 identifiziert hat, was mit dem Eintrag für CVE-2022-3602 im NIST übereinstimmt . Darunter sehen wir ein Diagramm, das zeigt, dass der Aufruf von ` memmove()` von unserem ursprünglichen 2048-Byte-Puffer 12 Bytes an das Ende des Puffers schreibt, von denen 8 Bytes innerhalb des Puffers liegen und die letzten 4 Bytes einen Überlauf verursachen. Dieses Ergebnis deckt sich mit den im bereits erwähnten Blog von Data Dogs Security Labs veröffentlichten Ergebnissen. Die genauen Adressbereiche sind darunter aufgeführt. Abschließend sehen Sie im Fenster einen Stack-Trace und einen Codeausschnitt.

Fazit

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?
Demo anfordern