
Ejemplo de uso del exploit 'Spectre' revelado (CVE-2017-5753 y CVE-2017-5715)
Ejemplo de uso del exploit revelado "Spectre" del 2 de enero de 2018 (CVE-2017-5753 y CVE-2017-5715)
Spectre rompe el aislamiento entre diferentes aplicaciones. Permite a un atacante engañar a programas libres de errores, que siguen las mejores prácticas, para que filtren sus secretos. De hecho, las comprobaciones de seguridad de dichas mejores prácticas aumentan la superficie de ataque y pueden hacer que las aplicaciones sean más susceptibles a Spectre.
C, utiliza las librerías:
Estamos colocando el texto "The Magic Words are Squeamish Ossifrage." en la memoria y luego intentamos leerlo mediante el exploit. Si el sistema es vulnerable, verás el mismo texto en la salida, leído de la memoria.
En este código, si las instrucciones compiladas en victim_function() se ejecutaran en estricto orden de programa, la función solo leería de array1[0..15] ya que el tamaño de array1 es 16. Sin embargo, cuando se ejecuta especulativamente, las lecturas fuera de los límites son posibles. La función readMemoryByte() realiza varias llamadas de entrenamiento a victim_function() para hacer que el predictor de saltos espere valores válidos para x, luego llama con una x fuera de los límites. El salto condicional falla en la predicción, y la ejecución especulativa subsiguiente lee un byte secreto usando la x fuera de límites. Luego, el código especulativo lee de array2[array1[x] * 512], filtrando el valor de array1[x] en el estado de la caché. Para completar el ataque, se utiliza un simple flush+probe para identificar qué línea de caché en array2 se cargó, revelando el contenido de la memoria. El ataque se repite varias veces, por lo que incluso si el byte objetivo no estaba inicialmente en la caché, la primera iteración lo traerá a la caché.
El código sin optimizar lee aproximadamente 10KB/segundo en un i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
o
make
Crea un nuevo proyecto vacío y agrega Source.c, luego haz clic en Compilar.
.\spectre.out sin parámetros.
.\spectre.out {address} {length} con parámetros: