Étant donné que cette nouvelle classe d'attaques implique la mesure d'intervalles de temps précis, en tant qu'atténuation partielle à court terme, nous désactivons ou réduisons la précision de plusieurs sources de temps dans Firefox. La précision de performance.now () a été réduite de 5 μs à 20 μs et la fonction SharedArrayBuffer a été désactivée car elle peut être utilisée pour construire un temporisateur haute résolution.
Comment SharedArrayBuffer peut-il être utilisé pour construire une minuterie haute résolution? N'est-ce pas juste un tampon avec des règles spéciales qui lui permettent de être directement passé dans un autre contexte plutôt que de le cloner ?
SharedArrayBuffer
permet à deux threads de partager l'état, donc l'un peut fonctionner comme une "horloge" (incrémenter le signal de synchronisation) et l'autre peut lire "l'horloge". De plus, la disponibilité de l'objet Atomics
permet d'effectuer des opérations sur le SharedArrayBuffer
d'une manière qui rend l'incrémentation efficace et peut être vue par le thread de lecture sans risque de une condition de course.
Ce temporisateur est, certes, uniquement en unités de "vitesse à laquelle les autres threads incrémentent" et non en "secondes", mais pour chronométrer les attaques, les données intéressantes pour un attaquant sont relatives timing. Savoir qu'une ligne de cache donnée (dans le cas de Spectre) se charge plus rapidement que d'autres révèle qu'elle a été mise en cache par le CPU. Il en va de même pour le chronométrage des attaques sur des choses comme les comparaisons de mots de passe (les caractères corrects prennent plus de temps que les caractères incorrects).
Il serait possible de calibrer une boucle de synchronisation rapide par rapport à une référence d'horloge connue (c'est-à-dire à partir de performance.now ()) pour obtenir un temps moyen par incrément , mais il y aurait encore une petite gigue.