Únase a nosotros el 30 de abril: Presentación de la prueba CT de Parasoft C/C++ para pruebas continuas y excelencia en el cumplimiento | Regístrese ahora

Análisis de la vulnerabilidad OpenSSL Punycode (CVE-2022-3602)

Logotipo del cubo de Parasoft 300x300
8 de diciembre de 2022
4 min leer

Los ataques de Punycode son ataques de phishing que usan dominios para imitar marcas populares. En esta publicación, analizamos la vulnerabilidad Punycode de alta gravedad, CVE-2022-3602.

El 1 de noviembre de 2022, el proyecto OpenSSL anunció dos vulnerabilidades de alta gravedad en OpenSSL. Dado que ambas vulnerabilidades estaban relacionadas con el análisis de Punycode, se las conoce coloquialmente como vulnerabilidades de Punycode. En esta publicación, analizaremos CVE-2022-3602.

OpenSSL es una biblioteca para crear y mantener la identidad y la comunicación segura entre computadoras al proporcionar una capa de conexión segura y herramientas relacionadas. Se implementa ampliamente en sistemas Windows y Linux/Unix junto con una amplia variedad de plataformas integradas.

Estas vulnerabilidades afectaron a OpenSSL v3.0.0 a v3.0.6.

Descripción general de la vulnerabilidad de Punycode

Comprender Punycode es un requisito previo fundamental para comprender estas vulnerabilidades OpenSSL relacionadas. Tal como se define en RFC 3492, Punycode es una forma de utilizar una cadena de caracteres ASCII para codificar una cadena de caracteres Unicode. Estas cadenas Punycode se utilizan internamente al resolver dominios que contienen caracteres Unicode.

En OpenSSL v3.0.6 cripto/punycode.c existe un error por un error en la línea 184 donde si (escrito_out > max_out) debería ser en su lugar si (escrito_out >=max_out). Cuando OpenSSL intenta procesar un certificado que contiene una dirección de correo electrónico manipulada con un dominio Punycode, el desbordamiento de búfer resultante puede provocar un bloqueo del programa o la ejecución remota de código.

Descripción general de la prueba de concepto

Para demostrar la vulnerabilidad en OpenSSL usando Insure++, usamos el disponible públicamente prueba de concepto creada por Data Dog Security Labs. Esta prueba de concepto tiene la limitación de que no siempre genera un bloqueo, pero siempre genera un problema de corrupción de memoria que Insure++ puede detectar. Si está interesado en una inmersión detallada tanto en la vulnerabilidad como en la prueba de concepto, mira su blog.

Configuración de demostración

Para nuestra demostración, tenemos dos máquinas virtuales conectadas en la misma LAN. La máquina virtual de la "víctima" ejecutará Windows 10 y la versión vulnerable de OpenSSL equipada con Insure++. La máquina virtual "atacante" ejecutará Ubuntu y utilizará la prueba de concepto de Data Dog Security Labs. Para esta demostración, la dirección IP de la "víctima" será 192.168.1.10 y la dirección IP del "atacante" será 192.168.1.20.

Primero, configuraremos nuestra máquina virtual "víctima" de Windows 10. Para construir OpenSSL desde la fuente, necesitamos instalar Visual Studio 2022 y Parasoft Insure++. Los requisitos previos adicionales incluyen 'Strawberry Perl', NASM y 'Git para Windows' también deben instalarse e incluirse en Windows TRAYECTORIA.

A continuación, clonaremos el repositorio git de OpenSSL desde github.com/openssl/openssl.git y verifique la etiqueta de versión vulnerable usando el siguiente comando.

git checkout -b v3.0.6 etiquetas/openssl-3.0.6

Después de esto, debemos modificar las configuraciones de compilación para crear un perfil de compilación que usará Insure++ para instrumentar OpenSSL a medida que se compila. Para hacer esto, heredaremos del perfil de compilación de Visual C Windows de 64 bits haciendo algunas modificaciones pequeñas para Insure++. Abierto Configuraciones/10-main.conf e inserte lo siguiente después de la línea 1421.

"VC-WIN64A-ASEGURO" => {
heredar_de => [ "VC-WIN64A" ],
CC => "asegurar",
LD => "inslink",
},

Ahora inicie un "Símbolo del sistema de herramientas nativas x64 para VS 2022" y navegue hasta donde clonó el repositorio de código fuente de OpenSSL. Ejecute el siguiente comando para configurar la fuente de nuestro perfil de compilación Insure++.

perl Configurar VC-WIN64A-INSURE

Si el comando anterior tuvo éxito, estamos listos para construir usando el siguiente comando. Esto construirá OpenSSL usando Visual Studio mientras que Insure++ instrumenta el código generado.

hacer

Podrá ver el código compilado en la GUI de Insure++ como se ve en la siguiente imagen.

Captura de pantalla que muestra el código de compilación de Parasoft Insure++.

Si la compilación tuvo éxito, hemos terminado de configurar nuestra máquina virtual "víctima". Para la máquina virtual "atacante", simplemente instale Ubuntu y clone el repositorio de prueba de concepto git de github.com/DataDog/security-labs-pocs.git.

Ejecución de prueba de concepto en entorno de demostración

En la máquina virtual "atacante", desde la raíz del repositorio de prueba de conceptos de Data Dog Security Labs que clonamos, vaya a prueba de concepto-exploits/openssl-punycode-vulnerability/vagrant/WindowsCrash. En este directorio hay certificados y claves manipulados que reproducirán la vulnerabilidad cuando se inicie un servidor OpenSSL con ellos. No es necesario tener una versión vulnerable de OpenSSL para usar estos archivos, por lo que lanzaremos un servidor OpenSSL usando la versión que viene con Ubuntu. El siguiente comando iniciará un servidor OpenSSL con las claves y certificados de prueba de concepto.

openssl s_server -accept 3000 -CAfile ca.crt -cert test.crt -key test.key.pem -state

Con el servidor OpenSSL ejecutándose en nuestra máquina virtual "atacante", estamos listos para usar nuestro cliente OpenSSL instrumentado de Insure++ en la máquina virtual "víctima" para reproducir y analizar la vulnerabilidad. En la máquina virtual "víctima", desde la raíz del repositorio de OpenSSL que clonamos, navegue hasta =apps= y ejecute el siguiente comando.

openssl.exe s_client -conectar 10.10.10.7:3000

Cuando el cliente "víctima" se conecta al servidor "atacante", Insure++ detectará el desbordamiento de escritura en la memoria y lo mostrará en la GUI como se ve en la siguiente imagen.

Captura de pantalla que muestra a Parasoft Insure++ detectando el desbordamiento de escritura en la memoria y mostrándolo en la GUI.

Analizando la vulnerabilidad con Insure++

Como se ve en la imagen anterior, Insure++ detectó una variedad de problemas de memoria de esta ejecución de OpenSSL. Centrémonos en particular en el defecto relacionado con esta vulnerabilidad de Punycode. En la interfaz gráfica de usuario de Insure++, haga clic en el WRITE_OVERFLOW= en=códigopuny.c en como 187. Debería ver algo similar a lo siguiente.

Captura de pantalla de la GUI de Parasoft Insure++ que muestra la vulnerabilidad Punycode detectada.

Puede ver que Insure++ ha identificado correctamente la debilidad como CWE-120, que coincide con la entrada de CVE-2022-3602 en el entrada NIST. Debajo de esto, podemos ver un gráfico que muestra el de nuestro búfer original de 2048 bytes, la llamada a memmove () escribe 12 bytes al final del búfer, de los cuales 8 bytes están dentro del búfer y los últimos 4 bytes se desbordan. Este hallazgo concuerda con los resultados publicados en el mencionado blog de Data Dogs Security Labs. Los rangos de direcciones exactos involucrados se muestran debajo de esto. Finalmente, puede ver un seguimiento de la pila y un fragmento de código en la ventana.

Conclusión

Espero haber demostrado algunas de las características y habilidades únicas de Insure++ junto con nuestra nueva GUI. Estas características hacen de Insure++ una gran adición a las herramientas de un investigador de seguridad, especialmente cuando se trabaja con fuzzing, investigación de vulnerabilidades y ataques basados ​​en la memoria.

¿Quiere ver cómo detectar automáticamente los desbordamientos de escritura en la memoria usando Insure++?