Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2018-01-17

投機的実行とアクセラレーション・ブーストについて 09:26 Add Star

グーグルのリリースによると、「性能を向上させるために、ほとんどの現代的なCPUに使われている『投機的実行(speculative execution)』という手法に重大なセキュリティ上の欠陥がある」のが問題だという。

投機的実行とは、CPUが全体としての情報処理速度をあげるために使う手法である。特定の情報処理を、実際に使う段階になって行うのではなく、使うか使わないかまだわからないが、使う可能性が出てきた段階であらかじめ処理しておき、必要になってから実行することに伴う遅延を防ぐのだ。

やや専門的になるが、投機的実行をする際には、本来メモリに厳重に保管してある重要な情報を取り出して、ハードディスク上などに設けた「仮想メモリ」に持ち込み、そこで「アクセラレーション・ブースト」と呼ばれる処理速度の加速をかける。たとえるなら、監視・警戒が厳重な金庫室から、共同作業部屋に大切な機密ファイルを持ち出して作業をするようなものだ。


米グーグルのハッカー集団を震撼させた「インテル問題」の深刻度(町田 徹) | 現代ビジネス | 講談社(2/3)

http://gendai.ismedia.jp/articles/-/54143?page=2


 まあこの説明がデタラメ過ぎて笑うわけだが、ソーカル事件を振り返るまでもなく、人文系の人が唐突に専門的な話をしようとすると自分自身も混乱しているのでデタラメな内容になってしまって恥ずかしいから気をつけよう。


 よくわからない人のために、果物屋さんにバナナかりんごを買いに行く太郎くんの例で最後のパラグラフと同じ内容を書いてみよう。


やや専門的になるが、太郎くんがバナナかリンゴを買いに行く際には、本来、果物屋の倉庫に厳重に保管してあるバナナを取り出して、店頭上などに設けた「仮想メモリ」に持ち込み、そこで「アクセラレーション・ブースト」と呼ばれる購入速度の加速をかける。たとえるなら、監視・警戒が厳重な金庫室から、共同作業部屋に大切な機密ファイルを持ち出して作業をするようなものだ。


 だめだ。支離滅裂だ。

 ちなみに太郎がバナナを買いに行くことを「投機的実行」するというのはどういうことか。

 この場合、投機的な実行をするCPU役は果物屋ということにしよう。

 まず、投機的でない実行を見てみよう。

1.太郎が「いまから買いに行きます」と果物屋さんに電話をかける

2.太郎が店頭に来る

3.太郎がバナナを注文する

4.果物屋が倉庫に行く

5.バナナを探す

6.倉庫から店にもどる

7.代金と引き換えに、太郎にバナナを渡す


 まあ普通である。

 電話をしたにも関わらず、何を買うかいわない太郎と、電話を受けたにも関わらず注文を聞かない果物屋にイライラするかもしれないが、これは例え話なので目をつむっていただきたい。


 問題は「倉庫」を行ったり来たりするのがかなり面倒であるということ。コンピュータでいえば、これは命令をメモリから読み出したりすることを意味する。


 一般的にCPUに比べるとメモリは信じられないくらい遅い。アリとピューマくらい遅い。最近のプログラムの高速化というのは要はめちゃくちゃ遅いメモリとそこそこ速いメモリをどう管理するかということに尽きる。


 そこで、メモリ読み出し(倉庫への往復)を短縮するために太郎が来るとわかった時点で必要そうなものは全部持ってくる。これが投機的実行である。


 投機的実行をする果物屋の行動パターンは以下のようになる。

1.太郎が「いまから買いに行きます」と果物屋さんに電話をかける

2.果物屋さんは太郎が来る前に倉庫に行き、バナナを店頭に持ってくる(投機的実行)

3.太郎が店頭で「バナナ」を買う


 ただし、太郎が気まぐれで「やっぱり今日はリンゴがいいな」と思ったら、手間は余計にかかることになる


1.太郎が「いまから買いに行きます」と果物屋さんに電話をかける

2.果物屋さんは太郎が来る前に倉庫に行き、バナナを店頭に持ってくる(投機的実行)

3.太郎が店頭で「リンゴ」を注文する

4.果物屋が倉庫に行く

5.リンゴを探す

6.倉庫から店にもどる

7.代金と引き換えに、太郎にリンゴを渡す


 投機的実行というからには失敗もある。もちろんこの精度を上げるような工夫はされている。実際、プログラムを実行する場合は高い確率で次になにが選ばれるのか(バナナかリンゴか)は決まってるし、仮に失敗したとしても時間のロスは少ない。


 町田徹という人の記事で、なぜか唐突に「ハードディスク」が出てくるのは、仮想メモリという言葉とこんがらがってしまっているのだろう。


 今回の脆弱性は、仮想記憶に関するもの(Intelに固有)と、投機的実行に関するものの2つがある。ワケて考えないといけないのだが、冒頭の記事ではこんがらがって説明しているのでなにがなんだかわからない。


 Virtual memory=仮想記憶という誤訳は日本IBMがしたものだが、もはや一般に広まってしまっているのでここではそのまま使うとする。


 一般に仮想記憶はCPU(より正確にはCPUに内蔵されたMMU;Memory Management Unit)で実現される機能だが、投機的実行とは何の関係もない。町田さんとやらが想像力を働かせて聞きかじりの言葉を使ってしまったんだろう。


 仮想記憶はコンピュータのヒープメモリ(RAMとも呼ばれる)が一杯になったときに、ヒープの一部をハードディスクに退避し、物理的には存在しないヒープを実質的に(本来のvirtualはこの意味)拡張するという機構だ。


 仮想記憶の実現には、芸術的と言っても良いCPUアーキテクチャの貢献がある。仮想記憶システムが実現するもう一つの重要な機能が、「特権管理」である。


 特権管理とは、メモリの特定の領域を特別なプログラムしかアクセスできないようにする機構で、ウィルスなどに対抗する際に非常に重要だった。通常、アプリケーションはOSの使うメモリ領域にアクセスすることができない。そのように特権が管理されているからだ。OSのメモリにアクセスできてしまうと、基本的にはウィルスはなんでもできてしまう。知らないうちにOSが書き換えられていることさえもある。


 今回の仮想記憶の脆弱性はこの特権管理を回避できてしまうという、かなり深刻なものだ。これはパッチである程度回避できると言われている。


 もうひとつの、投機的実行の脆弱性というのは、たとえば果物屋の客が太郎だけなら良かったのだが、果物屋の客は太郎だけというわけにはいかない。もう一人の客、花子が悪意を持っていたらヤバイ、という話である。


 太郎は自分がバナナを買うかリンゴを買うかを知られたくない。しかし、果物屋が店頭に持ってきてしまうと、花子に盗まれる危険性がある。


1.太郎が「いまから買いに行きます」と果物屋さんに電話をかける

2.果物屋さんは太郎が来る前に倉庫に行き、バナナを店頭に持ってくる(投機的実行)

3.太郎が店頭で「リンゴ」を注文する

4.果物屋が倉庫に行く

5.リンゴを探す

6.倉庫から店にもどる

7.代金と引き換えに、太郎にバナナを渡す

8.花子は店頭に置かれたバナナを盗む


 ここではバナナ、リンゴがデータである。本来、コンピュータのプログラムというのはプロセス(たとえば花子と太郎)ごとにまったく別のプライベートなデータ管理をする必要がある。


 しかし今のコンピュータは複数のプロセス(アプリと理解してもいい)が同時に動くのがあたりまえで、データセンターなどでは複数の人が一つのCPUを共有していることすらあり得る。


 つまり、簡単にいえば、怪しいアプリを実行していると、同時に実行している他のアプリに隠してある情報を盗まれる危険性があるということだ。


 投機的実行がはあらゆるCPUに使われているので、ここのところの抜本的な対策がとられないと非常に困る。

 それで世界中大騒ぎになっているというわけである。


 たとえばLINEの会話やメールの内容などが盗まれる可能性がある。しかもこれはMacやPCに搭載されているIntelのCPUだけではなく、AndroidiPhoneで使われているARMにも影響があると言われている。まさにセンテンス・スプリング。この場合、できるだけ怪しいアプリは使わないようにすること、くらいしか対策がない。


 ただ、iPhoneやAndroidのCPUで仮にこの脆弱性を突いたとしてもいますぐどうこうという話にはならない。それなりに難しい話であり、よほどのモチベーションがなければこうした脆弱性を利用した悪意あるソフトを作ることは難しいのではないかと思う。まあ世界中の情報機関が喜々として作ってそうではあるが。


 ちなみに謎の必殺技「アクセラレーション・ブースト」については謎のままである。日本語に訳すと「加速ブースト」。まるで「マッシュルームキノコ」のような不思議な味わいのあるパワーワードだ。


 もっと細かいことが知りたい人はここ


http://milestone-of-se.nesuke.com/nw-advanced/nw-security/meltdown-spectre/

CPUの脆弱性[Spectre], [Meltdown] は具体的にどのような仕組みで攻撃する?影響範囲は? | SEの道標