Exemple d'utilisation de l'exploit "Spectre" révélé le 2 janvier 2018 (CVE-2017-5753 et CVE-2017-5715)
Spectre brise l'isolement entre les différentes applications. Il permet à un attaquant de tromper des programmes sans erreur, qui suivent les meilleures pratiques, pour qu'ils divulguent leurs secrets. En fait, les contrôles de sécurité de ces meilleures pratiques augmentent en fait la surface d'attaque et peuvent rendre les applications plus sensibles à Spectre.
C, utilise les bibliothèques :
Nous mettons le texte "Les mots magiques sont une ossifrage dégoûtante". en mémoire, puis nous essayons de le lire en utilisant 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 l'ordre strict du programme, la fonction ne lirait que depuis array1[0..15]
puisque array1 size = 16. Cependant, lorsqu'elle est exécutée de manière spéculative, les lectures hors limites sont possibles. La fonction readMemoryByte()
effectue plusieurs appels d'entraînement à victim_function()
pour que le prédicteur de branche attende des valeurs valides pour x, puis appelle avec un x hors limites. La branche conditionnelle effectue 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]
, laissant échapper la valeur de array1[x]
dans l'état du cache. Pour terminer l'attaque, un simple flush+sonde est utilisé pour identifier quelle ligne de cache du array2
a été chargée, révélant ainsi le contenu de la mémoire. L'attaque est répétée plusieurs fois, donc même si l'octet cible n'était initialement pas mis en cache, la première itération le mettra dans le cache.
Le code non optimisé lit environ 10 Ko/seconde sur une Surface Pro 3 i7.
gcc -std=c99 Source.c -o spectre.out
ou make
Créez un nouveau projet vide et ajoutez Source.c puis cliquez sur Build.
.spectre.out
sans paramètres.
.spectre.out {address} {length}
avec les paramètres :