C贸mo Windows 10 Explore la vulnerabilidad cr铆tica de DHCP detecta dos errores de seguridad m谩s



Imagen: Unsplash

Como se describi贸 en un art铆culo anterior sobre CVE-2019-0726 , a veces la b煤squeda de detalles sobre una vulnerabilidad ya conocida conduce al descubrimiento de una nueva vulnerabilidad. Y en algunos casos hay m谩s de una de esas nuevas vulnerabilidades.

En el art铆culo se consideraron dos funciones de la biblioteca dhcpcore.dll: el UpdateDomainSearchOption mencionado casualmente y el an谩lisis m谩s detallado del DecodeDomainSearchListData que llama. Como siempre sucede cuando se buscan vulnerabilidades, incluso si las conclusiones importantes al final se reducen a una o dos funciones, en el proceso de an谩lisis debe analizar una cantidad de c贸digo mucho mayor. Y a veces el ojo se aferra a cosas insignificantes que no est谩n relacionadas con la tarea actual, pero que pueden tener un significado independiente o ser 煤tiles m谩s adelante. Supongamos que en este momento no hay tiempo para prestarles atenci贸n, pero tales peque帽eces se posponen en la subcorteza y, si despu茅s de un cierto per铆odo de tiempo existe la oportunidad de volver a ellas y comprobar sus conjeturas, vuelven a aparecer en la conciencia.

Y as铆 sucedi贸 esta vez. Al estudiar la funci贸n DhcpExtractFullOptions, que es responsable de procesar todas las opciones especificadas en la respuesta DHCP del servidor, en particular, llamando a UpdateDomainSearchOption, dos conjuntos en la pila de 256 elementos cada uno llaman la atenci贸n de inmediato:



Al mismo tiempo, la presencia de cualquier verificaci贸n que restrinja los valores de los iteradores de estas matrices no es notable. Como en ese momento est谩bamos analizando otra vulnerabilidad, esta informaci贸n no era relevante. Por lo tanto, solo quedaba recordar este lugar en el c贸digo para volver a 茅l m谩s tarde.

An谩lisis


Pasan un par de semanas, y nuevamente recordamos la funci贸n DhcpExtractFullOptions que hab铆a llamado la atenci贸n anteriormente. Lo buscamos en el desensamblador, peinamos las piezas de c贸digo previamente enmarcadas de manera incompleta y tratamos de entender por qu茅 estamos usando dos matrices est谩ticas que nos intrigaron.

Al comienzo de la ejecuci贸n de la funci贸n, las matrices y sus iteradores se ponen a cero:



La funci贸n analiza todas las opciones del paquete recibido del servidor DHCP, recopila informaci贸n de ellas y luego la procesa. Adem谩s, de acuerdo con los resultados del an谩lisis, ella tambi茅n escribe el evento correspondiente al servicio ETW (Event Tracing for Windows). Es en el registro de eventos donde participan las memorias intermedias que nos interesan. Junto con muchos otros datos, se transfieren al procedimiento EtwEventWriteTransfer. El trabajo de preparar todos los datos para el registro es bastante voluminoso y no importa mucho la vulnerabilidad que estamos considerando, por lo que podemos prescindir de las ilustraciones.

Es m谩s importante determinar c贸mo se llenan estos b煤feres. El llenado se produce en el bucle de an谩lisis de opciones. Primero, se llama a una funci贸n con el nombre parseado ParseDhcpv4Option para la opci贸n actual recibida para el procesamiento, que llena los campos del objeto dhcp_pointers en funci贸n de los datos recibidos o toma nota de una opci贸n desconocida cuando encuentra un identificador de opci贸n con un valor para el que no hay un controlador.



Al regresar de ParseDhcpv4Option, el valor del identificador de la etiqueta de opci贸n actual se escribe en el siguiente elemento de la matriz all_tags, la primera de las matrices que nos interesan. Si la funci贸n se encontr贸 con una opci贸n desconocida y, en consecuencia, no estableci贸 el indicador is_known_option, entonces el valor del identificador tambi茅n se escribe en el siguiente elemento de la segunda matriz: unknown_tags. Naturalmente, los nombres significativos de las variables en este art铆culo ya se obtuvieron analizando el c贸digo.

