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.
Este projeto é um testemunho de pesquisa colaborativa e investigação acadêmica, liderado por uma equipe dedicada de estudantes e pesquisadores:
Esta prova de conceito apresenta um aplicativo de mídia social, o Vuln-Twitter, que permite que vários usuários publiquem conteúdo e comentários. O servidor web, construído em Node.js, utiliza SQLite para armazenar os dados de posts e comentários.
O front-end utiliza JavaScript puro junto com um módulo GO WASM chamado wordprocessor.wasm. Esse módulo expõe métodos como toLeetSpeak, que transforma strings de entrada em "LeetSpeak" (por exemplo, "Hello!" vira "h3ll0!").
Os módulos GO WASM auxiliam na renderização de posts e comentários em LeetSpeak.
Durante o processo de renderização do 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 o carregamento do 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 em fala simplificada (por exemplo, "How are you?" vira "How r u?"). O post original é explicitamente adicionado a 0x5000 na memória linear para ser acessado por esse método, alterando o conteúdo do post.
Para aqueles interessados em se aprofundar no CVE-2021-38297 e em suas implicações mais amplas, fornecemos uma lista selecionada de recursos e leituras, desde boletins oficiais de segurança até blogs técnicos e artigos acadêmicos. Esses materiais oferecem insights abrangentes sobre a vulnerabilidade, seu impacto na segurança de software e os esforços contínuos para garantir a segurança e a integridade dos aplicativos web.
Repositório Original de Desenvolvimento : https://github.com/gkrishnan724/CVE-2021-38297