
Exemple d'utilisation de l'exploit « Spectre » révélé (CVE-2017-5753 et CVE-2017-5715)
Exemple d'utilisation de l'exploit « Spectre » révélé le 2 janvier 2018 (CVE-2017-5753 et CVE-2017-5715)
Spectre brise l'isolation entre différentes applications. Il permet à un attaquant de tromper des programmes sans erreur, qui suivent les meilleures pratiques, en leur faisant divulguer leurs secrets. En fait, les vérifications de sécurité de ces meilleures pratiques augmentent la surface d'attaque et peuvent rendre les applications plus vulnérables à Spectre.
C, utilise les bibliothèques :
Nous plaçons le texte « The Magic Words are Squeamish Ossifrage. » en mémoire, puis nous essayons de le lire à l'aide de l'exploit. Si le système est vulnérable, vous verrez le même texte en sortie, lu depuis la mémoire.
Dans ce code, si les instructions compilées dans victim_function() étaient exécutées dans un ordre strictement séquentiel, la fonction ne lirait que dans array1[0..15] puisque la taille d'array1 = 16. Cependant, lorsqu'elle est exécutée de manière spéculative, des lectures hors limites sont possibles. La fonction readMemoryByte() effectue plusieurs appels d'entraînement à victim_function() pour que le prédicteur de branche s'attende à des valeurs valides pour x, puis l'appelle avec un x hors limites. Le branchement conditionnel fait une mauvaise prédiction, et l'exécution spéculative qui s'ensuit lit un octet secret en utilisant le x hors limites. Le code spéculatif lit ensuite array2[array1[x] * 512], faisant fuir la valeur de array1[x] dans l'état du cache. Pour terminer l'attaque, un simple flush+probe est utilisé pour identifier quelle ligne de cache dans array2 a été chargée, révélant le contenu de la mémoire. L'attaque est répétée plusieurs fois ; ainsi, même si l'octet cible n'était pas initialement dans le cache, la première itération l'y placera.
Le code non optimisé lit environ 10 Ko/s sur un i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
ou
make
Créez un nouveau projet vide, ajoutez Source.c, puis cliquez sur Build.
.\spectre.out sans paramètres.
.\spectre.out {adresse} {longueur} avec les paramètres :