Por lo que sé, los ataques Meltdown y Specter explotan el hecho de que algunos procesadores modernos, cuando se les da algo como:
if (x < arr1[y])
z = arr2[arr3[x]*256];
a veces puede obtener el valor de arr2[arr3[x] * 256]
antes de que hayan determinado si x
es menor que arr1[y]
, y puede hacer esto sin tener en cuenta si el código tiene permiso adecuado para acceder a arr3[x]
. La parte en cursiva es el sine qua non de la vulnerabilidad: si el procesador solo fuera a buscar arr2[arr3[x] * 256]
en los casos en que el acceso a arr3[x]
fuera permisible, sería imposible explotar un a arr2[___ * 256]
usando valores arr3[x]
ilegítimos porque no habría ninguno.
Tiene sentido que incluso si arr3[x]
no es válido, el procesador no pueda interceptarse a menos que o hasta que determine que x
sea menor que arr1[y]
. Lo que no entiendo es por qué una recuperación especulativa de una dirección no válida no debería hacer que la CPU abandone la ruta de ejecución especulativa actual. Pensaría que en casi todos los escenarios realistas ocurriría una de dos cosas:
-
La predicción de bifurcación que condujo a la ejecución especulativa resultó ser incorrecta, en cuyo caso será necesario descartar cualquier trabajo que pueda realizarse con el valor obtenido de forma especulativa.
-
La predicción de bifurcación que condujo a la ejecución especulativa resulta ser correcta, en cuyo caso la ejecución debería interceptarse en el acceso no válido, y el trabajo que podría realizarse con el valor obtenido de forma especulativa (antes de ejecutar la captura) necesita ser descartado.
¿Hay algún escenario realista en el que el trabajo especulativo que sigue una búsqueda especulativa desde una dirección ilegítima pueda resultar útil? Si no, ¿qué ventaja tiene permitir que la ejecución especulativa continúe más allá de tales capturas? Si una recuperación no válida hará que la CPU abandone la línea actual de ejecución especulativa, evitaría la necesidad de realizar un seguimiento de las trampas especulativas pendientes.