Meltdown es una vulnerabilidad de fuga de canal lateral de hardware que se encuentra en varios microprocesadores, en particular los fabricados por Intel y la arquitectura ARM . Meltdown usa un error de implementación de ejecución de comando especulativoen algunos procesadores Intel y ARM (pero no en AMD [1] [2] ), lo que hace que el procesador ignore los permisos de página cuando ejecuta especulativamente instrucciones de lectura de memoria.
La vulnerabilidad permite que un atacante local (al iniciar un programa especial) obtenga acceso de lectura no autorizado a la memoria privilegiada ( memoria utilizada por el kernel del sistema operativo). [3] [4] [5] .
Al ataque se le asignó el ID de vulnerabilidad CVE CVE-2017-5754 [6] .
El ataque Meltdown fue descubierto de forma independiente por investigadores de Google Project Zero , Cyberus Technology y la Universidad Tecnológica de Graz a mediados de 2017 y ha estado bajo discusión cerrada y parcheado durante varios meses. La publicación de detalles y correcciones estaba programada para el 9 de enero de 2018, pero los detalles de la vulnerabilidad se hicieron públicos el 4 de enero de 2018 al mismo tiempo que el ataque de Spectre , debido a publicaciones de The Register [7] periodistas que se enteraron de las correcciones KAISER/KPTI de la lista de correo del kernel de Linux [8] .
La capacidad de ataque es generada por tres mecanismos que le permiten acelerar el procesador, y cada uno de estos mecanismos individualmente no crea una vulnerabilidad:
Los microprocesadores modernos de alto rendimiento tienen la capacidad de ejecutar código nuevo sin esperar a que se completen las acciones anteriores. Por ejemplo, si una instrucción de bifurcación está esperando recibir datos de la memoria principal para tomar una decisión, un procesador inactivo puede estar ocupado ejecutando una de las direcciones de bifurcación (y en algunas arquitecturas, incluso ambas bifurcaciones) con la esperanza de obtener el resultado de el cálculo listo para cuando se conoce el resultado de la bifurcación. Esta técnica se llama ejecución especulativa. Si la conjetura tiene éxito, el código ejecutado especulativamente cambia los valores visibles de los registros (estado arquitectónico) y la ejecución continúa. Si la rama de ejecución se asumió incorrectamente, las instrucciones que contiene no cambian el estado visible del procesador y la ejecución real volverá al punto de bifurcación.
Debido a las peculiaridades de algunas implementaciones, durante la ejecución especulativa, el acceso a la memoria se realiza independientemente de los derechos de acceso del proceso de ejecución a esta memoria; esto permite ejecutar comandos sin esperar una respuesta del controlador de memoria . Si esta rama de ejecución especulativa más tarde resulta ser correcta, se lanzará una excepción de acceso a memoria errónea. Si la rama se descarta como errónea, no se lanzará ninguna excepción; pero las variables cargadas en el caché durante la ejecución de la bifurcación permanecerán en el caché. Por ello, los autores del ataque propusieron un método de análisis de la presencia de datos en la caché (basado en el tiempo de acceso a los mismos), que, si el ataque está bien construido, puede dar una idea de lo ocurrido en los descartados. rama de ejecución especulativa y el contenido de la memoria más privilegiada.
El ataque se puede llevar a cabo aproximadamente de la siguiente manera. [9]
Para leer el bit 0 del área de memoria protegida A p , el atacante:
Durante la ejecución normal, el paso 4 provoca un error de seguridad, pero durante la ejecución especulativa en arquitecturas vulnerables, este error se ignora temporalmente y continúa con los pasos 5 y 6. Como resultado, uno de los valores se carga en el caché, desde el dirección A0 u o A1 u . Habiendo descubierto la condición de bifurcación, el procesador cancela todos los resultados de los pasos 4, 5 y 6, pero el estado del caché permanece sin cambios.
Después de eso, basta con que el atacante lea "sus" direcciones A0u y A1u , midiendo el tiempo de acceso a las mismas. Y en base a las medidas, determine qué bit (0 o 1) se leyó del área de memoria protegida A p .
Repitiendo este algoritmo para otros bits del valor V(A p ), puede obtener todo el contenido del área de memoria protegida como un todo.
Según los investigadores, "cualquier microprocesador Intel que implemente una ejecución fuera de orden es potencialmente susceptible de sufrir ataques, es decir, cualquier procesador desde 1995 (con la excepción de Intel Itanium e Intel Atom lanzados antes de 2013)". [diez]
Se espera que la vulnerabilidad afecte a los proveedores de nube más grandes del mundo , en particular, Amazon Web Services (AWS) [11] , Google Cloud Platform , Microsoft Azure . Los proveedores de la nube permiten que diferentes usuarios ejecuten sus aplicaciones en servidores físicos compartidos. Debido a que los programas pueden procesar datos confidenciales del usuario, las medidas de seguridad y aislamiento proporcionadas por el procesador se utilizan para evitar el acceso no autorizado a la memoria privilegiada (utilizada por el kernel del sistema operativo). El ataque Meltdown, cuando se usa en sistemas que no implementan protección de software (parches), le permite eludir algunas medidas de aislamiento de memoria y obtener acceso de lectura a la memoria del sistema operativo.
Uno de los autores de la publicación de vulnerabilidad indica que los sistemas de paravirtualización ( Xen ) y los sistemas de contenedores ( Docker , LXC , Openvz , etc.) también son susceptibles de ataque [12] . Los sistemas totalmente virtualizados permiten que las aplicaciones de los usuarios lean solo la memoria del kernel invitado, no la memoria del sistema host.
Existe una forma de software confiable para combatir el ataque, en la que la tabla de páginas de los procesos de usuario no muestra las páginas de memoria del kernel del sistema operativo (con la excepción de una pequeña cantidad de áreas de servicio de memoria del kernel), la tecnología de aislamiento de la tabla de páginas del kernel (KPTI) . Al mismo tiempo, las llamadas con un cambio en el nivel de privilegio (en particular, las llamadas al sistema) se ralentizan un poco, ya que tienen que cambiar adicionalmente a otra tabla de páginas que describe toda la memoria del kernel del sistema operativo.
En algunos casos, la solución puede reducir el rendimiento de ciertas funciones, como las aplicaciones que realizan llamadas al sistema con mucha frecuencia. Al mismo tiempo, las pruebas de Phoronix no muestran ralentizaciones en los juegos que se ejecutan en Linux con el parche KPTI [17] [18] .