SMBGhost – Análisis de CVE-2020-0796


La vulnerabilidad

La última vulnerabilidad en SMBv3 es una vulnerabilidad "wormable" dada su capacidad potencial para replicarse o extenderse a través de recursos compartidos de red utilizando la última versión del protocolo (SMB 3.1.1). Al escribir estas líneas, Microsoft acaba de lanzar un parche para CVE-2020-0796 en la mañana del 12 de marzoth. El error se introdujo muy recientemente en las rutinas de descompresión para cargas de datos SMBv3. El código que implementa esto se implementó en abril de 2019 para la versión 1903 y noviembre de 2019 para la versión 1909.

La vulnerabilidad se produce durante el procesamiento de un mensaje comprimido mal formado. El encabezado del mensaje sigue este formato: (desde (MS-SMB2))

  • Hay dos parámetros en el encabezado que son de interés: OriginalCompressedSegmentSize y Offset / Length
  • La función Srv2DecompressData (srv2.sys) asigna un búfer de tamaño OriginalCompressedSegmentSize + Offset / Length
  • Esto no verifica la firma de estos valores y, como se firma la adición, un atacante puede asignar un búfer más pequeño de lo previsto
  • Los datos se descomprimen en el búfer + desplazamiento, utilizando datos del paquete + 0x10 + desplazamiento
  • OriginalCompressedSegmentSize se usa como el parámetro UncompressedBufferSize pasado a SmbCompressionDecompression, que es un contenedor para RtlDecompressBufferEx2
  • Esta rutina supone que el tamaño del búfer sin comprimir es un largo sin signo, por lo que un valor negativo se convierte en un número grande sin signo
  • Debido a esto, la rutina de descompresión descomprime el búfer y puede ir mucho más allá del tamaño original, ya que se supone que tiene un búfer muy grande para trabajar

Aquí hay un desensamblaje anotado de la función relevante en el lado del servidor:

Esta falla puede afectar tanto al cliente como al servidor en las negociaciones SMB en un mensaje comprimido enviado después de las respuestas del protocolo de negociación. La vulnerabilidad del servidor está dentro de srv2.sys y la vulnerabilidad del cliente está dentro de mrxsmb.sys, que terminan llamando al mismo código en SmbCompressDecompress.

Aquí hay un desensamblaje anotado de la función relevante en el lado del cliente: a diferencia del lado del servidor, OriginalCompressedSegmentSize tiene límites verificados, pero no hay verificación en el desplazamiento / longitud antes de que se combinen y pasen a ExAllocatePoolWithtag. Hemos confirmado el bloqueo BSOD tanto de cliente-> servidor Y servidor-cliente usando esta vulnerabilidad.

Si una computadora permite el tráfico SMB3 entrante a través del puerto 445, de forma predeterminada se admite la compresión y el cliente y el servidor negociarán los "términos" de esta compresión y luego el cliente procederá a transferir una carga útil comprimida.

La falla está presente en el encabezado de transformación de compresión SMB, antes de cualquier tipo de autenticación.

Podemos ver el OriginalSize muy grande utilizado para los datos controlados por el atacante (4294967295 es 0xFFFFFFFF en hexadecimal, que también es -1 si se ve como un largo firmado). Esto se copia en un búfer fijo más pequeño y da como resultado un desbordamiento del búfer clásico. Cabe destacar el ProtocolID de xfcSMB, que debe estar presente y representa los bytes mágicos utilizados para indicar que el mensaje debe descomprimirse según Especificaciones.

Sin embargo, no es solo el lado del servidor el que es vulnerable a este ataque. Si un cliente se conecta a un servidor SMB malicioso, ambas partes ejecutan el mismo código vulnerable y un servidor malicioso puede responder a las solicitudes de los clientes de la misma manera para desencadenar el desbordamiento en el lado del iniciador / cliente. En este escenario, se hace referencia al comando de Windows Powershell aquí será no sea ​​efectivo para detener este ataque contra el cliente SMB. Solo será útil cuando se implemente en la autenticación previa del lado del servidor / destinatario SMB.

Exposición

Como siempre, este tipo de parche debe aplicarse lo antes posible, sujeto a la política de la organización. Si bien actualmente no hay exploits conocidos en la naturaleza, como verá, causar un BSOD (pantalla azul de la muerte), es bastante trivial y sigue siendo un método de ataque altamente efectivo para la interrupción si un atacante puede obtener acceso a una red interna.

Más peligroso aún son los sistemas que exponen el puerto 445 a Internet, ya que hemos visto el daño posible a través de errores similares como WannaCry. Al momento de escribir este artículo y justo antes de que Microsoft lanzara su parche, Shodan.io parece tener poco más de 35,000 computadoras con Windows que informan sobre las versiones vulnerables del software según lo buscado por: puerto: 445 os: "Windows" + os: "18362 " por ejemplo. Es probable que muchos de estos se reparen rápidamente ahora que se solucionó el problema.

Análisis de parche

Mirando la versión parcheada, podemos ver que el código ahora está usando RtlULongAdd para agregar OriginalCompressedSegmentSize y el valor Offset / Length. También parece haber una prueba adicional para asegurarse de que el tamaño no sea mayor que el paquete completo más 0x134.

Mirando un poco más allá, también podemos ver el uso de RtULongSub para calcular el tamaño del búfer comprimido mientras se tiene en cuenta el campo de compensación.

Finalmente, también podemos notar el uso de WPP código de seguimiento en caso de que ocurra un error (el seguimiento ya estaba ocurriendo en todo el controlador, pero esta función específica no estaba previamente instrumentada de esa manera).

Impacto – BSOD vs. RCE

Obtener una pantalla azul de la muerte o BSOD es un ejercicio sencillo. Pasar de eso a la ejecución completa de código remoto probablemente será más desafiante, ya que probablemente se requerirán errores adicionales para evitar las últimas técnicas de mitigación de Windows, como Kernel ASLR o KASLR. Para este error, el atacante tendrá primitivas fáciles para la asignación de datos y puede controlar el tamaño de los datos utilizados para desencadenar el desbordamiento. Por otro lado, los objetos asignados en la memoria para almacenar la entrada del atacante se liberan con relativa rapidez, lo que dificulta la explotación.

Detección / mitigación de productos

McAfee ha lanzado NSP ID 0x43c0e600 – NETBIOS-SS: Vulnerabilidad de ejecución remota de código de Samba (CVE-2020-0796) para abordar la explotación de la vulnerabilidad. Estamos trabajando en el desarrollo de firmas adicionales para complementar o reemplazar esta cobertura.





Enlace a la noticia original