web-dev-qa-db-ja.com

SharedArrayBufferはタイミング攻撃にどのように使用できますか?

この新しいクラスの攻撃には、正確な時間間隔の測定が含まれるため、Firefoxのいくつかの時間ソースの精度を無効にするか、短期的に緩和するために、Firefoxでいくつかの時間ソースの精度を無効化または低減しています。 performance.now()の精度が5μsから20μsに減少し、SharedArrayBuffer機能を使用して高精度タイマーを構築できるようになったため、無効化されました。

Mozilla Foundation Security Advisory 2018-01

SharedArrayBufferを使用して高解像度タイマーを構築するにはどうすればよいですか? それを複製するのではなく、別のコンテキストに直接渡される を許可する特別なルールを持つ単なるバッファではありませんか?

20
curiousdannii

SharedArrayBufferを使用すると、2つのスレッドが状態を共有できるため、1つは「クロック」として動作し(タイミング信号をインクリメント)、もう1つは「クロック」を読み取ることができます。さらに、 Atomics オブジェクトを使用できるため、SharedArrayBufferで操作を実行できるため、効率的にインクリメントでき、読み取りスレッドでリスクを冒すことなく確認できます。競合状態。

このタイマーは、確かに、「秒」ではなく「他のスレッドの増分」の単位でのみですが、タイミング攻撃の場合、攻撃者にとって興味深いデータはrelativeタイミング。特定のキャッシュライン(Spectreの場合)が他のキャッシュラインよりも速くロードされることを知ると、CPUによってプリキャッシュされていることがわかります。同じことが、パスワード比較などのタイミング攻撃にも当てはまります(正しい文字は、不適切な文字よりも長い時間がかかります)。

既知のクロック基準(つまり、performance.now()から)に対して高速タイミングループを調整して、average増分を取得することは可能です。 、しかしそれでも若干の小さなジッタがあるでしょう。

19
David