[CODE BLUE 2018] Wake up Neo: 投機的実行による仮想化の検出 イノケンチー セノフスキー [レポート] #codeblue_jp

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

『世界トップクラスのセキュリティ専門家による日本発の情報セキュリティ国際会議』でありますCODE BLUE 2018に参加していますのでレポートします。

このブログは下記セッションについてのレポートです。

Wake up Neo: 投機的実行による仮想化の検出 イノケンチー セノフスキー

カーネルモード、他のプロセス、さらにはハイパーバイザーからの特権データを読み取ることができる、いくつかの投機的実行に関する脆弱性が存在する。しかし、投機的実行が敵対者によって活用される方法はさらにいくつか存在する。 私はそのような手法の一つである、システム上の攻撃者が最新のサンドボックスとアンチウイルスソフトウェアによる検出を回避するための情報を得ることを可能にする手法を発見した。この手法は、Intel CPUにおけるSpectre Variant 3a 脆弱性の発見につながったが、さらにいくつかの方法で使用可能である。 この講演では、投機的実行の脆弱性の背後にある原則を説明し、検出の手法について話す。

レポート

  • spectre variant 3aの発見者
  • 古いIntel 8086からCPUは革新を遂げた
  • 更に性能を上げるために通常使われているのは周波数を上げるかコアを増やして並列性を上げるか
  • 制限としてはメモリアクセスタイムや電力・熱、相対性原理がある
  • カバーする手法
    • キャッシュ
      • L1,L2,L3とある
      • L1,L2はコアごと
      • サイズはL3が一番大きい
      • 1byte必要な場合も16byte取るようになる
    • Translation Lookaside Buffers
      • ページングは遅い
    • Hyper-Threading
      • Pentiumとかではインストラクションの順番に従って処理をしていた
      • いくつかのパートに分けて実行する
      • CPUの空きを見て実行する
  • Out-of-Order実行のために投棄実行を決めた
    • 次のジャンプ地点を予測
  • 投機的実行で失敗した場合には準備したデータを破棄することになる
  • Cache side channel
    • Cross-VM Prime + Probe attack on RSA square and multiply
    • 暗号があるところにはセンシティブなキーがある
    • サイドチャネルを行うためにはいくつかの手法がある
      • Flush + Reloadなど
  • Flush + Reload
    • ページの連続したキャッシュから情報を得る
  • Speculative execution + cache side channel
    • 投棄実行を使って情報を送ることができる
  • 全てで投機的実行が可能なのか
    • すべてでは難しい
    • 割り込みなど
  • 何ができるか
    • software breakpoint
    • hardware breakpoint
    • ハードウェブレイクポイントが取れるのは珍しい
  • デモ
    • 簡単なプログラム
    • herringを呼び出す
  • 仮想化について
    • サンドボックスなどセキュリティの要件でも使われる
    • Guest softwareの場合はゲストはVMで有ることを検知しない
    • VM Monitorを通じて監視する
    • VMEXITはゲストから呼ばれる
    • VMMはゲストの状態を知っている
  • 仮想化を検知できる
    • rdtscで検知できる
    • VMEXITで検知する
  • マイクロアーキテクチャの変更の検知
    • CPLが0である必要がある
  • Speculative execution as a detector
  • デモ
    • リアル環境ではほとんどcacheミスがなくVMではほとんどミスしている
    • VMであることを検知できる
  • VMの検知のPoCはGithubで公開している

感想

ここまで短いコードで検知できることに驚きました。

Spectreは様々な亜種が発見されているので、今後も気にしなければならないですね。