En informática, un ataque Shatter es una técnica de programación empleada por piratas informáticos en los sistemas operativos Microsoft Windows para eludir las restricciones de seguridad entre procesos de una sesión . Un ataque Shatter aprovecha un fallo de diseño en el sistema de paso de mensajes de Windows por el cual se podría inyectar código arbitrario en cualquier otra aplicación o servicio que se esté ejecutando en la misma sesión y que haga uso de un bucle de mensajes . Esto podría dar lugar a una explotación de escalada de privilegios . [1]
Los ataques Shatter se convirtieron en un tema de intensa conversación en la comunidad de seguridad en agosto de 2002 después de la publicación del artículo de Chris Paget "Exploiting design flaws in the Win32 API for privilege escalation" (Cómo aprovechar los fallos de diseño de la API de Win32 para la escalada de privilegios). [2] El artículo, que acuñó el término "ataque Shatter", explicaba el proceso por el cual una aplicación podía ejecutar código arbitrario en otra aplicación. Esto podía ocurrir porque Windows permite que las aplicaciones sin privilegios envíen mensajes a bucles de mensajes de aplicaciones con mayores privilegios, y algunos mensajes pueden tener como parámetro la dirección de una función de devolución de llamada en el espacio de direcciones de la aplicación. Si un atacante logra poner su propia cadena en la memoria de la aplicación con mayores privilegios (por ejemplo, pegando el código shell en un cuadro de edición) en una ubicación conocida, podría enviar mensajes WM_TIMER con parámetros de función de devolución de llamada configurados para apuntar a la cadena del atacante.
Unas semanas después de la publicación de este artículo, Microsoft respondió señalando que: "El artículo tiene razón en que esta situación existe y describe correctamente sus efectos... El error del artículo es que afirma que se trata de un fallo de Windows. En realidad, el fallo se encuentra en el servicio específico, altamente privilegiado. Por diseño, todos los servicios dentro del escritorio interactivo son pares y pueden realizar solicitudes entre sí. Como resultado, todos los servicios en el escritorio interactivo tienen efectivamente privilegios proporcionales a los del servicio más privilegiado". [3]
En diciembre de 2002, Microsoft publicó un parche para Windows NT 4.0 , Windows 2000 y Windows XP que cerró algunas vías de explotación. [4] Sin embargo, esta fue solo una solución parcial, ya que la corrección se limitó a los servicios incluidos con Windows que podrían explotarse utilizando esta técnica; el defecto de diseño subyacente todavía existía y aún podía usarse para atacar otras aplicaciones o servicios de terceros. [5] Con Windows Vista , Microsoft apuntó a resolver el problema de dos maneras: primero, los usuarios locales ya no inician sesión en la Sesión 0, separando así el bucle de mensajes de la sesión de un usuario conectado de los servicios del sistema con altos privilegios, que se cargan en la Sesión 0. En segundo lugar, se introdujo una nueva característica llamada Aislamiento de privilegios de interfaz de usuario (UIPI), mediante la cual los procesos pueden protegerse aún más contra ataques shatter asignando un Nivel de integridad a cada proceso. [6] Los intentos de enviar mensajes a un proceso con un Nivel de integridad más alto fallarán, incluso si ambos procesos son propiedad del mismo usuario. Sin embargo, UIPI no evita todas las interacciones entre procesos en diferentes niveles de integridad. [6] Internet Explorer 7 , por ejemplo, utiliza la función UIPI para limitar el grado en que sus componentes de representación interactúan con el resto del sistema.
La forma en que se crean las sesiones fue rediseñada en Windows Vista y Windows Server 2008 para brindar protección adicional contra ataques de tipo Shatter. Los inicios de sesión de los usuarios locales se trasladaron de la Sesión 0 a la Sesión 1, separando así los procesos del usuario de los servicios del sistema que podrían ser vulnerables. [7] [8]
Sin embargo, esto genera problemas de compatibilidad con versiones anteriores , ya que algunos programas se diseñaron con la suposición de que el servicio se ejecuta en la misma sesión que el usuario conectado. Para respaldar esta visión, Windows Vista y Windows Server 2008 introdujeron un servicio de Windows llamado " Detección de servicios interactivos " que permite el acceso a los cuadros de diálogo creados por los servicios interactivos cuando aparecen. Al usuario interactivo se le muestra un cuadro de diálogo y se le ofrece la posibilidad de cambiar a la Sesión 0 para acceder al cuadro de diálogo. [ 9] Esta capacidad se eliminó en la Actualización de creadores de Windows 10. [10]