
Um cenário de prova de conceito para exploração do estouro de buffer GO WASM CVE2021-38297
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.
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.

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:

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

Em resumo:
argv e posts no endereço de memória 0x5000.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.

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:
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. 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 :)

Nesta aplicação, também forneci um script de correção. Que usa uma versão mais nova 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, vemos um erro: Argument length too long.

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:

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.
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