
Meltdown y Spectre dejan al descubierto un problema de seguridad en nuestras CPUs
By Sergio Rojas, Post
Todos sabemos que, cuando la complejidad de un sistema aumenta persiguiendo incrementar sus capacidades, con esto suele aumentar el flanco de ataque y las vulnerabilidades potenciales asociadas.
Los procesadores que dan vida a nuestros sistemas informáticos no son excepción y el aumento de la complejidad en su estructura hace que sea cada vez más y más difícil cerrar todas las posibles puertas, no solo a atacantes malintencionados, si no a errores imprevistos. La cuestión se agrava cuando las nuevas arquitecturas e innovaciones se van montando sobre diseños y paradigmas bien asentados que, a menudo, no se han replanteado junto con el avance de las tecnologías subyacentes.
Así actúan los ataques Meltdown y Spectre

La figura muestra la microarquitectura de un núcleo Skylake de Intel. Con el fin de mejorar la velocidad se hace una predicción de qué instrucciones y datos serán utilizados a continuación, almacenando cada una en su caché correspondiente. Tanto AMD, como ARM como la mayoría de fabricantes de arquitecturas existentes, utilizan una técnica similar, conocida como Ejecución especulativa.
Tanto Meltdown como Spectre son técnicas que aprovechan puertas traseras en este sistema de predicción. Con la optimización de rendimiento en mente, no se ha implementado ningún sistema de seguridad que impida que un proceso acceda vía la caché de un núcleo a los datos en memoria de otro proceso, ignorando las restricciones implementadas a nivel de sistema operativo.
El ataque Meltdown consiste forzar cortes en el flujo de instrucciones (out-of-order exceptions) para que se refresquen las cachés de instrucciones y de datos internas de cada núcleo del procesador. Como resultado, se copian trozos de memoria de otros procesos o usuarios, que están disponibles de forma abierta e insegura para el proceso atacante. El parche defensivo, denominado “KAISER” o KPTI, (que ya estaba desarrollado para un fallo anterior) tiene como efecto colateral que evita el ataque Meltdown. Por ello este parche se ha desarrollado muy rápido y muchas empresas informáticas de servicios en la nube ya lo han instalado. Microsoft también lo ha incluido entre sus parches de seguridad para su despliegue mediante Windows Update. En Linux y otros sistemas operativos se han aplicado soluciones similares.
El ataque Spectre (hay dos variantes llamadas 1 y 2) también utiliza un fallo en la microarquitectura de ejecución especulativa del procesador. Se aprovecha un fallo que no debería ocurrir nunca en un programa correcto, pero que solo se puede evitar si se rediseña el sistema de ejecución especulativa en la propia microarquitectura del procesador, algo que puede costar años, y la posterior sustitución de todos los microprocesadores del mercado, algo inviable. Por desgracia, el parche defensivo KPTI no funciona en este caso, y no parece fácil desarrollar una solución software que puntee al procesador usando ideas similares.
En Spectre, el ataque consiste en “engañar” a la víctima (p.ej. el kernel) para que ejecute una predicción (concretamente, una predicción de rama) falsa que mueve información sensible a una posición de memoria controlada por el atacante. En la ejecución real, la víctima no realiza realmente ese movimiento, pero la predicción ha dejado un rastro que el atacante puede emplear para determinar el valor de dicha información sensible. En primera instancia, Spectre podría parecer más grave, ya que no se puede evitar con KPTI (KAISER) y afecta a todas las arquitecturas probadas (Intel, AMD y ARM), pero lo cierto es que es bastante difícil de explotar en un escenario real, al menos, a priori. Spectre requiere que exista código en la víctima susceptible de ser explotado de esta manera, y aunque es probable que así sea, se podría ir parcheando individualmente. Tampoco es extraño que en breve aparecieran técnicas en los compiladores que evitaran generar código susceptible de ser explotado mediante Spectre.
Por su parte, Meltdown utiliza una técnica similar, pero abusando de otro tipo de predicción (ejecución fuera de orden), y aprovechándose de un bug específico de ciertos procesadores Intel. En las CPUs modernas de Intel, el “motor” que ejecuta las predicciones no tiene en cuenta los permisos de acceso a las páginas de memoria, por lo que puede acceder a cualquier región mapeada en el espacio del proceso. Es habitual tener mapeado el kernel en el espacio de todos los procesos, por cuestión de simplicidad y eficiencia. Además, es habitual que el propio mapa del kernel contenga toda o parte de la memoria física, lo cual habilita al atacante a volcar virtualmente cualquier región de la RAM. Al igual que pasaba con Spectre, el resultado de la predicción (en este caso, una lectura de una dirección de memoria virtual de una víctima, como el kernel) se descarta, pero deja un rastro observable por el atacante, que puede utilizar para obtener la información sensible. Para agravar aún más el problema, las extensiones TSX de Intel, introducidas en Haswell, hacen el ataque más eficiente, evitando generar una excepción en cada iteración.
Meltdown sí que es un problema muy grave, sobre todo para proveedores de máquinas virtuales y demás servicios en la nube. No es de extrañar que los de Amazon y Microsoft, entre otros, se hayan puesto muy nerviosos. Para tener una idea de la magnitud, desde una máquina virtual cualquiera, sería posible volcar la memoria completa de un Host, incluida la correspondiente al resto de máquinas virtuales de otros clientes.
En resumen, no consiste en difundir pánico, todos debemos asumir que nada es 100% seguro en informática. Ni nuestro teléfono móvil, ni nuestra tableta, ni nuestro ordenador de sobremesa. Siempre que sea posible hay que instalar parches de seguridad de forma continua. Muchos informáticos trabajan en seguridad y debemos confiar en que los fabricantes mantendrán los sistemas en un estado “razonablemente” seguro. Concretamente, con KPTI se ha reportado un decremento en el rendimiento de las CPUS de hasta un 30% más lento. En la práctica es como usar un equipo un par de años más viejo.
En el caso de servidores de datos puede que, si no se va a ejecutar software de fuentes inseguras, habilitar KPTI en PCs sea un poco excesivo, teniendo en cuenta el impacto que tiene en el rendimiento. Al menos, debería ser algo opcional.
Referencias:
https://spectreattack.com/spectre.pdf
https://meltdownattack.com/meltdown.pdf
https://googleprojectzero.blogspot.com.es/2018/01/reading-privileged-memory-with-side.html
https://krebsonsecurity.com/2018/01/scary-chip-flaws-raise-spectre-of-meltdown/