Si ha habido algo que ha marcado el inicio del 2018 casi a fuego dentro del mundillo tecnológico y hasta fuera de él eso ha sido la revelación de las vulnerabilidades conocidas como Meltdown y Spectre.

Seguro que has oído todo tipo comentarios al respecto junto a las justificadas voces de alarma, pero es posible que todavía no sepas en qué consistían concretamente ambos ataques. A continuación, vamos a tratar de explicarlo de la mano de Jon Masters, arquitecto principal ARM en Red Hat, la conocida multinacional de código abierto.

Según explicó Masters en un comunicado difundido por Red Hat, formó parte de la dirección de los esfuerzos de la compañía a la hora de mitigar las vulnerabilidades. Durante ese proceso, reprodujeron Meltdown en sus laboratorios y estudiaron las otras variantes de este ataque.

Antes de entrar en las explicaciones, que hemos simplificado como se ha podido, cabe señalar que, en caso de que quieras profundizar en los detalles técnicos, puedes hacerlo entrando en el sitio en el que se han publicado los trabajos de investigación originales y otras publicaciones relacionadas.

Te presentamos a la ejecución especulativa

ejecucion-especulativa

Al hablar de Meltdown y Spectre, siempre ha hecho aparición un término que a muchos seguro que les sonaba a chino: «ejecución especulativa». La «ejecución especulativa» era de lo que se aprovechaban estos ataques. Pero ¿en qué consiste exactamente? Dejamos ahora la palabra a Masters, que explicó muy bien el concepto haciendo uso de una analogía que seguro que todos hemos vivido:

«Supongamos que un cliente habitual todos los días visita la misma cafetería y pide la misma bebida con cafeína. Con el paso del tiempo, el cliente empieza a conocer a los camareros, que a su vez se familiarizan con el pedido de este cliente. Para brindarle una buena atención (y ahorrarle al preciado cliente el tiempo de espera en la fila), los camareros finalmente deciden empezar a preparar el pedido del cliente apenas éste los saluda al ingresar al local. Pero un día, el cliente modifica su pedido. En ese caso, el camarero debe descartar el café preparado con anticipación y preparar uno nuevo mientras el cliente espera.

»Si avanzamos aún más en esta analogía, supongamos que los camareros conocen el nombre del cliente y les gusta escribirlo con un marcador indeleble en su taza. Cuando de manera especulativa preparan la bebida habitual, escriben el nombre del cliente en la taza. Si el cliente viene con un pedido diferente, la taza en cuestión se descarta junto con su contenido. Pero al hacerlo, la información personal identificable que figuraba en la taza queda visible por un breve instante para cualquier observador.

»Este escenario de la cafetería implica especulación. El personal no sabe a ciencia cierta si cuando el cliente ingrese al local pedirá un café con leche o un americano, pero por la información histórica sabe lo que el cliente habitualmente pide y hace una deducción fundada para ahorrarle tiempo de espera. Este tipo de especulación ocurre a diario en nuestras vidas porque con frecuencia esas deducciones demuestran ser acertadas y, como resultado, podemos lograr hacer más en la misma cantidad de tiempo. Lo mismo sucede con nuestras computadoras. Éstas utilizan una técnica conocida como «ejecución especulativa» para realizar determinadas operaciones de procesamiento antes de que se sepa con certeza que se requerirán tales operaciones, sobre la premisa de que estas deducciones a menudo terminan ahorrando tiempo.

La optimización es buena, pero sin pasarse y con cuidado

optimizar

En el caso de las computadoras, lo que hacen estas es lo mismo que hacen los camareros del ejemplo: tratar de adivinar qué es lo que se va a hacer a continuación tomando como base comportamientos anteriores. Así, el equipo «piensa» que si se hace A, después se hará B, pero si no es así, se hará C. Por lo tanto, cada vez que se da A, se preparan los datos para hacer B. Si no se hace B, los datos se descartan.

Para estas predicciones, se emplean algoritmos muy sofisticados y, con frecuencia, aciertan en 99% de sus deducciones. Las ejecución especulativa es una optimización de los procesadores que, como dice Masters, ha «ayudado a a acelerar drásticamente las computadoras durante las últimas dos décadas. Cuando se la implementa en la forma correcta, la ventaja resultante en el rendimiento es significativa».

Ahora bien, el problema del que han surgido Meltdown y Spectre fue que se intentó optimizar aún más los procesadores asumiendo que el proceso de especulación era «una caja negra totalmente invisible para los observadores externos (o delincuentes)».

Volviendo a la analogía anterior, fue como pensar que el camarero, al verte llegar, empieza a preparar tu café y a ponerle tu nombre en la taza dentro de la cocina para que nadie viese como lo hacía. Pero sin tener en cuenta una cosa: que había una ventana en la cocina desde la cualquiera que se asomase podía ver el proceso.

Así funciona Meltdown

meltdown-funcionamiento

En un intento de simplificar la explicación de Masters, vamos a continuar con la misma analogía. En una computadora, el proceso de preparar tu café y ponerle tu nombre antes de que lo pidas se conoce como «ventana de ejecución especulativa». El procesador veía que se hacía A (tú, entrando a la cafetería) y preparaba B (el café con tu nombre en la taza). Si se confirmaba B, se usaban los datos (se te entrega el café). Si no se confirmaba (tú pides otra cosa), se descartaban los datos (se tiraba el café sin que tú supieses que ya estaba preparado).

