Prueba de concepto educativa que replica CVE-2021-38297, un desbordamiento de búfer en Go WASM que conduce a XSS almacenado. Incluye configuración de la aplicación vulnerable, pasos de reproducción del exploit y guía de parcheo para investigación de seguridad.
WebAssembly (WASM) 🌍, un formato de instrucción binaria de vanguardia, permite la ejecución fluida de lenguajes de alto nivel como C, C++, Rust y GO en navegadores web modernos. Sin embargo, el descubrimiento de CVE-2021-38297 🚩 reveló una falla crítica en el proceso de compilación y carga de GO para binarios WASM compilados con GO. Esta vulnerabilidad, encontrada en el cargador JavaScript de WASM (wasm_exec.js) proporcionado por GO, permitía la inclusión sin restricciones de datos en el argumento argv. Dado que argv se almacena en la memoria lineal de WASM, actores maliciosos podrían explotar esto para sobrescribir la memoria lineal del programa WASM compilado con GO con una entrada argv de tamaño excesivo, lo que lleva a resultados impredecibles y potencialmente peligrosos. Esta vulnerabilidad era una preocupación significativa en versiones de GO anteriores a la 1.17.2.
En resumen:
argv y las publicaciones en la dirección de memoria 0x5000.toLeetSpeak y processSharedVar se emplean para el contenido de comentarios y publicaciones, respectivamente.En nuestra prueba de concepto, presentamos "Vuln-Twitter", una plataforma de redes sociales simulada que permite contenido generado por el usuario a través de publicaciones y comentarios. Utilizando un servidor web Node.js y SQLite para el almacenamiento de datos, el front-end de Vuln-Twitter emplea JavaScript plano junto con un módulo GO WASM llamado wordprocessor.wasm para el renderizado dinámico de contenido. Este módulo, notablemente, incluye métodos como toLeetSpeak, que transforma las entradas del usuario en "LeetSpeak" estilizado para una experiencia de usuario atractiva.

Nuestra exploración revela un punto crítico de explotación durante la fase de renderizado de contenido, donde cada comentario se transforma mediante el módulo GO WASM. Un comentario especialmente diseñado y de gran tamaño puede desencadenar la vulnerabilidad, provocando un desbordamiento de búfer que manipula el contenido de la publicación original, demostrando un vector de ataque clásico de XSS almacenado. Esta vulnerabilidad no solo subraya el potencial de manipulación maliciosa de datos, sino que también resalta las implicaciones más amplias de las prácticas de programación segura en el contexto del desarrollo web y las aplicaciones WASM. Consulte la sección de código que hace lo mismo:

Diagrama de memoria lineal de WASM al renderizar un comentario:

Para los entusiastas e investigadores interesados en explorar esta vulnerabilidad más a fondo, proporcionamos pasos detallados para reproducir el entorno de explotación utilizando una versión vulnerable específica de GO. Este enfoque práctico facilita una comprensión más profunda de la mecánica de la vulnerabilidad y las posibles estrategias de mitigación.
Nota: Para reproducir esto, necesita instalar la versión go1.17.1 de go localmente, que es la versión vulnerable utilizada en este escenario. Puede consultar la documentación oficial de go sobre cómo instalar versiones específicas de go.
Ahora intentemos reproducir el escenario anterior:
git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitternpm install para instalar todas las dependenciasnpm run resetDB que inicializará la base de datos con algunas publicaciones y comentarios.npm run dev que iniciará el servidor local, abra localhost:3000 en un navegador y debería poder ver una página de inicio de sesión.Ahora, iniciemos sesión con una cuenta maliciosa; use las credenciales: nombre de usuario: I_CANT_HACK, contraseña: hacker. Una vez iniciada la sesión, debería poder ver el feed con algunas publicaciones.
Esta publicación parece bastante interesante:
Amazon: ready 4 black friday? https://www.amazon.com/blackfriday
¿Qué pasa si, utilizando la técnica anterior, podemos sobrescribir la publicación de Amazon.com para que apunte a un enlace malicioso?
Consulte el archivo exploit.txt, que contiene el comentario relleno con muchas "A" de manera que sobrescribimos todo hasta la dirección 0x5000; al final puede ver el texto ready for black friday? https://evil.com/blackfriday. Si copiamos este texto y comentamos en la publicación anterior, deberíamos poder sobrescribir la publicación original con el texto anterior.
Inténtelo usted mismo y vea :)

Reconociendo la gravedad de esta vulnerabilidad, también describimos una estrategia integral de parcheo, utilizando una versión actualizada y segura de GO para mitigar el riesgo. Esta sección sirve como guía para desarrolladores y administradores de sistemas para fortalecer sus aplicaciones contra tales vulnerabilidades, enfatizando la importancia de las actualizaciones periódicas de software y las prácticas de seguridad vigilantes.
En esta aplicación, también he proporcionado un script de parche. Que utiliza una versión más nueva de go:
npm run patchServerEsto debería recompilar el archivo go con la nueva versión e iniciar el servidor con la versión parcheada
Ahora debería notar que la publicación no se sobrescribe y, si observa la consola, vemos un error en su lugar: Argument length too long.

Nuestro viaje a través de la explotación y mitigación de CVE-2021-38297 ofrece valiosas ideas sobre los desafíos y oportunidades que presenta la integración de lenguajes de programación de alto nivel en entornos web a través de WASM. Invita a un examen crítico de las prácticas de seguridad en el desarrollo de software, instando a un enfoque proactivo en la gestión de vulnerabilidades y la adopción de estándares de codificación segura. Según nuestro entendimiento, creemos que el diseño de la memoria lineal de GO se representa a continuación:
