Fuzzing de estilo 2000 en aplicaciones modernas de Windows 10


Fig. 1. Contusionada, pero no rota. La calculadora de Windows, cuyo código se publicó recientemente en Github , resultó ser una de las dos aplicaciones probadas que no se bloquearon y no se opusieron al difusor de mensajes de ventana desarrollado en 2000. Tamaño de ventana especialmente ampliado para mostrar artefactos difusos

Es hora de que la segunda parte de nuestros esfuerzos pruebe técnicas antiguas de fuzzing en sistemas modernos. Si te perdiste, aquí está la primera parte . Esta vez, probaremos las técnicas de fuzzing de Windows 10 del artículo "Investigación empírica de la confiabilidad de las aplicaciones de Windows NT que usan pruebas aleatorias" (también conocido como "NT Fuzzing Report") de Justin Forrester y Barton Miller, publicado en 2000.

Los investigadores probaron 33 aplicaciones de Windows NT y una versión anterior de Windows 2000 para determinar la susceptibilidad a mensajes de ventana distorsionados y eventos aleatorios de mouse y teclado. Desde que el Dr. Miller publicó el código de fuzzer, utilizamos exactamente las mismas herramientas que los autores originales para buscar errores en las aplicaciones modernas de Windows.

Los resultados son casi idénticos: hace 19 años, el 100% de las aplicaciones probadas se bloquearon o se bloquearon cuando encontraron mensajes de ventana distorsionados. Hoy, el mismo fuzzer dejó caer o colgó el 93% de las aplicaciones probadas. Solo dos se pusieron de pie, incluido nuestro viejo amigo Calculadora (Fig. 1). También encontramos un error (pero no un problema de seguridad) en Windows.

Una breve introducción a Windows


Entonces, ¿qué son los mensajes de ventana y por qué hacen que un programa se bloquee?

Las aplicaciones de la GUI de Windows están controladas por eventos: movimientos del mouse, pulsaciones de botones, pulsaciones de teclas, etc. Una aplicación controlada por eventos no hará nada hasta que reciba un evento. Una vez que se recibe un evento, la aplicación realiza la acción en función del evento y luego espera otros eventos. ¿Te suena familiar? Esta arquitectura ha recibido una segunda vida en plataformas como node.js.

Los mensajes de ventana son un método de notificación de eventos de Windows . Cada uno de ellos tiene un código numérico asociado con un evento específico . Cada mensaje tiene uno o más parámetros, que por convención se llaman lParam y wParam . Definen información más detallada sobre el evento. Ejemplos de dicha información son las coordenadas del movimiento del mouse, qué tecla se presiona o qué texto mostrar en la ventana. Estos mensajes pueden ser enviados por el propio programa, el sistema operativo u otros programas. Pueden llegar en cualquier momento y en cualquier orden y deben ser procesados ​​por la aplicación en el lado receptor.

Implicaciones de seguridad


Antes de Windows Vista, un proceso de bajos privilegios podría enviar un mensaje a un proceso de altos privilegios. Usando la combinación correcta de mensajes, puede ejecutar código en ese proceso. En Vista, estos "ataques subversivos" estaban en gran medida protegidos por UIPI y al aislar los servicios del sistema en una sesión separada.

Es improbable que el procesamiento incorrecto de los mensajes de la ventana afecte la seguridad de los sistemas Windows modernos por dos razones. Primero, los mensajes de ventana no se pueden enviar a través de la red. En segundo lugar, bloquear una aplicación o ejecutar código en el mismo nivel de privilegio no es muy útil para un atacante. Probablemente, era obvio para los autores del informe fuzz NT. No hacen declaraciones de seguridad, pero señalan correctamente que las fallas en el procesamiento de los mensajes de la ventana implican una falta de pruebas rigurosas.

Hay algunas áreas donde la ejecución de código con los mismos privilegios puede comprometer la seguridad. Algunas aplicaciones combinan varias primitivas de seguridad para crear un nivel de privilegio artificial que no se encontró originalmente en el sistema operativo. Un ejemplo típico es un sandbox para renderizar en un navegador. Los fabricantes de navegadores son conscientes de estos problemas y han tomado medidas para abordarlos . Otro ejemplo son los productos antivirus. Allí, el panel de control funciona con privilegios normales, pero está aislado de otros módulos antivirus.

Metodología de prueba


Para difuminar todas las aplicaciones en el conjunto de pruebas, utilizamos el mismo código central y la misma técnica de difuminación descrita en el informe inicial de NT. En particular, en los modos SendMessage y PostMessage , fazzer utilizó tres iteraciones de 500,000 mensajes con 42 semillas y tres iteraciones de 500,000 mensajes con 1,337 semillas. Los resultados aparecieron después de realizar solo una iteración de cada método.

