Como ya hemos indicado al principio, Meltdown y Spectre son fallos de seguridad diferentes descubiertos por equipos diferentes, aunque hay una empresa que ha tomado parte en ambos. El primero fue descubierto por investigadores de la Universidad Técnica de Graz, en Austria; la firma de seguridad alemana Cerberus Security; y Project Zero de Google. El segundo fue descubierto independientemente por Project Zero y el investigador en seguridad independiente Paul Kocher.

Ambos fallos se aprovechan del hecho de que los procesadores modernos ejecutan instrucciones de forma especulativa, por lo que ejecutan las instrucciones correspondientes en caso de que se de una condición verdadera y las descarta en caso de ser falsa. Como ya comentamos anteriormente, el predictor de saltos tiene una tabla llamada buffer de salto objetivo (branch target buffer) que se encarga de almacenar ciertas localizaciones como direcciones de salto, por lo que incluso las ubicaciones de memoria descartadas quedan almacenadas en una caché.

Ahora vamos a describir cada uno de los dos fallos encontrados en los procesadores modernos.

Meltdown

Meltdown ha sido el fallo que ha impulsado la actualización de todos los sistemas operativos y se apoya en la ejecución especulativa para filtrar datos desde el kernel a los programa que suelen usar los usuarios. Abarca una vulnerabilidad, cuyo código es CVE-2017-5754.

Los procesadores Intel, AMD y ARM llevan a cabo operaciones especulativas sobre los accesos a la memoria, sin embargo, los de la primera compañía realizan esto de forma especialmente agresiva. La memoria de los sistemas operativos tienen unos metadatos asociados que determinan si se puede acceder desde los programas del usuario o si bien dicho acceso está restringido solo al kernel.

Los procesadores de Intel permiten a los programas de los usuarios utilizar de forma especulativa datos del kernel, haciendo que la comprobación de acceso por parte del programa del usuario ocurra un tiempo después de que la instrucción haya iniciado su ejecución. Es posible bloquear la ejecución especulativa correctamente, pero su impacto en la caché del procesador puede ser medido, abriendo la puerta a deducir los valores almacenados en la memoria del kernel.

Los investigadores no han sido capaces de llevar cabo el mismo tipo de ejecución especulativa sobre la memoria del kernel en AMD y ARM, aunque no descartan que se pueda realizar de alguna forma. AMD ha repetido en varias ocasiones que sus procesadores no especulan con las direcciones de la memoria del kernel de la misma manera que permite la explotación Meltdown, mientras que ARM ha reconocido que algunos modelos son vulnerables y ya ha publicado un parche para el kernel Linux con el fin de corregir el problema.

En el caso de Intel el asunto es más grave, debido a que cualquier memoria del kernel puede ser leída por los programas del usuario. Para corregir el problema, que lleva presente desde 1995, se ha tenido que eliminar el mapeo del kernel compartido, lo que ha provocado la separación total de la memoria del kernel y las aplicaciones ejecutadas por el usuario, además de la posible merma en el rendimiento del sistema operativo, ya que ahora cada cambio que se haga en la memoria del kernel va a requerir que sus páginas sean recargadas.

Intel ya dijo que la merma en el rendimiento dependería de la carga de trabajo, y eso es porque depende del nivel de interacción que tenga la aplicación con el sistema operativo. Por ejemplo, aplicaciones pesadas como juegos last gen no suelen interaccionar mucho con el sistema operativo, por lo que su rendimiento no tendría que verse muy afectado. Sin embargo, aplicaciones que interaccionan con el sistema operativo de forma intensiva, generalmente para realizar operaciones de disco o de red, pueden terminar impactados gravemente.

Spectre

Spectre es un ataque de tipo más general basado en una mayor cantidad de características de la ejecución especulativa, por lo que puede ser llevado a cabo con éxito contra los procesadores AMD y ARM, además de Intel. Abarca dos vulnerabilidades, cuyos códigos son CVE-2017-5753 y CVE-2017-5715.

Spectre es ejecutado mediante la utilización de especulación sobre, por ejemplo, una matriz de comprobación de límites o instrucciones de salto para filtrar información. Además de filtrar información del kernel a los programas del usuario, también puede ser utilizado desde hipervisores de virtualización hacia los sistemas invitados.

Lo peor de Spectre es que su solución no es tan sencilla como en el caso de Meltdown, por lo que los parches liberados para los distintos sistemas operativos todavía no lo corrigen, aunque también es algo más complicado de explotar. El motivo es porque la especulación es necesaria para los procesadores de alto rendimiento, y aunque se podría bloquear la ejecución de ciertas operaciones especulativas, no se sabe de momento cómo aplicar una técnica que evite cualquier fuga de información provocada por la ejecución especulativa.

Ciertas piezas de código sensibles pueden ser modificadas para incluir instrucciones de serialización, que son instrucciones que obligan al procesador a esperar a que finalicen todas las operaciones de lectura y de escritura en la memoria, evitando así cualquier especulación en dichas operaciones. ARM, Intel y AMD ya han desarrollado o están desarrollando instrucciones para al menos mitigar Spectre.

Impacto para los usuarios

Como ya hemos comentado en otros artículos, el problema que se nos presenta es sobre todo por la anulación de un sistema de protección incorporado en los sistemas operativos: ASLR.

Esto quiere decir que el impacto directo de Meltdown y Spectre en los escritorios comunes no tendría que ser muy grande, siendo sobre todo un apoyo para la ejecución de ataques y la explotación de otras vulnerabilidades, ya que ninguno es capaz, por ejemplo, de salirse de la ejecución de un navegador web.

 

Más información: Meltdown and Spectre

Fuentes: ArsTechnica | muyseguridad