Des attaques concrètes

Les attaques micro-architecturales (cache, Spectre)

Les attaques précédentes visaient du matériel qu'on tient dans la main. Les attaques micro-architecturales, elles, se font par logiciel, entre deux programmes qui partagent le même processeur — dans un serveur, un cloud, votre propre navigateur.

Le coupable : le cache partagé

Pour aller vite, un processeur garde les données récemment utilisées dans une petite mémoire très rapide, le cache. La conséquence est cruciale pour la sécurité :

  • accéder à une donnée présente dans le cache est rapide ;
  • accéder à une donnée absente oblige à aller en mémoire principale : c'est lent.

Ce simple écart de temps est un canal auxiliaire. Et comme le cache est partagé entre les programmes, un processus espion peut sonder ce qu'un autre a laissé.

Flush+Reload : espionner par le cache

La technique Flush+Reload exploite cet écart lorsqu'une zone mémoire est partagée (une bibliothèque commune, par exemple) :

   espion              cache partagé          victime
  1. flush -----------> [ ligne vidée ]           |
  2. attend                              calcule (accède ?)
  3. reload ---------> [rapide ? lent ?] <---------|

   accès RAPIDE -> la victime y a touché (rechargé)
   accès LENT   -> la victime n'y a pas touché

En observant quelles cases la victime consulte, l'espion déduit les données — donc des morceaux de clé, car les tables de calcul consultées dépendent du secret.

Spectre et Meltdown : l'exécution spéculative

En 2018, Spectre et Meltdown ont fait scandale : ils exploitent une optimisation présente dans presque tous les processeurs modernes, l'exécution spéculative.

Pour ne pas attendre, le processeur devine la suite d'un programme et exécute des instructions par avance. Si le pari est mauvais, il annule les résultats… mais les traces laissées dans le cache subsistent. Un attaquant provoque une lecture spéculative d'une mémoire interdite, puis récupère la valeur par Flush+Reload.

   if (i < taille_tableau):        # branche mal prédite
        y = tableau2[ tableau1[i] * 256 ]
        ^ exécuté PAR SPÉCULATION même si i est hors limites
          -> laisse dans le cache l'empreinte d'une donnée SECRÈTE
  • Meltdown franchit la barrière entre programme et noyau du système.
  • Spectre trompe un programme pour qu'il fuite ses propres données protégées.

Ces attaques cassent l'isolation : la garantie qu'un processus ne peut lire la mémoire d'un autre. Sur un cloud, un locataire pouvait en théorie espionner son voisin.

Les contre-mesures

Elles sont logicielles et matérielles, et souvent coûteuses :

  • correctifs du système isolant la mémoire du noyau ;
  • barrières empêchant certaines spéculations dans le code sensible ;
  • nouveaux processeurs corrigeant le défaut au niveau du silicium ;
  • code sans accès mémoire dépendant du secret (le temps constant, encore).

Le prix à payer est parfois une perte de performance : la sécurité contre ces fuites n'est pas gratuite.

En résumé

Les caches CPU partagés laissent fuir de l'information entre processus : Flush+Reload déduit les accès mémoire de la victime par le temps. Spectre et Meltdown (2018) détournent l'exécution spéculative pour lire de la mémoire interdite et cassent l'isolation. On s'en protège par des correctifs logiciels, des révisions matérielles et du code sans accès dépendant du secret — au prix de performances.