Prova de conceito educacional que replica CVE-2021-38297, um estouro de buffer em Go WASM que leva a XSS armazenado. Inclui configuração de aplicativo vulnerável, etapas de reprodução do exploit e guia de correção para pesquisa de segurança.
WebAssembly (WASM) 🌍, um formato de instrução binária de ponta, permite a execução perfeita de linguagens de alto nível como C, C++, Rust e GO em navegadores web modernos. No entanto, a descoberta do CVE-2021-38297 🚩 revelou uma falha crítica no processo de compilação e carregamento do GO para binários WASM compilados em GO. Essa vulnerabilidade, encontrada no carregador JavaScript WASM (wasm_exec.js) fornecido pelo GO, permitia a inclusão irrestrita de dados no argumento argv. Com argv armazenado na memória linear do WASM, agentes mal-intencionados poderiam explorar isso para sobrescrever a memória linear do programa WASM compilado em GO com uma entrada argv superdimensionada, levando a resultados imprevisíveis e potencialmente perigosos. Essa vulnerabilidade era uma preocupação significativa em versões do GO anteriores a 1.17.2.
Em resumo:
argv e os posts no endereço de memória 0x5000.toLeetSpeak e processSharedVar são usadas para o conteúdo dos comentários e dos posts, respectivamente.Em nossa prova de conceito, apresentamos o "Vuln-Twitter", uma plataforma fictícia de mídia social que permite conteúdo gerado pelo usuário por meio de posts e comentários. Utilizando um servidor web Node.js e SQLite para armazenamento de dados, o front-end do Vuln-Twitter combina JavaScript puro com um módulo GO WASM chamado wordprocessor.wasm para renderização dinâmica de conteúdo. Este módulo, notavelmente, inclui métodos como toLeetSpeak, transformando entradas do usuário em "LeetSpeak" estilizado para uma experiência de usuário envolvente.

Nossa exploração revela um ponto crítico de exploração durante a fase de renderização de conteúdo, em que cada comentário passa por transformação pelo módulo GO WASM. Um comentário superdimensionado especialmente criado pode acionar a vulnerabilidade, levando a um buffer overflow que manipula o conteúdo original do post, demonstrando um vetor clássico de ataque de XSS Armazenado (Stored XSS). Essa vulnerabilidade não apenas evidencia o potencial de manipulação maliciosa de dados, mas também destaca as implicações mais amplas de práticas de programação segura no contexto do desenvolvimento web e de aplicações WASM. Consulte a seção de código que faz o mesmo:

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

Para entusiastas e pesquisadores interessados em explorar mais essa vulnerabilidade, fornecemos etapas detalhadas para reproduzir o ambiente do exploit usando uma versão vulnerável específica do GO. Essa abordagem prática facilita uma compreensão mais profunda dos mecanismos da vulnerabilidade e das possíveis estratégias de mitigação.
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 do Go.
Agora vamos tentar reproduzir o cenário acima:
git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitternpm install para instalar todas as dependênciasnpm run resetDB, que inicializará o banco de dados com alguns posts e comentários.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; depois de 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, pudéssemos sobrescrever o post da Amazon.com para apontar para um link malicioso?
Consulte o arquivo exploit.txt; ele contém o comentário preenchido com uma sequência de "A"s de modo que sobrescrevemos 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 ser capazes de sobrescrever o post original com o texto acima.
Experimentem por conta própria e vejam :)

Reconhecendo a gravidade dessa vulnerabilidade, também delineamos uma estratégia abrangente de correção, empregando uma versão atualizada e segura do GO para mitigar o risco. Esta seção serve como um guia para desenvolvedores e administradores de sistemas fortalecerem seus aplicativos contra tais vulnerabilidades, enfatizando a importância de atualizações regulares de software e práticas de segurança vigilantes.
Neste aplicativo, também forneci um script de correção, que usa uma versão mais recente do Go:
npm run patchServerIsso 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, veremos um erro: Argument length too long.

Nossa jornada pela exploração e mitigação do CVE-2021-38297 oferece percepções valiosas sobre os desafios e as oportunidades apresentados pela integração de linguagens de programação de alto nível em ambientes web por meio do WASM. Isso estimula um exame crítico das práticas de segurança no desenvolvimento de software, incentivando uma abordagem proativa ao gerenciamento de vulnerabilidades e a adoção de padrões de codificação seguros. Com base em nosso entendimento, acreditamos que o layout da memória linear do GO está representado abaixo:

Como estudantes da Carnegie Mellon University, nossa investigação sobre o CVE-2021-38297 contribui para o discurso acadêmico e profissional mais amplo sobre segurança cibernética, oferecendo um estudo de caso prático sobre as implicações das tecnologias emergentes na segurança de software. Nossos materiais de apresentação, disponíveis para revisão, elucidam ainda mais nossas descobertas e metodologias, convidando ao diálogo e à colaboração entre a comunidade de segurança cibernética.