web-dev-qa-db-ja.com

GCC retpolineフラグを使用したコンパイル

バージョン8(後で7.3にバックポート)の時点で、GCCはretpolineのサポート [0] を追加しました。私はそれが意図されていることを理解しながら[必要な引用] Spectreのカーネルパッチで使用する場合(例: [1][2] )。これにより、通常の開発者がこれらのフラグを使用できなくなることはありません。

そのため、retpolineのフラグ(-mindirect-branch-mfunction-return、および関連)を使用する必要がありますか?

たとえば、C [3] で暗号的に安全なパスワード生成プログラムを作成しました。 -mindirect-branch=thunk -mfunction-return=thunkを使用してコンパイルすると、結果のバイナリはこれらのフラグを使用しない場合とは異なります。おそらく呼び出しとジャンプの間の切り替えと、サンクの戻りからです。これを行う理由、またはセキュリティの観点からの利点はありますか?

3
esote

これを行うことには利点があります。これらのオプションにより、retpolineはSpectre V2を軽減できました。これは、変動するパフォーマンスへの影響が問題にならない機密データや機密データを処理するプログラムでは重要です。リターントランポリンがコードに追加されているため、バイナリは異なります。

2番目のフラグ-mfunction-returnは、Skylake +プロセッサで必要です。これらのプロセッサは、分岐予測バッファ(BTB)に対する攻撃に対してさらに脆弱であり、リターン予測がフォールバックとして使用される可能性があります。

3
forest