Meltdown y Spectre 1

metadatos

Desde mediados del año pasado, cuando el famoso ataque ransomware WannaCry paralizó medio mundo, todo el planeta vive pendiente del descubrimiento del siguiente cyberataque. Constantemente encontramos en las noticias información de nuevos ataques, vulnerabilidades, respuestas de las compañías, problemas con los parches de seguridad, etc. Estos días les ha tocado el turno a las vulnerabilidades bautizadas como Meltdown y Spectre.

Para mi este caso es diferente. Estas vulnerabilidades no son debidas a fallos en los sistemas operativos, sino que se encuentran en el software del núcleo de los chips. Un software al que los usuarios no tenemos acceso, supuestamente invulnerable, y que contiene la información más esencial.

El problema se encuentra en el diseño de la arquitectura del software de los procesadores. Este se encuentra dentro del núcleo de la CPU (Unidad Central de Proceso), en lo que se denomina el kernel. En el se encuentran los datos más sensibles del ordenador como contraseñas, direcciones de red, etc. El kernel se encuentra separado del resto de procesos y programas y debería de ser inaccesible para los usuarios. Pero Meltdown ha demostrado lo contrario.

Pero para entender como se ha podido acceder a este tipo de información debemos conocer un poco de la estructura y el procesamiento de una CPU a bajo nivel. Las computadoras trabajan en en un lenguaje, lenguaje máquina, que en realidad son un conjunto de instrucciones simples. Sumas, restas, desplazamientos de memoria, lectura y escritura, etc. Estas lista de instrucciones son el resultado de descomponer las ordenes de los usuarios, desde el interface, pasando por le lenguaje de programación (C, C++, Java, etc.) y por el de ensamblador. Cada orden o instrucción se coloca en una fila en orden de ejecución que llamamos pila. Esta es procesada por la CPU en lo que denominamos el pipeline de procesos.

Estructura de procesamiento de datos de un chip. (Ref. Apuntes)

Este pipeline es procesado por los microchip que contienen bancos de memoria, registros, puertas lógicas y una ALU (Unidad Aritmético Lógica). La estructura de procesamiento suele ser la que vemos en la imagen. En ella podemos seguir el recorrido de la instrucciones por la unidad de procesamiento. Pero tal como se ve, solo hay un camino, por lo que las instrucciones han de ser procesadas una a una. Y eso requiere mucho tiempo.

Para optimizar el proceso recurrimos a la segmentación. Dividimos el ciclo de procesamiento en cinco partes de forma que escalonamos los procesos. Cuando una instrucción se encuentra en un escalón y pasa al siguiente, otra instrucción puede ocupar el escalón vació. Hay que tener cuidado porque no todas las instrucciones pueden descomponerse por igual. Y hay que contar con la posibilidad de que una instrucción necesite un registro que se modifica al final de la instrucción anterior. En ese caso hay que esperar a que termine para no cometer errores. Todo este tipo de inconvenientes son tratados por técnicas de optimización como el control de datos, el forwarding, etc.

Esquema de la segmentación del pipeline de procesamiento de instrucciones. (Ref. Apuntes)

Una de esas técnicas de optimización es la ejecución especulativa. Con esta técnica, el procesador hace un análisis de la pila de instrucciones e introduce operaciones intentando predecir un posible uso de los resultados obtenidos en los ciclos en los que no puede realizar operaciones por la estructura de la cola. Por ejemplo, nos encontramos realizando operaciones con un registro, s1, y cargamos otro, s2. El proceso de carga tarda en realizarse más de un ciclo (latencia). Si la instrucción siguiente necesita s2, no puede ejecutarse hasta que no termine la carga y se perderían ciclos de procesado. Con la especulación predictiva, el procesador puede usar esos ciclos para por ejemplo realizar la suma de s1 consigo mismo por si se utiliza en un futuro próximo.

Esta optimización reduce considerablemente los ciclos de un proceso y por esa razón está ampliamente implantada en los chips de precesamiento de todas las marcas desde hace más de diez años.

La vulnerabilidad encontrada y bautizada como Meltdown explota esas instrucciones predichas. Los sistemas operativos hacen distinción entre el software del dispositivo y el software del kernel, pero el software predictivo no. Si recogemos la información contenida en esas instrucciones podemos conseguir acceso a la información del kernel. Algo parecido para con Spectre, aunque este está más enfocado a las secciones restringidas de los programas, donde se guardan las certificaciones de seguridad.

Por lo tanto, mediante estas vulnerabilidades podemos llegar a conseguir todos los datos sensibles sin dejar ningún tipo de rastro.

Las empresas de software anunciaron el lanzamiento de parches de seguridad en sus actualizaciones de sistema para solucionar Meltdown y Spectre. Estos parches consisten en separar los procesos de sistema de los procesos de kernel. La contrapartida de estos parches a priori es la ralentización de los procesos entre un 10% y un 30%. Pero en la practica, los parches están generando una gran cantidad de reinicios y bloqueos de sistemas.

Por otro lado las consecuencias de estas vulnerabilidades para las compañías que producen los chips, en especial para INTEL pueden ser desastrosas pues la producción de la nueva generación de chips está en marcha (Coffee Lake), y todos tendrán el mismo problema de vulnerabilidad/rendimiento. Incluso parece ser que la marca conocía el problema o parte de él desde junio y no se habían realizado cambios para su solución.

Por lo que parece que tanto Meltdown como Spectre y sus parches y soluciones hardware van a dar mucho que hablar estos días.

Para leer más:

Referencias:

  • Apuntes de la asignatura Arquitectura de Computadores de Ingeniería Electrónica. UCM. Prof. F. Tirado e I. Hidalgo.

Deja un comentario

Una idea sobre “Meltdown y Spectre