1 月にインテルのソフトウェア ガード拡張機能の入出力保護における潜在的な欠陥を指摘するのに貢献した研究者が、今度は保護された SGX エンクレーブ内で実行されるマルウェアについて報告しています。
オーストリアのグラーツ工科大学のサミュエル・ワイザー氏と4人の協力者は、システムを保護するのではなく、概念実証ではSGXを使用してマルウェアを隠蔽し、5分以内に同じシステムで実行されているSGXエンクレーブからRSAキーを入手できると書いている。
SGXは、このような事態を明確に防ぐために設計されています。SGXは、たとえ特権ユーザーが悪意を持っていたとしても、コードとデータの両方を不正アクセスから保護するための分離メカニズムです。
ワイザー氏と彼のチームは「Prime+Probe」と呼ぶサイドチャネル攻撃を考案し、ネイティブのIntel環境でもDockerコンテナ全体でも機能すると述べている。
この PoC は、複雑な 3 段階のプロセスで他人のエンクレーブ内の RSA キーを回復するように特別に設計されています。まず、被害者のキャッシュ セットの場所を検出します。次に、被害者が RSA 署名の計算をトリガーしたときのキャッシュ セットを監視します。最後に、キーを抽出します。
論文では次のように述べられている。
Intel CPU向けに現在知られている中で最も高精度なタイミング測定技術を、ハードウェアに完全に適合させて開発しました。DRAMとキャッシュのサイドチャネルを組み合わせることで、ページサイズを仮定することなく物理アドレスビットを復元する新たなアプローチを構築しました。OpenVPNなどで使用されているmbedTLSのRSA実装を攻撃しました。定数時間乗算プリミティブを用いたサイドチャネル攻撃対策が施されているにもかかわらず、攻撃は成功しました。4096ビットのRSA秘密鍵の96%を単一のPrime+Probeトレースから抽出し、わずか5分以内に11トレースから完全な鍵復元を達成しました。
Docker エンジンは両方のコンテナに対して同じ SGX ドライバーを呼び出すため、この攻撃は異なる Docker コンテナ間でも機能します。
Dockerコンテナは同じSGXドライバーを共有する
タイミング:暗号サイドチャネル攻撃には高精度タイマーが必要ですが、SGXではこれは禁止されています。ワイザー氏と共同研究者はIntelの仕様を精査し、レジスタをオペランドとして実行した場合のレイテンシが1サイクル、スループットが1命令あたり0.25サイクルである命令と、inc
以下のadd
命令を採用しました。
禁止タイマーをエミュレートするために、研究者らは次の x86 命令を使用しました。
mov &counter , %rcx 1: %rax を増分 mov %rax , (%rex) ジャンプポンド
「エビクションセット」生成:このステップは、「同じキャッシュセットにマッピングされる」仮想アドレスを検出するように設計されています。行の競合を引き起こす物理的に近接したアドレスペアをメモリ内で順次スキャンします。SGXエンクレーブメモリは連続的に割り当てられているため、このスキャンを仮想アドレスに対して実行できます。
これら 2 つのステップが完了すると、Weiserらは、 RSA キー計算の特徴的な署名を探しながら、脆弱なキャッシュ セットを監視する方法を考案しました。
攻撃のこの部分はオフラインで、つまり、データを収集するキャッシュ監視とは別に実行する必要があります。なぜなら、タイミング エラー、コンテキスト切り替え、被害者のエンクレーブでの RSA キー以外のアクティビティ、電源管理による CPU タイミングの変更などにより、大量のノイズが含まれたデータが大量に生成されることになるからです。
鍵の復元は3つのステップで行われます。まず、トレースを前処理します。次に、各トレースから部分鍵を抽出します。最後に、部分鍵を結合して秘密鍵を復元します。
Ubuntu 16.10 を実行している SGX 対応の Lenovo ThinkPad T460s では、次のことが分かりました。
- 340 回の試行で、マルウェアは利用可能な 2048 個のキャッシュ セットから脆弱なキャッシュ セットを見つけることができました。
- 脆弱なキャッシュ セットからのトレースのキャプチャには平均 72 秒かかりました。
- 1 つのキャッシュ トレースで 4096 ビットの RSA キーの 96 パーセントにアクセスでき、11 のトレースで完全な RSA キーが利用可能になります。
研究者らは、攻撃はブロックできるが、オペレーティング システムの変更によって SGX モデルが弱体化するリスクがあるため、修正はインテルが行う必要があると述べている。®