Es difícil empezar este post pero me siento obligado a escribir al respecto porque la mayoría de los medios más tradicionales estan llenando de confusión el tema, sí, hay vulnerabilidades terribles encontradas en los procesadores, una afectaba a Intel y casi todos se centraron en estos procesadores pero no, no es la única, hay varias y TODOS, repito, TODOS los procesadores estan en problemas para TODOS los sistemas operativos.
No es amarillismo, es un hecho, “Meltdown” y “Spectre” son los nombres de las dos vulnerabilidades más importantes encontradas a la fecha y lamentablemente el mismo diseño de los procesadores las hace virtualmente imposibles de corregir hasta que no se diseñe una nueva arquitectura interna mejorada contemplando estas fallas. Mientras tanto todo bugfix, ya sea desde BIOS/UEFI o sitema operativo será un parche para mitigar el problema y, en muchos casos, afectando la performance de dichos procesadores para ciertas aplicaciones o cargas.
Es un comienzo de año atípico y seguramente de panic attack para los sysadmins que deban aplicar parches en miles o millones de equipos, ni hablar aquellos basados en “la nube”, ya que todo procesador, por ende no sólo los que uno posea localmente sino los de todo ISP desde Google a Amazon, estan en riesgo.
Los dos bugs provienen de una misma particularidad de los modernos CPU, la ejecución especulativa, para resumirlo: el procesador prepara el resultado de una condición, sea por verdadero o falso, y una vez obtenido el resultado correcto descarta el resultado innecesario.
Por ejemplo: el procesador puede cargar datos en caché por si pueden llegar a ser usados, esto es detectable y son datos que probablemente no debían estar ahí, pero por la ejecución especulativa se cargaron “por las dudas”, y estos datos pueden ser accedidos sin mucho esfuerzo.
Meltdown
Meltdown fue detectado de forma independiente por tres equipos, por un lado la Universidad Tecnológica de Graz, en Austria, por otro la firma alemana Cerberus Security y en tercer lugar el Project Zero de Google.
Este disparó una enorme cantidad de cambios y patches para todos los sistemas operativos, pero el principal afectado fue Intel como procesador, la razón es que Intel fue muy agresivo a la hora de diseñar su ejecución especulativa y toma muchos datos en memoria aun sin necesitarlos pero, para colmo, los procesadores de Intel le permiten a aplicaciones de usuario tomar datos del kernel.
Con suficiente paciencia y trabajo se puede inferir el valor de los datos que está moviendo en caché el kernel, en resumidas cuentas, una aplicación de usuario puede detectar los datos que mueve el kernel, aun cuando la ejecución especulativa los borra rápidamente.
y con tan pocas líneas de código…
Este acceso a la memoria especulativa del kernel pudieron lograrlo en Intel pero no en ARM O AMD, por su parte ARM admite que algunos de sus diseños podrían ser afectados por esto mas AMD indicó que no guarda las direcciones de memoria especulativa en el kernel evitando este problema por diseño. Pueden leer el paso a paso de cómo se abusa de esto aquí.
Los patches que estan lanzando distintos sistemas operativos anulan el “shared mapping” que permite a las aplicaciones de usuario conocer las posiciones en memoria del kernel para este cacheo, así evitando la lectura, pero esto tiene un impacto directo en la performance porque cada lectura que ahora hará el kernel necesitará levantar el dato nuevamente, no lo tendrá previamente cacheado.
Obviamente la penalidad de performance dependerá de la carga, algunos hablan de 5% a 30% pero tomo ese “dato” con pinzas, es de esos que se repite sin saber ni conocer realmente el benchmark en el mundo real, habrá que ver cómo afecta recién esten los parches en marcha o instalados.
Spectre
Spectre, por su parte es un descubrimiento de Project Zero y de forma independiente por parte de Paul Kocher. Y aquí se extiende el problema no sólo a Intel, que parece ser la que recibe todos los golpes pero no es así, sino a AMD y ARM que también son vulnerables.
Porque la ejecución por especulación no sólo afecta a la posición en memoria, se utiliza en cada parte del diseño del procesador así que Spectre busca en un rango mucho más amplio de funcionalidades, la idea es más o menos similar, utilizar parámetros para obtener datos que permitan inferir los valores sin tener permiso directo para leerlos, por ende, nuevamente, que una aplicación de usuario pueda leer lo que sucede en el kernel u otra aplicación.
Sea arrays, sus tamaños, cadenas de instrucciones, etc. con varios ejemplos ya creados para AMD, Intel y ARM y sin una posible solución ni con un parche. Es que esto viene así desde el diseño mismo de los procesadores, no es algo anulable.
Sumado: puede robar información de un hypervisor desde un sistema operativo virtualizado, así es, desde abajo hacia arriba.
La primer idea para resolverlo es serializar las instrucciones y evitar que se realice la ejecución especulativa, esperar a que se escriba toda la memoria antes de ejecutar la siguiente instrucción. Pero volvemos a lo mismos, performance reducida, pérdida de ventajas notables y un nuevo set de instrucciones que los desarrolladores de cada sistema operativo deberían habilitar pero ¿En qué casos? ¿Tiene que ser estricto? En fin, un desastre porque afecta no sólo al procesador sino a todo el software que lo utiliza.
hasta por javascript se puede aprovechar
Solución?
El problema es mayor, no es fácil resolver esto, todos los desarrolladores de sistemas operativos estan trabajando al máximo para mitigar el potencial problema masivo que se podría dar.
Si bien todas las PCs de escritorio sufren de la misma vulnerabildad no es allí donde está el mayor problema, piensen en Amazon, Google y Microsoft, los mayores proveedores de Cloud Computing, todos sus equipos, varios millones, estan expuestos. Piensen en que se puede afectar un servidor, ascender al hypervisor, tomar control de claves, llaves PGP, SSL, lo que sea que pase por el kernel ya que su seguridad ha sido vulnerada.
Microsoft está empujando los patches más rápido que nunca y ya tiene soluciones para Meltdown que atajarán el impacto inicial, el problema de los parches de urgencia es que no tienen tanto testing, pero considerando la gravedad de la situación será mejor soportar un bajo en la performance que un bajón total.
Los devs de Linux también estan lanzando parches pero de ahí a que cada distro lance el kernel actualizado pasarán días, Amazon y Google dependen de esto y son los que más han estado trabajando gracias al Project Zero de Google que detectó las vulnerabilidades, segun anuncian ya actualizaron todo para Meltdown.
Y si, esto también afecta a teléfonos, sólo Androids con el último parche estarán cubiertos.
Ahora bien, no creo que ninguno de los fabricantes de procesadores esté en capacidad de hacer un “recall” de los productos vendidos, no es económicamente posible, pero para poder solucionarlo desde hardware deberían poner un freno inmediato en toda la producción de procesadores global, algo también inviable.
Por otra parte, la razón para utilizar ejecución especulativa tiene su origen en la necesidad de performance por encima de la de seguridad, será el momento en que la industria deba cambiar de prepo? Intel minimiza la especulación de riesgo diciendo que no es para tanto, pero todo el mundo de la seguridad informática está bien alerta, hasta Mozilla notó que se puede ejecutar desde su browser y Microsoft ya lanzó parche para Edge ¿Se entiende la dimensión?
Obviamente los escenarios donde Spectre pueden utilizarse son más reducidos que con Meltdown pero las soluciones para el segundo son menores que para el primero, esperemos que se tarden en crear exploits más de lo que se tardará en parchear todo este desastre.
Para más detalle técnico aquí el PDF de Meltdown y aquí de Spectre
Es irónico que Corea del Norte con su tecnología atrasada quizá sea el país inmune a este posible apocalipsis tecnológico.