Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2021-38297 — Uno scenario Proof of concept per lo sfruttamento del buffer overflow GO WASM di CVE2021-38297 | Kitploit
Strumenti/GitHubGitHub/gkrishnan724/cve-2021-38297
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebCTFPaper e RicercaApprendimento e FormazioneBinary ExploitationLab e Pratica
GitHubgkrishnan724/cve-2021-38297

CVE-2021-38297

Uno scenario Proof of concept per lo sfruttamento del buffer overflow GO WASM di CVE2021-38297

Vedi Repository
812 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Sfruttamento di CVE-2021-38297: Vulnerabilità di buffer overflow in GO Wasm

Panoramica della vulnerabilità

WebAssembly (WASM) funge da formato di istruzioni binarie eseguibile nella maggior parte dei browser moderni. Agisce come target di compilazione per vari linguaggi ad alto livello come C, C++, Rust e GO, consentendo di scrivere codice in questi linguaggi e compilarlo in WASM.

La CVE-2021-38297 evidenzia un bug critico nella compilazione e nel caricamento da parte di GO dei binari WASM compilati con GO. La vulnerabilità risiede nel loader JS wasm (wasm_exec.js) fornito da GO, che consente il caricamento di binari WASM con dati senza restrizioni nell'argomento argv. Poiché argv è memorizzato nella memoria lineare di WASM, attori malintenzionati potrebbero sfruttare questo comportamento per sovrascrivere la memoria lineare del programma WASM compilato con GO tramite un input argv eccessivamente grande.

Questa vulnerabilità era presente nelle versioni di GO precedenti alla 1.17.2.

Applicazione vulnerabile: Vuln-Twitter

Questa prova di concetto presenta un'applicazione di social media, Vuln-Twitter, che consente a più utenti di pubblicare contenuti e commenti. Il server web, basato su Node.js, utilizza SQLite per memorizzare i dati di post e commenti.

Il front-end impiega semplice JavaScript insieme a un modulo GO WASM chiamato wordprocessor.wasm. Questo modulo espone metodi come toLeetSpeak, che trasforma le stringhe di input in "LeetSpeak" (ad esempio, "Hello!" diventa "h3ll0!").

I moduli GO WASM aiutano a visualizzare post e commenti in LeetSpeak.

Interfaccia di Vuln twitter

Sfruttare il buffer overflow

Durante il processo di rendering del front-end, quando riceve post e commenti dal server, ogni commento viene renderizzato in "LeetSpeak" utilizzando il modulo GO WASM. Il commento di ogni post viene passato come parte della variabile argv dopo il caricamento del modulo GO WASM.

Inoltre, nel modulo GO esiste un metodo, processSharedVar(), progettato per leggere la stringa situata all'indirizzo 0x5000 e convertirla in un discorso semplificato (ad esempio, "How are you?" diventa "How r u?"). Il post originale viene esplicitamente aggiunto a 0x5000 nella memoria lineare per essere accessibile a questo metodo, modificando il contenuto del post.

Fai riferimento alla sezione di codice che fa lo stesso:

Logica di rendering

Diagramma della memoria lineare WASM durante il rendering di un commento:

Memoria della logica di rendering

Tecnica di sfruttamento

In sintesi:

  1. Il front-end renderizza ogni post e i relativi commenti.
  2. Durante il rendering, il modulo GO WASM viene caricato, elaborando i commenti tramite la variabile argv e i post all'indirizzo di memoria 0x5000.
  3. Funzioni come toLeetSpeak e processSharedVar vengono utilizzate rispettivamente per il contenuto dei commenti e dei post.

Considerando la mancanza di controlli sulla dimensione di argv evidenziata da CVE-2021-38297, emerge una potenziale minaccia. Se un utente malintenzionato commenta con un commento eccessivamente grande su un post che non possiede, questo commento verrà passato attraverso argv durante il rendering. Non essendoci un limite di dimensione, il contenuto all'indirizzo 0x5000 (che rappresenta il post originale) diventa suscettibile di sovrascrittura.

Sfruttando questa falla, un utente malintenzionato modifica effettivamente il contenuto del post originale, in modo simile a un attacco Stored XSS. Successivamente, quando altri visualizzano la pagina, il contenuto alterato viene mostrato, perpetuato dalla logica di front-end condivisa applicata al rendering per tutti, con il risultato che il post sovrascritto è visibile a tutti.

Flusso di sfruttamento

Riprodurre l'exploit

Nota: per riprodurre questo scenario devi installare localmente la versione go1.17.1 di go, che è la versione vulnerabile utilizzata in questo scenario. Puoi fare riferimento alla documentazione ufficiale di go su come installare versioni specifiche di go.

Ora proviamo a riprodurre lo scenario sopra descritto:

  1. Per configurare l'intera applicazione, clona prima il progetto: git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitter
  2. Esegui npm install per installare tutte le dipendenze
  3. Esegui npm run resetDB che inizializzerà il database con alcuni post e commenti.
  4. Esegui npm run dev che avvierà il server locale, apri localhost:3000 in un browser e dovresti vedere una pagina di login.

Ora accediamo con un account malintenzionato usando le credenziali username: I_CANT_HACK, password: hacker; una volta effettuato l'accesso, dovresti vedere il feed con alcuni post.

Questo post sembra piuttosto interessante:

Amazon: ready 4 black friday? https://www.amazon.com/blackfriday

E se, usando la tecnica sopra descritta, riuscissimo a sovrascrivere il post di Amazon.com per farlo puntare a un link malintenzionato?

Fai riferimento al file exploit.txt: contiene il commento riempito con padding di "A" in modo da sovrascrivere tutto fino all'indirizzo 0x5000; alla fine puoi vedere il testo ready for black friday? https://evil.com/blackfriday. Se copiamo questo testo e lo commentiamo sul post precedente, dovremmo essere in grado di sovrascrivere il post originale con il testo sopra.

Provateci voi stessi e vedrete :)

Exploit

Patch

In questa applicazione ho anche fornito uno script di patch, che utilizza una versione più recente di go:

  1. Esegui il target npm run patchServer

Questo dovrebbe ricompilare il file go con la nuova versione e avviare il server con la versione patchata.

Ora dovresti notare che il post non viene sovrascritto e, se osservi la console, vediamo invece un errore Argument length too long.

Patch

Conclusione

Abbiamo dimostrato uno scenario in cui lo sfruttamento di un buffer overflow WASM sulla memoria lineare ci ha permesso di eseguire un attacco Stored XSS. Tuttavia, è essenziale notare la specificità di questo exploit: richiedeva di manipolare un testo a un indirizzo hardcoded nella memoria lineare. Nelle applicazioni web reali, scoprire vulnerabilità di questo tipo può essere estremamente difficile a causa di questo livello di specificità. Inoltre, sovrascrivere dati arbitrari nella memoria lineare senza causare un crash di sistema è complesso, soprattutto quando si ha a che fare con i moduli e i dati interni di GO, in gran parte a causa della mancanza di documentazione completa sul layout di memoria di GO.

In base alla nostra comprensione, riteniamo che il layout della memoria lineare di GO sia quello illustrato di seguito:

Layout memoria GO

Sebbene questo sfruttamento introduca interessanti vettori di attacco nello sviluppo web, in particolare all'interno di WASM, introduce anche rischi di sicurezza intrinseci associati ai linguaggi di programmazione. Ad esempio, si consideri uno scenario in cui un programma C viene compilato in WASM. Se il programma C originale presenta overflow o vulnerabilità, questi rischi si trasferiscono nell'ambiente WASM, esponendolo a vulnerabilità e minacce simili.

Slide della presentazione

Siamo studenti della Carnegie Mellon University e abbiamo presentato questa prova di concetto della CVE in una delle nostre classi (18-739D Hacking101). Puoi fare riferimento alla nostra presentazione qui: GOWasm.pptx

Crediti e contributi

  • Gopala Krishnan (@gkrishnan724)
  • Zhejia Yang (@zildjianpoi)
  • Shubham Kulkarni (@shubhamkulkarni97)
  • Paras Saxena
  • Anisha Nilakantan

Fonti

  • https://www.ibm.com/support/pages/security-bulletin-ibm-event-streams-affected-potential-buffer-overflow-golang-cve-2021-38297-0
  • https://vulmon.com/vulnerabilitydetails?qid=CVE-2021-38297&scoretype=cvssv3
  • https://pedromarquez.dev/blog/2023/2/node_golang_wasm
  • https://nvd.nist.gov/vuln/detail/CVE-2021-38297
  • https://github.com/golang/go/issues/48797
  • https://github.com/golang/go/commit/f63250238be548b7c6c24ae840541102a5cfef99
  • https://jfrog.com/blog/cve-2021-38297-analysis-of-a-go-web-assembly-vulnerability/
  • https://stackoverflow.com/questions/64763007/why-is-webassembly-safe-and-what-is-linear-memory-model
  • https://webassembly.org/
  • https://hacks.mozilla.org/2019/08/webassembly-interface-types/
  • https://blog.protekkt.com/blog/basic-webassembly-buffer-overflow-exploitation-example
  • https://www.usenix.org/system/files/sec20_slides_lehmann.pdf
  • https://xeiaso.net/talks/wasm-abi/
Scarica lo strumento