Nos chers amis ingénieurs et architectes processeur, dans leur quête effrénée de performance, nous ont concocté une petite surprise : les attaques Spectre. Un nom qui sonne comme un mauvais film d’espionnage, et qui est malheureusement bien réel.
Le principe est simple et diabolique : exploiter les mécanismes d’exécution spéculative et de prédiction de branchement de nos processeurs pour leur faire exécuter du code qui ne devrait pas l’être et révéler des données sensibles. Tout cela en passant totalement inaperçu. Un tour de passe-passe digne des plus grands magiciens.
Mais rassurez-vous, cela part d’une bonne intention. L’exécution spéculative permet d’optimiser les performances en pariant sur les instructions futures probables et en les exécutant à l’avance. Quant à la prédiction de branchement, elle devine habilement quelle sera l’issue la plus vraisemblable d’une condition pour ne pas perdre un cycle d’horloge. Que d’ingéniosité pour nous faire gagner quelques nanosecondes !
Sauf que voilà, des petits malins ont trouvé le moyen de détourner ces nobles mécanismes. Ils arrivent à tromper le processeur, lui faire miser sur le mauvais cheval et exécuter du code arbitraire par anticipation. La cerise sur le gâteau ? Même si la spéculation se révèle incorrecte et que les effets sont annulés, les données accédées laissent une trace dans l’état du cache. Il suffit alors d’un peu de reverse engineering pour retrouver les octets volés.
Un exemple pour la route ? Le processeur charge une donnée sensible en mémoire, disons un mot de passe ou une clé de chiffrement. Une condition est évaluée, mais le résultat n’est pas encore connu. Qu’à cela ne tienne, le CPU prédit le résultat et exécute speculativement la suite en utilisant la donnée sensible comme index pour accéder à un tableau. L’accès sera plus ou moins rapide selon que la donnée était déjà dans le cache ou non. Il ne reste plus qu’à mesurer ce temps d’accès pour en déduire la valeur de l’index secret. Voilà, le tour est joué !
Les variantes sont multiples pour s’adapter à toutes les situations. Misprediction de branchements conditionnels, empoisonnement de branchements indirects, contournement de protections mémoire, lecture de noyau depuis l’espace utilisateur… Un grand moment de solitude pour la sécurité logicielle qui misait beaucoup sur l’isolation fournie par le matériel.
Les attaques Spectre ouvrent un vaste champ des possibles pour exfiltrer des données par des canaux auxiliaires. Consommation du cache, de la mémoire, contention sur les unités de calcul, rayonnements électromagnétiques… Tout ce qui est mesurable est exploitable. Comme quoi il ne faut jamais sous-estimer la créativité des attaquants.
Bien sûr, l’industrie contre-attaque. Correctifs logiciels pour émuler les instructions sensibles, mises à jour de microcode, isolation des processus, mécanismes matériels pour restreindre la prédiction… Les idées ne manquent pas mais ont toutes un coût en performance et complexité. Il faudra trouver le bon équilibre.
En attendant, nous voilà prévenus. La morale de l’histoire est claire : la sécurité ne doit pas être un ajout tardif mais une propriété fondamentale co-conçue avec le matériel et le logiciel. Gare aux spectres qui rodent dans nos machines !