この新しいクラスの攻撃には、正確な時間間隔の測定が含まれるため、Firefoxのいくつかの時間ソースの精度を無効にするか、短期的に緩和するために、Firefoxでいくつかの時間ソースの精度を無効化または低減しています。 performance.now()の精度が5μsから20μsに減少し、SharedArrayBuffer機能を使用して高精度タイマーを構築できるようになったため、無効化されました。
SharedArrayBufferを使用して高解像度タイマーを構築するにはどうすればよいですか? それを複製するのではなく、別のコンテキストに直接渡される を許可する特別なルールを持つ単なるバッファではありませんか?
SharedArrayBuffer
を使用すると、2つのスレッドが状態を共有できるため、1つは「クロック」として動作し(タイミング信号をインクリメント)、もう1つは「クロック」を読み取ることができます。さらに、 Atomics
オブジェクトを使用できるため、SharedArrayBuffer
で操作を実行できるため、効率的にインクリメントでき、読み取りスレッドでリスクを冒すことなく確認できます。競合状態。
このタイマーは、確かに、「秒」ではなく「他のスレッドの増分」の単位でのみですが、タイミング攻撃の場合、攻撃者にとって興味深いデータはrelativeタイミング。特定のキャッシュライン(Spectreの場合)が他のキャッシュラインよりも速くロードされることを知ると、CPUによってプリキャッシュされていることがわかります。同じことが、パスワード比較などのタイミング攻撃にも当てはまります(正しい文字は、不適切な文字よりも長い時間がかかります)。
既知のクロック基準(つまり、performance.now()から)に対して高速タイミングループを調整して、average増分を取得することは可能です。 、しかしそれでも若干の小さなジッタがあるでしょう。