Por lo tanto, la matriz all_tags almacena etiquetas de todas las opciones del mensaje recibido, y la matriz unknown_tags almacena etiquetas solo para opciones desconocidas para el analizador. Al mismo tiempo, la comprobaci贸n de los valores de los 铆ndices de estas matrices est谩 completamente ausente. En consecuencia, los valores de tales 铆ndices pueden exceder 256 y llevar a la escritura m谩s all谩 de los l铆mites asignados en la pila para las matrices de memoria. Para sobrellenar la primera matriz, es suficiente enviar un paquete con un n煤mero de opciones superior a 256 desde el servidor DHCP. Lo mismo es cierto para la segunda matriz, con la 煤nica diferencia de que las opciones que el cliente no puede procesar deben enviarse.

Operaci贸n


Intentemos ahora usar un ejemplo pr谩ctico para asegurarnos de que nuestras conclusiones sean correctas. Para empezar, prestamos atenci贸n al hecho de que las etiquetas de opciones ocupan un byte, mientras que los elementos de la matriz son de tipo int, es decir, son de cuatro bytes. Por lo tanto, tenemos un desbordamiento en el que controlamos cada cuarto byte, y el resto se restablece a cero cuando se sobrescribe.



Para probar nuestra suposici贸n, la forma m谩s f谩cil es sobrescribir la cookie de seguridad en la funci贸n en cuesti贸n, lo que generar谩 una excepci贸n relacionada con la verificaci贸n de seguridad. Simulemos una situaci贸n en la que el servidor DHCP env铆a una cantidad suficiente de opciones para reescribir. Deje que sean 0x1a0 (416) opciones con identificador 0xaa y tama帽o cero. Por lo tanto, cada opci贸n ocupa dos bytes, y el tama帽o total del paquete con todos los encabezados es de 1100-1200 bytes. Este valor est谩 dentro de la MTU para Ethernet, por lo tanto, hay razones para creer que el mensaje no se fragmentar谩, lo que nos permitir谩 evitar posibles efectos adversos.

Enviamos el paquete formado de la manera descrita en respuesta a una solicitud del cliente DHCP y detectamos la excepci贸n en el proceso svchost.exe correspondiente en la m谩quina cliente:



Como puede ver en el seguimiento de la pila, tanto la cookie de la pila como la direcci贸n de retorno de la funci贸n fueron reescritas por los identificadores de las opciones de nuestro paquete.

Por supuesto, crear un exploit funcional para este error requerir谩 mucho esfuerzo por parte del atacante. En los sistemas modernos, el desbordamiento del b煤fer en la pila es una vulnerabilidad bastante compleja y laboriosa debido a todos los mecanismos de defensa existentes. Por otro lado, uno no debe olvidar que todos estos mecanismos protegen contra la reescritura de la direcci贸n de retorno y los manejadores de excepciones, o proh铆ben la ejecuci贸n de c贸digo en regiones de memoria no destinadas a esto, o interfieren con la predicci贸n de direcciones. Por ejemplo, no pueden ayudar de ninguna manera a sobrescribir los almacenados en la pila entre el b煤fer desbordado y la direcci贸n de retorno de las variables locales. Y la funci贸n DhcpExtractFullOptions en cuesti贸n contiene varias variables potencialmente peligrosas en este intervalo.

Nuevamente, escribimos a Microsoft sobre el error detectado. Despu茅s de una breve correspondencia y un an谩lisis de la aplicaci贸n, que tard贸 aproximadamente una semana, obtenemos la respuesta de que se est谩 preparando un identificador CVE para la vulnerabilidad descrita, se planea lanzar una soluci贸n en marzo y alguien inform贸 anteriormente sobre la vulnerabilidad ya disponible en Microsoft. El hecho, en t茅rminos generales, no es sorprendente, porque el error yace literalmente en la superficie, y los buffers que no contienen verificaciones de l铆mites de 铆ndices siempre atraen la atenci贸n primero y a menudo pueden detectarse mediante herramientas de an谩lisis autom谩tico.

En marzo, como se anunci贸, se lanz贸 una actualizaci贸n para corregir el error descrito, que recibi贸 el identificador CVE-2019-0697 . El investigador previamente informado result贸 ser Mitch Adair, el mismo empleado de Microsoft que descubri贸 la vulnerabilidad DHCP CVE-2019-0547 corregida en enero.

Publicado por Mikhail Tsvetkov, Especialista en An谩lisis de Aplicaciones de Tecnolog铆as Positivas.

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


All Articles