
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:

Als Studierende der Carnegie Mellon University trägt unsere Untersuchung von CVE-2021-38297 zum breiteren akademischen und professionellen Diskurs über Cybersicherheit bei und bietet eine praktische Fallstudie zu den Auswirkungen neuer Technologien auf die Softwaresicherheit. Unsere Präsentationsmaterialien, die zur Überprüfung verfügbar sind, erläutern unsere Ergebnisse und Methoden weiter und laden zu Dialog und Zusammenarbeit in der Cybersicherheitsgemeinschaft ein.
Dieses Projekt ist ein Zeugnis kollaborativer Forschung und akademischer Untersuchung, angeführt von einem engagierten Team aus Studierenden und Forschern:
Dieses Proof of Concept zeigt eine Social-Media-Anwendung, Vuln-Twitter, die es mehreren Benutzern ermöglicht, Beiträge und Kommentare zu veröffentlichen. Der auf Node.js basierende Webserver verwendet SQLite, um Beitrags- und Kommentardaten zu speichern.
Das Frontend verwendet einfaches JS zusammen mit einem GO-WASM-Modul namens wordprocessor.wasm. Dieses Modul stellt Methoden wie toLeetSpeak bereit, die Eingabezeichenfolgen in „LeetSpeak“ umwandeln (z. B. wird „Hello!“ zu „h3ll0!“).
Die GO-WASM-Module unterstützen das Rendern von Beiträgen und Kommentaren in LeetSpeak.
Während des Frontend-Rendering-Prozesses, wenn Beiträge und Kommentare vom Server empfangen werden, wird jeder Kommentar mithilfe des GO-WASM-Moduls in „LeetSpeak“ gerendert. Der Kommentar für jeden Beitrag wird als Teil der Variablen argv übergeben, nachdem das GO-WASM-Modul geladen wurde.
Darüber hinaus gibt es im GO-Modul eine Methode processSharedVar(), die darauf ausgelegt ist, die Zeichenfolge an der Adresse 0x5000 zu lesen und in vereinfachte Sprache umzuwandeln (z. B. wird „How are you?“ zu „How r u?“). Der ursprüngliche Beitrag wird explizit bei 0x5000 im linearen Speicher abgelegt, um von dieser Methode abgerufen zu werden, wodurch der Beitragsinhalt verändert wird.
Für alle, die tiefer in CVE-2021-38297 und seine breiteren Auswirkungen eintauchen möchten, stellen wir eine kuratierte Liste von Ressourcen und Lektüre bereit, die von offiziellen Sicherheitsbulletins bis hin zu technischen Blogs und akademischen Papieren reicht. Diese Materialien bieten umfassende Einblicke in die Schwachstelle, ihre Auswirkungen auf die Softwaresicherheit und die laufenden Bemühungen zur Gewährleistung der Sicherheit und Integrität von Webanwendungen.
Ursprüngliches Entwicklungs-Repo: https://github.com/gkrishnan724/CVE-2021-38297