Perdimos la entrada aleatoria del mouse y el teclado debido a limitaciones de tiempo y al deseo de centrarnos únicamente en los mensajes de la ventana. También alentamos a aquellos que desean repetir las pruebas y confirmar los resultados.

Trampas


Para fuzzer en Windows 10 tuvo que hacer dos cambios menores. Primero, adáptelo para una plataforma de 64 bits. El segundo cambio permitió al fuzzer seleccionar un identificador de ventana específico utilizando el argumento de la línea de comando. Difuminar un descriptor específico es una solución rápida a la difuminación de las aplicaciones de la Plataforma universal de Windows (UWP) . El programa original se centra en las ventanas difusas que pertenecen a un determinado proceso, pero todas las aplicaciones UWP muestran su interfaz de usuario a través del mismo proceso (Fig. 2). Esto significa que el fuzzer no se puede dirigir a la ventana principal de la aplicación UWP.


Fig. 2. En la plataforma UWP, todas las aplicaciones pertenecen a un proceso ( ApplicationFrameHost.exe ). Para difuminar estas aplicaciones, tuve que cambiar el fuzzer NT original y dirigirlo a identificadores de ventana específicos

Hubo una falla grave en la modificación del fuzzer: los valores elegidos para las dos fuentes principales de entrada aleatoria, los argumentos lParam y wParam para SendMessage y PostMessage , están limitados a enteros de 16 bits. Ambos argumentos son de 32 bits en Windows de 32 bits y 64 bits en Windows de 64 bits. El problema ocurre en Fuzz.cpp , donde wParam lParam y wParam :

  wParam = (UINT) rand(); lParam = (LONG) rand(); 

La función rand () devuelve un número en el rango [0, 2 16 ], que limita en gran medida el conjunto de valores probados. Guardamos este error intencionalmente durante las pruebas para que los resultados coincidan con precisión con el trabajo original.

Aplicaciones probadas


En el informe original de NT, se probaron 33 programas. Solo tenemos 28, porque solo se usa una versión de cada programa para las pruebas. El ecosistema de software de Windows ha cambiado significativamente desde 2000, aunque sorprendentemente, muchas cosas permanecen sin cambios. El conjunto de aplicaciones de Microsoft Office contiene los mismos programas que en las pruebas originales. Netscape Communicator se ha convertido en Firefox. Adobe Acrobat ha cambiado su nombre a Adobe Reader, pero sigue siendo válido. Incluso Winamp lanzó un nuevo lanzamiento en 2018, que permite una comparación justa con el informe original. Sin embargo, algunos programas obsoletos tuvieron que ser reemplazados. Vea a continuación una lista de cambios y razones para ellos:

  • Reproductor de CD Player Windows Media Player: la funcionalidad del reproductor de CD se incluye en el nuevo programa.
  • Eudora ⇨ Windows Mail: Qualcomm ahora se ocupa de chips en lugar de clientes de correo electrónico. Como Eudora ya no existe, se ha probado el cliente de correo predeterminado de Windows.
  • Command AntiVirus ⇨ Avast Free Edition: Command AntiVirus ya no está disponible. Ha sido reemplazado por Avast como el antivirus de terceros más popular.
  • GSView ⇨ Fotos: GSView ya no es compatible. Fue reemplazado con el visor de fotos predeterminado de Windows.
  • JavaWorkshop Net NetBeans IDE: JavaWorkshop IDE ya no es compatible. NetBeans parece una buena alternativa gratuita que coincide con el espíritu de lo que debe verificarse.
  • CRT seguro ⇨ BitVise SSH: CRT seguro todavía existe, pero se requiere un formulario web muy largo para descargar la versión de prueba. BitVise SSH ofreció un arranque rápido.
  • Telnet ⇨ Putty: la aplicación telnet todavía existe en Windows, pero ahora es una aplicación de consola. Para difuminar la GUI, la reemplazamos con Putty, el popular emulador de terminal de código abierto para Windows.
  • Encontramos Freecell y Solitaire en la Colección de Solitarios de Microsoft del catálogo de aplicaciones de la Tienda de Aplicaciones de Windows.

La versión específica de la aplicación se muestra en la tabla de resultados. Todo el fuzzing se llevó a cabo en un sistema de 64 bits Windows 10 Pro versión 1809 (compilación 17763.253).

Resultados


Como se mencionó en el informe original, los resultados no deben verse como vulnerabilidades de seguridad, sino como un indicador de la confiabilidad y calidad del software.

"Finalmente, nuestros resultados forman un punto de partida cuantitativo desde el cual juzgar la mejora relativa en la confiabilidad del software".

- Del "Estudio empírico de la confiabilidad de aplicaciones de Windows NT mediante pruebas aleatorias" por Justin Forrester y Barton Miller

