投機的実行がキャッシュタイミングに測定可能な影響を与える特定のマイクロプロセッサー(主にマイクロコードへのパッチ、オペレーティングシステム、および信頼境界を含むすべてのアプリケーション)のメルトダウンおよびスペクターの脆弱性を軽減する短期的な対策について知っています。
問題の長期的な解決策は何ですか?
「投機しない」や「投機時にキャッシュを無視する」などの単純な解決策は、そもそも投機を導入したパフォーマンスの考慮事項のため、許容できない可能性があります。
おそらく、推測された命令は、推測が成功した場合にのみメインキャッシュにコピーされる別のキャッシュを使用できますか?そうでない場合、なぜそうではないのですか?
カーネルページテーブルの分離を自動化(およびそのパフォーマンスへの影響を低減)するために、プロセッサはページテーブルエントリに特権情報を追加できますか?
パフォーマンスに大きな影響を与えずにセキュリティを向上させる他の設計変更はありますか?
メルトダウンの修正は簡単です。CPUが投機的実行を実行している場合、メモリの保護された領域からデータを読み取らないでください。 Meltdownがほぼ独占的にIntel専用であるという事実は、それが投機的実行の固有の副作用ではなく、設計上の欠陥であることを示しています。
一般的な場合のSpectreの修正ははるかに困難です。 Spectreは、プログラムを投機的に誤動作させ、その誤動作の副作用を観察することです。あなたcannotすべての副作用を取り除く:すべてのキャッシュ、バッファ、テーブルなどをロールバックできたとしても、投機的な実行には投機的なexecutionが含まれるという単純な事実があります。 =。投機的命令の実行には(ある程度データ制御可能な)時間を要しますが、これはタイムトラベルを理解するまでには取り消すことができません。
できることは、投機的な誤動作を引き起こす困難を大幅に増やすことです。現在、ほとんどのCPUには「プロセス」の概念がなく、分岐予測テーブルでルックアップを実行するときにアドレスの一部のみを使用します。分岐予測データにタグが付けられて、それが属するプロセスを示す場合、または分岐予測テーブルが各コンテキストスイッチでフラッシュされる場合、1つのプログラムが別のプログラムに対する分岐予測子のアクションを誤ってトレーニングする機能は効果的に排除されます。同様に、完全なアドレスを使用して分岐予測が実行される場合、プログラムはそれ自体を攻撃できません(たとえば、Javascriptは、WebブラウザーのサンドボックスからのSpectreブレークアウトを使用できません)。
3つの攻撃はすべて、投機的実行が実際に観察できる副作用を生み出したサイドチャネルを使用します。
このクラスの攻撃を防ぐには、投機的実行回路を変更して、観測可能なプロセッサー状態の変化が発生しないようにする必要があります(一時的な結果は別として)。たとえば、プロセッサは、投機的実行の前にすべてのキャッシュ、バッファ、およびテーブルのスナップショットを作成し、分岐が行われなかった場合にそれらを復元できます。あるいは、たとえば分岐予測が失敗した後、初めてすべてのキャッシュラインへのアクセスを同等に遅くすることで、効果が観察されないようにすることができます。
残念ながら、修正を行うと、現在のプロセッサの設計と方法に大きな変更が加えられ、分岐予測と投機的実行の多くの利点が失われる可能性があります。