Pero resulta que hay formas de que alguien vea como se prepara tu café y se le pone tu nombre; o sea, ver lo que sucede dentro de la ventana de ejecución especulativa. Y por tanto, el sistema se puede manipular.

Meltdown fue el ataque que tuvo más repercusión debido a su amplio impacto. Básicamente, el ataque consistía en hacerle creer al camarero que tú estabas entrando a la cafetería para que así se pusiese a prepararte el café, todo con el objetivo de ver como lo preparaba.

Si tienes un perfil más o menos técnico, la explicación de Masters a lo mejor te resulta más esclarecedora: «En Meltdown, una bifurcación de código cuidadosamente elaborada primero se dispone a ejecutar cierto código de ataque de manera especulativa. Este código carga algunos datos protegidos a los cuales el programa normalmente no tiene acceso. Como esto sucede en forma especulativa, la verificación de permisos respecto de ese acceso ocurrirá en paralelo (y no fracasará hasta la finalización de la ventana de especulación) y, como consecuencia, cierta memoria interna especial del chip conocida como memoria caché quedará cargada con información privilegiada. Luego, se utiliza una secuencia de código meticulosamente construida para realizar otras operaciones de memoria en función del valor de la información privilegiada. En tanto los resultados normalmente observables de estas operaciones no son visibles luego de la especulación (la cual se descarta en última instancia), se puede utilizar una técnica conocida como análisis de canal lateral de la caché para determinar el valor de los datos protegidos».

Así funciona Spectre

spectre-funcionamiento

Explicar Spectre con la misma analogía es un poco más complicado ya que el ataque consta de dos partes. Intentémoslo con la primera parte. En ella, el camarero ve a alguien que parece que eres tú y empieza a preparar el café. Pero antes de confirmarlo, coge uno de los ingredientes secretos de tu café favorito para añadirlo. El atacante lo ve y así sabe cuál es el ingrediente.

Masters lo explica así: «Una vez más, cuando se ejecute código de manera especulativa, el chip podría cargar ciertos datos que luego se utilizarían para ubicar un segundo grupo de datos. Como parte de una optimización del rendimiento, el chip podría intentar cargar de modo especulativo el segundo grupo de datos antes de haber validado que el primero se encuentre dentro de un rango definido de valores. Si esto sucediera, es posible hacer que el código ejecute de forma especulativa y lea datos que no debería en la memoria caché del sistema, desde la cual pueden ser extraídos utilizando un ataque de canal lateral similar al analizado anteriormente».

Sí, ya vemos que aquí la analogía flojea, pero por ahí va más o menos. Para la segunda parte flojea todavía más, pero vamos a intentarlo antes de dar paso a la explicación de Masters. Básicamente, se trataría de que el atacante se dedicaría a convencer al camarero de que preparase tu café con los ingredientes que él quisiera. Esto implicaría, en la vida real, conocer al camarero, ser muy convincente (quizá con dinero), etc. Pero en informática, la cosa va por otro lado.

Así es como lo explica Masters: «Tiene que ver con “entrenar” al hardware predictor de bifurcaciones para que favorezca de manera especulativa la ejecución de partes del código distintas a las que debería estar ejecutando. Una optimización de hardware común consiste en basar el comportamiento de una opción de bifurcación en la ubicación en memoria del mismo código de bifurcación. Desafortunadamente, la forma en que se almacena esta ubicación en memoria no es específica entre una aplicación y el kérnel del sistema operativo. Esto permite que el predictor sea entrenado para que ejecute de manera especulativa cualquier código que desee el atacante. Mediante la selección cuidadosa de un “gadget” (código existente en el kérnel que tiene acceso a información privilegiada), el atacante puede cargar información confidencial en la memoria caché del chip, donde el mismo tipo de ataque de canal lateral servirá una vez más para extraerla».

Mitigación y consecuencias

mitigacion

En este punto, la analogía se agota del todo, pero en realidad ya no necesitamos tanto de ella. Impedir que estos ataques funcionen ha implicado realizar modificaciones en los sistemas operativos que, se ha dicho, podrían «enlentecer» las computadoras. En la práctica es así, pero en realidad lo que ocurre es que no se aprovecha la mayor optimización de los procesadores, que es la causa de las vulnerabilidades.

Los parches que se han sacado o implementado en los distintos sistemas operativos parece que han hecho un buen trabajo. Sí se han notificado descensos en el rendimiento, pero más que nada en las tareas más demandantes. En los equipos destinados a un uso convencional (ya se sabe: ofimática, navegación por Internet, algo de edición gráfica no muy avanzada y ese tipo de cosas), el impacto ha sido inapreciable.

En general, la industria reaccionó bastante rápido en cuanto se dio a conocer la existencia de las vulnerabilidades. Además, su descubrimiento, como dice Masters, hará que «Con el paso del tiempo, se podrán descubrir otras vulnerabilidades relacionadas y se podrán publicar en Internet códigos de ejemplo para sacar provecho de ellas, debido a lo cual es fundamental mantenerse al día con los parches de seguridad a medida que estén disponibles».

Como vemos, esto no quiere decir que se ha dicho todo respecto a Meltdown y Spectre. Pero es que, también como dice Masters, «Es importante recordar que recién estamos en la etapa inicial posterior al descubrimiento de una clase totalmente nueva de vulnerabilidades de seguridad informática y, como resultado, las mitigaciones y el asesoramiento sobre las buenas prácticas relacionadas podrán variar con el transcurso del tiempo».