Los números no son particularmente alentadores, aunque la situación está mejorando. En el informe inicial de NT, todas las aplicaciones se bloquearon o se bloquearon en fuzzing. Ahora dos programas: la calculadora y Avast Antivirus, sobrevivieron a la eliminación gradual de los mensajes de la ventana sin consecuencias negativas. Elogiamos a los equipos de Avast y Windows Calculator por su enfoque a los mensajes de ventana erróneos. El equipo de Calculator se ha ganado un respeto adicional por abrir el código fuente y demostrar cómo crear una aplicación UWP de alta calidad. Consulte la tabla 1 para ver todos los resultados difusos, junto con la versión específica del software utilizado.

El programaVersiónSendmessageMensaje postal
Microsoft Access1901fallafalla
Adobe Reader DC2019.010.20098fallaok
Calculadora10.1812.10048.0okok
Windows Media Player12.0.17763.292fallafalla
Código de estudio visual1.30.2fallaok
Avast gratis19.2.2364okok
Correo de Windows16005.11231.20182.0fallafalla
Excel1901fallaok
Adobe framemaker15.0.2.503fallafalla
Freecell4.3.2112.0fallafalla
GhostScript9.26fallaok
Fotos2019.18114.17710.0fallafalla
GNU Emacs26,1fallafalla
IE Edge44.17763.1.0fallafalla
Netbeans10fallafalla
Firefox64.0.2fallafalla
Bloc de notas1809fallaok
Pintura1809fallafalla
Paint Shop Pro 201921,1fallafalla
Powerpoint1901fallaok
Bitvise ssh8.23fallafalla
Solitario4.3.2112.0fallafalla
Masilla0,70colgandocolgando
VS Community 201715.9.5fallafalla
WinAmp 5.85.8 Build 3660fallaok
Palabra1901fallaok
Wordpad1809fallafalla
WS_FTP12.7.0.1903fallafalla
Tabla 1. Resultados de reproducir el fuzzing original en Windows 10. Después de 19 años, casi todas las aplicaciones aún no manejan correctamente los mensajes de ventana distorsionados

Error de Windows?


Desafortunadamente, prevaleció la curiosidad y tuvimos que hacer una excepción. Parecía que varias aplicaciones no relacionadas se vieron afectadas por un problema común. La depuración mostró que el problema está relacionado con el mensaje WM_DEVICECHANGE . Cuando el fuzzer envió este mensaje, incluso la aplicación más simple cayó: HelloWorld, el ejemplo oficial de la API de Windows (Fig. 3).


Fig. 3. HelloWorld.exe de 32 bits se bloquea al recibir un mensaje de ventana de fuzzer. Esto no debería suceder, ya que el programa es completamente simple. Se entiende que el problema está en algún lugar de Windows

Después de la caída de HelloWorld, nos dimos cuenta de inmediato de que el problema afecta solo a las aplicaciones de 32 bits, pero no a las de 64 bits. Algunas depuraciones rápidas mostraron que el bloqueo se produce en wow64win.dll, una capa de compatibilidad de aplicaciones de 32 bits para 64 bits . Mi análisis superficial (y posiblemente incorrecto) del problema lleva a la conclusión de que la función wow64win.dll!whcbfnINDEVICECHANGE considera a wParam como un puntero a la estructura DEV_BROADCAST_HANDLE64 en el programa de destino. La función convierte esta estructura a la estructura DEV_BROADCAST_HANDLE32 para compatibilidad con aplicaciones de 32 bits. La falla ocurre porque el valor de wParam generado por el fuzzer indica memoria no válida.

Tratar a wParam como un puntero local es una mala idea, aunque probablemente fue una decisión de diseño deliberada para que las notificaciones de dispositivos extraíbles funcionen con aplicaciones heredadas de Windows de 32 bits. Pero todavía está mal que pueda bloquear otra aplicación sin ningún problema. Reportamos el problema a MSRC, aunque el límite de seguridad no se cruzó. Confirmaron que el error no era un problema de seguridad. Esperamos ver una solución para este extraño problema generalmente aceptado en una versión futura de Windows.

Conclusión


Los mensajes de Windows se subestiman y, a menudo, se ignoran como entradas poco confiables para los programas de Windows. Incluso 19 años después de que apareciera el primer difusor de mensajes de ventana de código abierto, el 93% de las aplicaciones probadas todavía se congelan o bloquean cuando se inicia el mismo programa. Pero es alentador que algunas aplicaciones hagan frente con gracia a esta entrada distorsionada: esto significa que algunas organizaciones tienen marcos y conocimiento institucional para evitar tales errores.

Por supuesto, el fuzzer se puede mejorar de muchas maneras, pero incluso el método más simple bloqueó el 93% de las aplicaciones. Quizás, en algunos casos, los mensajes de ventana incluso cruzan la frontera de seguridad real. Si explora esta área, esperamos que comparta los hallazgos.

Source: https://habr.com/ru/post/451816/


All Articles