Bildungs-PoC, das CVE-2021-38297 nachbildet, einen Go-WASM-Pufferüberlauf, der zu gespeichertem XSS führt. Enthält Einrichtung der verwundbaren Anwendung, Schritte zur Exploit-Reproduktion und Anleitung zum Patchen für Sicherheitsforschung.
WebAssembly (WASM) 🌍, ein hochmodernes binäres Befehlsformat, ermöglicht die nahtlose Ausführung von Hochsprachen wie C, C++, Rust und GO in modernen Webbrowsern. Die Entdeckung von CVE-2021-38297 🚩 offenbarte jedoch einen kritischen Fehler im Kompilierungs- und Ladevorgang von GO für GO-kompilierte WASM-Binärdateien. Diese Schwachstelle, die im von GO bereitgestellten JavaScript-WASM-Loader (wasm_exec.js) gefunden wurde, erlaubte die uneingeschränkte Aufnahme von Daten in das argv-Argument. Da argv im linearen Speicher von WASM gespeichert wird, konnten böswillige Akteure dies möglicherweise ausnutzen, um den linearen Speicher des GO-kompilierten WASM-Programms mit einer übermäßig großen argv-Eingabe zu überschreiben, was zu unvorhersehbaren und potenziell gefährlichen Ergebnissen führte. Diese Schwachstelle war in GO-Versionen vor 1.17.2 ein erhebliches Problem.
Zusammenfassend:
argv sowie Beiträge an der Speicheradresse 0x5000.toLeetSpeak und processSharedVar werden jeweils für Kommentar- und Beitragsinhalte verwendet.In unserem Proof of Concept stellen wir „Vuln-Twitter“ vor, eine nachgeahmte soziale Medienplattform, die nutzergenerierte Inhalte über Beiträge und Kommentare ermöglicht. Vuln-Twitter nutzt einen Node.js-Webserver und SQLite zur Datenspeicherung; das Frontend verwendet einfaches JavaScript zusammen mit einem GO-WASM-Modul namens wordprocessor.wasm für das dynamische Rendern von Inhalten. Dieses Modul enthält notably Methoden wie toLeetSpeak, die Benutzereingaben für ein ansprechendes Benutzererlebnis in stilisiertes „LeetSpeak“ umwandeln.

Unsere Untersuchung offenbart einen kritischen Angriffspunkt während der Inhalts-Rendering-Phase, in der jeder Kommentar vom GO-WASM-Modul transformiert wird. Ein speziell präparierter, übermäßig großer Kommentar kann die Schwachstelle auslösen und zu einem Pufferüberlauf führen, der den ursprünglichen Beitragsinhalt manipuliert – ein klassischer Stored-XSS-Angriffsvektor. Diese Schwachstelle unterstreicht nicht nur das Potenzial für böswillige Datenmanipulation, sondern auch die umfassenderen Auswirkungen sicherer Programmierpraktiken im Kontext der Webentwicklung und von WASM-Anwendungen. Siehe den Codeabschnitt, der dies umsetzt:

WASM-Diagramm des linearen Speichers beim Rendern eines Kommentars:

Für Enthusiasten und Forscher, die diese Schwachstelle weiter untersuchen möchten, stellen wir detaillierte Schritte zur Reproduktion der Exploit-Umgebung mit einer bestimmten verwundbaren GO-Version bereit. Dieser praxisnahe Ansatz fördert ein tieferes Verständnis der Mechanik der Schwachstelle und möglicher Gegenmaßnahmen.
Hinweis: Zur Reproduktion müssen Sie die Go-Version go1.17.1 lokal installieren, die in diesem Szenario die verwundbare Version ist. Sie können die offizielle Go-Dokumentation zur Installation bestimmter Go-Versionen konsultieren.
Lassen Sie uns nun versuchen, das obige Szenario zu reproduzieren:
git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitternpm install aus, um alle Abhängigkeiten zu installieren.npm run resetDB aus, das die Datenbank mit einigen Beiträgen und Kommentaren initialisiert.npm run dev aus, das den lokalen Server startet. Öffnen Sie localhost:3000 in einem Browser und Sie sollten eine Anmeldeseite sehen.Melden Sie sich nun mit einem böswilligen Konto an, verwenden Sie die Anmeldedaten Benutzername: I_CANT_HACK, Passwort: hacker. Nach der Anmeldung sollten Sie den Feed mit einigen Beiträgen sehen können.
Dieser Beitrag scheint ziemlich interessant zu sein:
Amazon: ready 4 black friday? https://www.amazon.com/blackfriday
Was wäre, wenn wir mit der obigen Technik in der Lage wären, den Beitrag von Amazon.com zu überschreiben, um auf einen böswilligen Link zu verweisen?
Siehe die Datei exploit.txt – sie enthält den Kommentar, der mit einer Auffüllung von „A"s gefüllt ist, sodass wir alles bis zur Adresse 0x5000 überschreiben. Am Ende sehen Sie den Text ready for black friday? https://evil.com/blackfriday. Wenn wir diesen Text kopieren und als Kommentar zu dem obigen Beitrag hinzufügen, sollten wir in der Lage sein, den ursprünglichen Beitrag mit dem obigen Text zu überschreiben.
Probieren Sie es selbst aus und sehen Sie :)

In Anerkennung der Schwere dieser Schwachstelle skizzieren wir auch eine umfassende Patch-Strategie, die eine aktualisierte und sichere Version von GO verwendet, um das Risiko zu mindern. Dieser Abschnitt dient als Leitfaden für Entwickler und Systemadministratoren, um ihre Anwendungen gegen solche Schwachstellen zu härten, und betont die Bedeutung regelmäßiger Software-Updates und wachsamer Sicherheitspraktiken.
In dieser Anwendung habe ich auch ein Patch-Skript bereitgestellt, das eine neuere Version von Go verwendet:
npm run patchServer aus.Dies sollte die Go-Datei mit der neuen Version neu kompilieren und den Server mit der Patch-Version starten.
Sie sollten nun feststellen, dass der Beitrag nicht überschrieben wird. Wenn Sie die Konsole beobachten, sehen wir stattdessen einen Fehler: Argument length too long.

Unsere Reise durch die Ausnutzung und Minderung von CVE-2021-38297 bietet wertvolle Einblicke in die Herausforderungen und Chancen, die sich durch die Integration von Hochsprachen in Webumgebungen über WASM ergeben. Sie regt eine kritische Prüfung der Sicherheitspraktiken in der Softwareentwicklung an und drängt zu einem proaktiven Ansatz beim Schwachstellenmanagement und zur Übernahme sicherer Codierungsstandards. Basierend auf unserem Verständnis glauben wir, dass das GO-Linearspeicher-Layout unten dargestellt ist:
