【レポート】

Hyper-Threadingの脆弱性 - そのメカニズムとは?

1 リソースをスレッド/プロセスで共有するHyper-Threading

    米田聡  [2005/05/17]

    FreeBSDのカンファレンスBSDCan(2005年5月13日、日本時間14日に米オタワで開催)でColin Precival氏が発表した論文(CACHE MISSING FOR FUN AND PROFIT)は、Hyper-Threadingに脆弱性があり、実際に脆弱性を使った攻撃が可能であることを示した。PCユーザーへの影響はほとんど考えられないが、Hyper-Threadingのメカニズムそのものに絡む脆弱性だけに、そのメカニズムは興味深いものだ。どのような方法でHyper-Threadingに対する攻撃が可能なのか、論文の内容を検討してみたい。

    リソースをスレッド/プロセスで共有するHyper-Threading

    Hyper-Threadingの脆弱性は、Hyper-Threadingの仕組みそのものに大きく関係している。そのため多くの読者には復習気味にはなるだろうが、もういちどHyper-Threadingとは何だったのかを、簡単におさらいしておくことにしよう。

    現在のCPUは内部に複数の実効ユニットを持ち、命令をOut-of-order(適当に並び替えて)で実行する構造を採用している。Pentium系CPUはx86命令をμOPSと呼ばれる縮小命令に変換、内部の複数の実行ユニットを効率よく動作させる順番に並び替え、命令を実行ユニットに送り込んでいる。

    原理的には実行ユニットの数だけ、複数のμOPSが同時に実行できるはずだが、実際はそう簡単ではない。たとえば、x86命令並びに依存性がある場合、μOPSの実行順序を大きく変えることができず、実行ユニットのいくつかを遊ばせざるを得ない状況になる。

    実際、CPU内部の実行ユニットは多くの時間、半分程度が遊んだ状態(動作していない状態)になっている。複数の実行ユニットがあるおかげで理論的なピーク性能は高いが、現実の性能は理論値に遠く及ばない、というわけだ。

    実行ユニットを遊ばせるのは効率が悪い。そこで「1つのCPUを擬似的にデュアルプロセッサに見せかけてしまおう」というのがHyper-Threadingの基本的なアイデアだ。

    デュアルプロセッサでは、各プロセッサにプロセスやスレッドが割り当てられるため、2つのプロセス/スレッドが同時に実行できる。Hyper-Threadingでは、1つのCPUを擬似的にデュアルプロセッサに見せかけることで(CPUは1つしかないが)同時に2つのプロセス/スレッドを実行できるようにする。

    CPUは2つのプロセス/スレッドの命令をメモリから取り込むことになるが、異なるプロセス/スレッドには命令の実行順に関する依存性がない。したがって、複数の命令実行ユニットに効率よく命令を流し込むことができ「遊んでいる実行ユニットを大幅に減らす」ことができる。Hyper-Threadingの利点はここだ。

    なお、プロセスはOSが起動するソフトウェアの実行単位、スレッドはソフトウェア内部から起動されるソフトウェアの一部の実行単位だが、OSはプロセス/スレッドを区別せずにCPUの実行を割り当てている。したがって、CPUから見ればプロセスやスレッドには区別がない、ということを覚えておいて欲しい。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン