Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2021-38297 — Um cenário de prova de conceito para exploração do estouro de buffer GO WASM CVE2021-38297 | Kitploit
Ferramentas/GitHubGitHub/gkrishnan724/cve-2021-38297
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebCTFPapers e PesquisaAprendizado e EducaçãoExploração de BináriosLabs e Prática
GitHubgkrishnan724/cve-2021-38297

CVE-2021-38297

Um cenário de prova de conceito para exploração do estouro de buffer GO WASM CVE2021-38297

Ver Repositório
8145há 2 anosAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Explorando CVE-2021-38297: Vulnerabilidade de Buffer Overflow em GO Wasm

Visão Geral da Vulnerabilidade

WebAssembly (WASM) serve como um formato de instrução binária executável na maioria dos navegadores web modernos. Ele atua como um alvo de compilação para várias linguagens de alto nível como C, C++, Rust e GO, permitindo que código seja escrito nessas linguagens e compilado para WASM.

CVE-2021-38297 destaca um bug crítico na compilação e carregamento de binários WASM compilados com GO. A vulnerabilidade reside no carregador JS wasm (wasm_exec.js) fornecido pelo GO, permitindo o carregamento de binários WASM com dados irrestritos no argumento argv. Como argv é armazenado na memória linear do WASM, agentes maliciosos poderiam explorar isso para sobrescrever a memória linear do programa WASM compilado com GO com uma entrada argv excessivamente grande.

Esta vulnerabilidade persistiu nas versões do GO anteriores a 1.17.2.

Aplicação Vulnerável: Vuln-Twitter

Esta prova de conceito demonstra uma aplicação de rede social, Vuln-Twitter, permitindo que vários usuários publiquem conteúdo e comentários. O servidor web, construído em Node.js, utiliza SQLite para armazenar dados de posts e comentários.

O front-end emprega JS puro juntamente com um módulo GO WASM chamado wordprocessor.wasm. Este módulo expõe métodos como toLeetSpeak, que transforma strings de entrada em "LeetSpeak" (ex.: "Hello!" se torna "h3ll0!").

Os módulos GO WASM ajudam a renderizar posts e comentários em LeetSpeak.

Interface do Vuln Twitter

Explorando o Buffer Overflow

Durante o processo de renderização no front-end, ao receber posts e comentários do servidor, cada comentário é renderizado para "LeetSpeak" usando o módulo GO WASM. O comentário de cada post é passado como parte da variável argv após carregar o módulo GO WASM.

Além disso, existe um método, processSharedVar(), no módulo GO, projetado para ler a string localizada no endereço 0x5000 e convertê-la para fala simplificada (ex.: "How are you?" se torna "How r u?"). O post original é explicitamente adicionado a 0x5000 na memória linear para ser acessado por este método, alterando o conteúdo do post.

Consulte a seção de código que faz o mesmo:

Lógica de Renderização

Diagrama da memória linear WASM ao renderizar um comentário:

Lógica de renderização da memória

Técnica de Exploração

Em resumo:

  1. O front-end renderiza cada post e seus comentários.
  2. Durante a renderização, o módulo GO WASM carrega, processando comentários através da variável argv e posts no endereço de memória 0x5000.
  3. Funções como toLeetSpeak e processSharedVar são empregadas para comentário e conteúdo do post, respectivamente.

Considerando a ausência de verificações de tamanho em argv com base em CVE-2021-38297, surge uma ameaça potencial. Se um usuário malicioso comentar com um comentário excessivamente grande em um post que não possui, este comentário será passado através de argv durante a renderização. Como não há limite de tamanho, o conteúdo no endereço 0x5000 (representando o post original) se torna suscetível a sobrescrita.

Ao explorar essa falha, um usuário malicioso efetivamente altera o conteúdo do post original, semelhante a um ataque de XSS Armazenado. Consequentemente, quando outros visualizarem a página, o conteúdo alterado será exibido, perpetuado pela lógica de front-end compartilhada aplicada à renderização de todos, resultando na sobrescrita do post visível para todos.

Fluxo de Exploração

Reproduzindo o exploit

Nota: Para reproduzir isso, você precisa instalar a versão go1.17.1 do go localmente, que é a versão vulnerável usada neste cenário. Você pode consultar a documentação oficial do go sobre como instalar versões específicas.

Agora vamos tentar reproduzir o cenário acima:

  1. Para configurar toda a aplicação, primeiro clone o projeto: git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitter
  2. Execute npm install para instalar todas as dependências
  3. Execute npm run resetDB que inicializará o banco de dados com alguns posts e comentários.
  4. Execute npm run dev que iniciará o servidor local, abra localhost:3000 em um navegador e você deverá ver uma página de login.

Agora, vamos fazer login com uma conta maliciosa usando as credenciais nome de usuário: I_CANT_HACK, senha: hacker. Uma vez logado, você deverá ver o feed com alguns posts.

Este post parece bem interessante:

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

E se, usando a técnica acima, conseguirmos sobrescrever o post da Amazon.com, para apontar para um link malicioso?.

Consulte o arquivo exploit.txt, que contém o comentário preenchido com padding de "A"s para sobrescrever tudo até o endereço 0x5000. No final, você pode ver o texto ready for black friday? https://evil.com/blackfriday. Se copiarmos esse texto e comentarmos no post acima, devemos conseguir sobrescrever o post original com o texto acima.

Experimente você mesmo e veja :)

Exploit

Correção

Nesta aplicação, também forneci um script de correção. Que usa uma versão mais nova do go:

  1. Execute o target npm run patchServer

Isso deve recompilar o arquivo go com a nova versão e iniciar o servidor com a versão corrigida.

Você deve notar agora que o post não está sendo sobrescrito e, se observar o console, vemos um erro: Argument length too long.

Correção

Conclusão

Demonstramos um cenário onde alavancar um buffer overflow WASM na memória linear nos permitiu executar um ataque de XSS armazenado. No entanto, é essencial notar a especificidade desse exploit: exigiu que manipulássemos um texto em um endereço fixo na memória linear. Em aplicações web práticas, descobrir tais vulnerabilidades pode ser extremamente desafiador devido a esse nível de especificidade. Além disso, sobrescrever dados arbitrários na memória linear sem causar uma falha no sistema é complexo, especialmente ao lidar com módulos e dados internos do GO, em grande parte devido à falta de documentação abrangente sobre o layout de memória do GO.

Com base em nosso entendimento, acreditamos que o layout de memória linear do GO seja o representado abaixo:

Layout de memória GO

Embora essa exploração introduza vetores de ataque interessantes no desenvolvimento web, particularmente dentro do WASM, ela também introduz riscos de segurança inerentes associados a linguagens de programação. Por exemplo, considere um cenário onde um programa C é compilado para WASM. Se o programa C original tiver overflows ou vulnerabilidades, esses riscos são transferidos para o ambiente WASM, expondo-o a vulnerabilidades e ameaças semelhantes.

Slides da Apresentação

Somos estudantes da Carnegie Mellon University e apresentamos esta prova de conceito do CVE em uma de nossas aulas (18-739D Hacking101). Você pode consultar nossa apresentação de slides aqui: GOWasm.pptx

Créditos e Contribuições

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

Fontes

  • 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/
Baixar ferramenta