質問: レトポリンとは何ですか? カーネルやプロセス間のメモリ漏洩( spectre 攻撃)を軽減するために、 linuxカーネル)1 いわゆる retpoline を介して間接的な呼び出しを実行するためにgccに導入された新しいオプションでコンパイルされます 、-mindirect-branch=thunk-extern。これは、googleの検索がごく最近になって使用されるようになったために新しく発明された用語のように思われます(一般的にはすべて2018年)。retpolineとは何ですか?また最近のカーネル情報漏えい攻撃をどのように防ぎますか?1 しかし、これはlinux特有のものではありません - 他のosでは 緩和戦略 の一部として類似または同一の構成が使用されているようです。
回答: この質問は少し前に尋ねられたもので、新しい答えに値します。 エグゼクティブサマリー :「retpoline」シーケンスは、間接分岐を投機的実行から分離できるソフトウェア構成体です。これは、敏感なバイナリ(オペレーティングシステムやハイパーバイザーの実装など)を、間接的なブランチに対するブランチターゲットインジェクション攻撃から保護するために適用できます。単語「 retpoline 」は、単語「return」および「trampoline」の portmantea "、改善とよく似ています" relpoline "は、「相対呼び出し」と「トランポリン」から作られました。これは、関連する投機的実行が無限に「バウンス」することを比fig的に保証するリターン操作を使用して構築されたトランポリン構造です。 カーネルまたはプロセスにまたがるメモリの開示(specter攻撃)を緩和するために、linuxカーネル [1] 新しいオプションでコンパイルされます。-mindirect-branch=thunk-externはgccに導入され、いわゆるretpolineを介して間接呼び出しを実行します。 [1]ただし、linux固有ではありません-他のosの緩和戦略の一部として、類似または同一の構造が使用されているようです。 このコンパイラー・オプションonlyを使用すると、cve-2017-に必要なマイクロコード更新がある影響を受けるプロセッサーで spectre v2 から保護されます5715。どのコード(カーネルだけでなく)でも「work」になりますが、攻撃する価値があるのは「秘密」を含むコードのみです。 google検索ではごく最近の使用(一般的にはすべて2018年)が判明したため、これは新しく考案された用語のようです。 llvmコンパイラ には 2018年1月4日以前 以降、-mretpolineスイッチがあります。その日は、脆弱性が 最初に公表された であった日です。 gcc パッチを利用可能にしました 2018年1月7日。cve日付は、この脆弱性が2017年に「discovered」であったことを示唆していますが、過去20年間に製造されたプロセッサーの一部に影響を及ぼします(したがって、かなり前に発見された可能性があります)。 レトポリンとは何ですか?最近のカーネル情報漏えい攻撃をどのように防ぐのですか? まず、いくつかの定義: トランポリン -間接ジャンプベクトルと呼ばれることもありますトランポリンは、割り込みサービスルーチン、i/oルーチンなどを指すアドレスを保持しているメモリの場所です。用語トランポリン。 gccは伝統的に ネストされた関数のアドレスが取得されたときに実行時に実行可能なトランポリンを作成することにより、ネストされた関数をサポートしました。これは、通常、スタックを含む関数のスタックフレームにある小さなコードです。トランポリンは、静的チェーンレジスタをロードし、ネストされた関数の実際のアドレスにジャンプします。 サンク -サンクは、別のサブルーチンに追加の計算を注入するために使用されるサブルーチンです。サンクは主に、結果が必要になるまで計算を遅らせるため、または他のサブルーチンの最初または最後に操作を挿入するために使用されます メモ化 -メモ化された関数は、特定の入力セットに対応する結果を「記憶」します。記憶された入力を使用した後続の呼び出しは、再計算ではなく記憶された結果を返すため、これらのパラメーターを使用して関数に対して行われる最初の呼び出し以外のすべてのパラメーターからの呼び出しの主なコストを排除します。 大体、retpolineはaトランポリンreturnwiththunk、to 'spoil'memoization間接ブランチ予測子。 ソース :intelのpause命令が含まれていますが、amdにはlfence命令が必要です。これは、そのプロセッサではpause命令がシリアル化命令ではないため、pause/jmpループが次のように過剰電力を使用するためです正しいターゲットへの予測ミスへの復帰を待機していると推測されます。 arstechnica には問題の簡単な説明があります。 「各プロセッサには、アーキテクチャの動作(命令の動作とプログラマがプログラムの作成に依存することを説明する文書化された動作)とマイクロアーキテクチャの動作(アーキテクチャの実際の実装の動作)があります。これらは微妙に異なる場合があります。たとえば、アーキテクチャ上、メモリ内の特定のアドレスから値をロードするプログラムは、ロードが実行される前にアドレスがわかるまで待機しますが、マイクロアーキテクチャ的には、プロセッサはアドレスを推測的に推測し、開始できる場合があります使用するアドレスが完全に特定される前であっても、メモリから値をロードします(低速です)。 プロセッサが間違って推測した場合、推測された値を無視し、今回は正しいアドレスで再度ロードを実行します。したがって、アーキテクチャ的に定義された動作が保持されます。しかし、その誤った推測は、プロセッサの他の部分、特にキャッシュの内容を妨害します。これらのマイクロアーキテクチャの障害は、キャッシュにあるべき(またはすべきでない)データにアクセスするのにかかる時間を計ることで検出および測定でき、悪意のあるプログラムがメモリに格納されている値について推測することができます。」. intelの論文から: " retpoline:a branch target injection mitigation "( 。pdf ): 「レトポリンシーケンスは、プロセッサの投機的実行が「間接分岐予測」(プログラムフローを予測する1つの方法)を使用して、悪用(分岐ターゲットインジェクションの5つの要素の満足な要素4(スペクターバリアント2) )上記の構成を活用してください。」。 注、要素4は次のとおりです。「エクスプロイトは、この間接ブランチに影響を与えて、ガジェットを推測的に予測および実行する必要があります。エクスプロイトによって選択されたこのガジェットは、通常、キャッシュタイミングによってサイドチャネルを介して秘密データを漏らします。」.