Ejemplo de uso del exploit "Spectre" revelado el 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 bibliotecas:
Estamos poniendo el texto "Las palabras mágicas son osífragas aprensivas". en la memoria y luego intentamos leerlo usando exploit. Si el sistema es vulnerable, verá el mismo texto en el resultado, leído de la memoria.
En este código, si las instrucciones compiladas en victim_function()
se ejecutaran en estricto orden del programa, la función solo leería desde array1[0..15]
ya que tamaño de matriz1 = 16. Sin embargo, cuando se ejecuta de forma especulativa, lecturas fuera de límites son posibles. La función readMemoryByte()
realiza varias llamadas de entrenamiento a victim_function()
para hacer que el predictor de rama espere valores válidos para x, luego llama con una x fuera de límites. La rama condicional predice erróneamente y la ejecución especulativa subsiguiente lee un byte secreto utilizando la x fuera de límites. Luego, el código especulativo lee desde array2[array1[x] * 512]
, filtrando el valor de array1[x]
al estado de caché. Para completar el ataque, se utiliza una simple sonda + descarga 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 de destino no estaba inicialmente almacenado en caché, la primera iteración lo colocará en el caché.
El código no optimizado lee aproximadamente 10 KB/segundo en un i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
o make
Cree un nuevo proyecto vacío y agregue Source.c, luego haga clic en Construir.
.spectre.out
sin parámetros.
.spectre.out {address} {length}
con parámetros: