Tome un camino más rápido e inteligente hacia la automatización de pruebas C/C++ impulsada por IA. Descubra cómo >>
Análisis de la vulnerabilidad OpenSSL Punycode (CVE-2022-3602)
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.
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.
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.
Para demostrar la vulnerabilidad en OpenSSL usando Insure++, usamos el disponible públicamente prueba de concepto creada por Data Dog Security LabsEsta prueba de concepto es limitada, ya que no siempre genera un bloqueo, pero siempre genera un corrupción de memoria problema 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.
Para nuestra demostración, contamos con dos máquinas virtuales conectadas en la misma LAN. La máquina virtual "víctima" ejecutará Windows 10 y la versión vulnerable de OpenSSL instrumentada 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 del "atacante", 192.168.1.20.
Primero, configuraremos nuestra máquina virtual "víctima" de Windows 10. Para compilar OpenSSL desde el código fuente, necesitamos instalar Visual Studio 2022 y Parasoft Insure++. Los requisitos adicionales incluyen "Strawberry Perl", NASM y "Git para Windows" que también deben estar instalados e incluidos 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 abra el símbolo del sistema de herramientas nativas x64 para VS 2022 y navegue hasta donde clonó el repositorio Git del código fuente de OpenSSL. Ejecute el siguiente comando para configurar el código fuente de nuestro perfil de compilación de 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.

Si la compilación se realizó correctamente, habremos terminado de configurar nuestra máquina virtual "víctima". Para la máquina virtual "atacante", simplemente instale Ubuntu y clone el repositorio Git de la prueba de concepto desde github.com/DataDog/security-labs-pocs.git.
En la máquina virtual "atacante", desde la raíz del repositorio de prueba de conceptos de Data Dog Security Labs que clonamos, navegue 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 con 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 OpenSSL que clonamos, acceda a =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 de memoria y lo mostrará en la GUI como se ve en la siguiente imagen.

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.

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