*

MeltdownとSpectre、Intel製CPUの脆弱性の疑問点を調べてみた

  最終更新日:2018/01/14

MeltdownとSpectre

MeltdownとSpectre

 2018年1月、Intel製CPUにハードウェア設計上の脆弱性がある事が報道されました。この修正によりCPU性能が大幅に低下する事が問題点として挙げられています。

 個人的にこの脆弱性について疑問点があったので調べてみました。

スポンサーリンク

報道の震源地はどこ?

 日本でCPUの脆弱性について報道されたのは、1月4日のことです。

 最初にこの件を報じたのは、英国の”The Register”と言う技術系のニュースサイトでした。投稿日時は現地時間の1月2日19時29分(日本時間:1月3日3時29分)です。Intel製CPUにハードウェ設計上の欠陥が見つかり、OS側の修正により5~30%も処理性能が低下すると言う内容でした。

 後にMeltdown(メルトダウン)、Spectre(スペクター)と呼ばれる事になる脆弱性は、この記事の投稿時点では名前が付いていませんでした。

 The Registerの記事では、Python関連のブログ記事の内容を引用しています。

 このブログ記事がTwitterなどで話題になり、The Registerが独自調査してまとめた様に見えます。従って、ブログ記事が第1震源地、The Registerが第2震源地と言えるかもしれません。

 その後、米国でもTechCrunchなどの技術系ニュースサイトがThe Registerの記事を引用する形で報じ、その他の多くのニュースサイトでも報じ始めました。

 騒ぎが大きくなったため、Intelも慌てて声明を発表します(米国:1月3日20時頃、日本時間では1月4日5時頃)。この声明の内容は、「報じられている脆弱性はIntelだけでなくAMDやARMにも影響する」、「複数企業と共同で脆弱性解消の対応をして行くから安心して」、「Intelの製品は最も安全で最良のセキュリティを提供できます」と言うものです。

 最後の声明内容は悪い冗談にしか聞こえません。また、AMDやARMもIntelと同程度の問題を抱えているかの様に書いていますが、AMDとARMの問題はそれ程大きくありません(後述)。

 その後もIntelは「この脆弱性の修正による性能低下はほとんど無い」と言うだけで、自社に対する非難を抑えようと躍起になっているように見えます。既に米国ではIntelに対する集団訴訟も始まっており、沈静化するにはかなり時間がかかりそうです。

脆弱性の内容

 今回の脆弱性の内容について説明します。

 今回見つかった脆弱性は2種類あります。Meltdown(メルトダウン)とSpectre(スペクター)の2つです。

Meltdown(メルトダウン)

 Meltdownは、Intelの少なくとも過去5年以内に発売された全CPUとARMの一部のCPUが対象のハードウェア設計上の脆弱性です。

 Intelは脆弱性の対象となるCPUをいまだ詳細に明かしていませんが、投機的実行が導入されたPentium Pro以降の全CPU(Itanium、Atom除く)ではないかと言われています。Pentium Proが発売されたのは1995年なので、実に20年以上に渡るCPUが影響を受けることになります(上の文章で少なくとも5年以内と書いたのは、Intelが修正パッチを提供予定のCPUが5年以内対象のため)。

 ARMの対象となっているCPUは、まだ発表段階で搭載された製品が存在しないので実質影響はありません。そのため、MeltdownはほぼIntel限定の脆弱性と言えます。

 この脆弱性は、投機的実行と呼ばれる計算処理に関する不具合です。投機の言葉から分かる通り、将来的な利益を得るための処理です。命令を予測して実行しておくことで処理を高速化するのです(つまり高速化が利益)。また、投機なので予測が失敗することもあり、その場合は予測の実行結果を破棄します。

 この投機的実行において、特権階級のプロセスからしか参照できないメモリ領域が、ユーザーレベルのプロセスからも参照できてしまったと言うのがMeltdownです(OSの知識に明るい方は特権階級=カーネルと読み替えて下さい)。

 かなり大雑把に説明すると以下の様な事が起こっています。

  1. ユーザープロセスから特権階級プロセスしか参照できないアドレス空間にアクセスする
  2. 投機的実行によりキャッシュメモリにアクセス結果が保持される
  3. 権限違反で投機的実行結果を破棄
  4. 3.で破棄される前にユーザープロセスから該当のキャッシュメモリのアドレスを推測して読む

 権限チェックをすり抜けて不正アクセスに成功する訳です。

 この脆弱性の修正方法は、特権階級プロセスが使用するアドレス空間の配置をランダム化することにより、ユーザープロセスから投機的実行結果の格納場所を推測しにくくします。

 また、特権階級とユーザープロセスの使用するアドレス空間を完全に分離することにより、Meltdownを防ぐことが出来ます。しかし、特権階級とユーザープロセスの切り替えが頻繁に発生する処理では問題があり、処理性能が従来より落ちます。

 一般ユーザーがこの脆弱性を修正するには、OSの更新が必要になります。

Spectre(スペクター)

 Spectreは、投機的実行の分岐予測に関するハードウェア設計上の脆弱性です。Intel、AMD、ARMのCPUが影響を受けます。

 幸いなことに、この脆弱性のソフトウェア側の修正による性能低下はほぼありません。ただし、完璧な対応をするためには、CPUのマイクロコードの更新が必要になるため、ユーザーが修正対応するのは手間がかかります(一般的にはマザーボードのBIOS(UEFI)の形で提供)。

 この脆弱性は以下の2つの脆弱性を含んでいます。

  • Variant 1:境界チェックの回避
  • Variant 2:分岐ターゲットインジェクション

 どちらの脆弱性も投機的実行の分岐予測に関係しています。なお、Variantとは、特定の環境や技術に依存していることを意味する脆弱性の属性のことです。CWE(Common Weakness Enumeration:世界共通の脆弱性一覧)で決められたものです。

 ちなみに、先に説明してしまいましたが、MeltdownはVariant 3になります。

Variant 1:境界チェックの回避

 Variant 1は説明が難しいので、最初に例え話で説明します。

 例えば、バケツに水が入っていなかったら、コップに水を汲んでバケツに移し替える処理があったとします。

 投機的実行では、バケツに水が入っているか確認する前にコップに水を汲んでおきます。ユーザーが歩いてバケツの前に行くとすると、その待ち時間がもったいない訳です。また、実行順序を無視してあらかじめ準備しておく事で時間短縮できます。バケツに水が入っていなければすぐにコップから注げば良いですし、バケツに水がはいっていたらコップの水を捨ててしまいます。

 この例え話における脆弱性は、バケツに水が入っていてもコップの水をかすめ取ってしまうものです。破棄する前に取ってしまうのです。

 実際のVariant 1は、投機的実行の分岐予測において、特権階級しかアクセスできないアドレスからデータを読み出すと言うものです。データの破棄を遅らせるなどひと工夫必要になるため、Variant 1単独でデータを読み出すのは実際には難しいようです。

 ここまでの説明で、MeltdownとVariant 1が同じ脆弱性ではないのかと疑問に思われた人もいるかもしれません。Variant 1は条件判定を利用したものであり、Meltdownは権限チェックのすり抜けを利用するなどの点が異なります。

 Variant 1は投機的実行が可能な全てのCPUに影響する脆弱性です。OSとアプリケーションの修正が必要になります。特にWebブラウザでの悪用が懸念されるため、Webブラウザを常に最新版にしておきましょう。

Variant 2:分岐ターゲットインジェクション

 Variant 2はVariant 1よりも更に難しいので、簡単に説明します。実は私も大雑把にしか理解していません。

 この脆弱性は投機的実行の分岐予測を操作するものです。分岐予測に不正な命令を注入(インジェクション)することで、悪意のある処理を実行させます。

 脆弱性を発見したチームの報告によると、Haswell世代のXeonで99%の確率で再現に成功したとの事です。ただし、かなり限定的な条件下での再現なので、通常のPC環境での悪用は難しいと思われます。

 この脆弱性の修正にはCPUのマイクロコードの更新が必要になります。実際にVariant 2の再現に成功したのはIntelのCPUだけのようですが、再現の可能性は極めて低いとしながらAMDも修正用のマイクロコードの配布を開始しました。

 なお、Microsoftの報告によると、このVariant 2の修正対策が一番性能低下を起こすようです。

脆弱性まとめ

 ここまでの脆弱性の説明を表にまとめます。

名前 属性 脆弱性の内容 対象CPU 修正方法
Spectre
(スペクター)
Variant 1 分岐予測の副作用の悪用 Intel、AMD、ARM OS、Webブラウザの更新
Variant 2 分岐予測の不正操作 Intel、AMD、ARM BIOS(UEFI)更新
Meltdown
(メルトダウン)
Variant 3 権限チェックすり抜けによる
不正アクセス
Intel、ARM OS更新

 修正対応としてOSとWebブラウザの更新は必須ですが、BIOS更新は記事投稿時点ではまだ始まっていないため、今後も注意が必要です。

 スマートフォンに関しては、この脆弱性を利用した攻撃を受ける可能性は低いと見られています。ただし、将来的には不明なため、AppleとGoogleの端末では修正用ファームウェアの提供が始まっています。その他のAndroid端末については、各メーカーの今後の努力に期待する他ありません。

MeltdownとSpectreの命名理由とロゴ

 SpectreとMeltdownの命名理由とそれぞれロゴが作られている理由が気になったので調べてみました。ロゴは記事冒頭の画像です。

 この章の内容は、以下の記事の内容に基いています。

Meltdownの命名理由

 Meltdownは情報科学の研究者であるダニエル・グラス氏によって命名されました。

 Meltdownは権限チェックのすり抜けを利用した不正アクセスを可能にする脆弱性です。本来OS側からしかアクセスできないアドレスから、動作中のプログラムが自由に盗み見ている状態です。

 つまり、プログラムとOSの本来あるべき境界が消えている訳です。これは原子炉のメルトダウン(炉心融解)のようにコンピューターに甚大な被害をもたらします。また、脆弱性を世間に公開することで、集団的な崩壊をもたらす意味でも妥当な名前と言えます(実際にそうなりましたし……)。

Spectreの命名理由

 Spectreはこの脆弱性を発見した研究チームによって命名されました。

 Spectreは投機的実行(speculative execution)が原因の脆弱性です。命名理由は、”speculative”と”spectre”のつづりが似ている点、投機的実行が通常のプログラムからはほとんど見えない、幽霊(spectre)のような点から付けられています。

MeltdownとSpectreのロゴ

 MeltdownとSpectreのロゴは、イラストレーター、デザイナー、アーティストでもあるNatascha Eibl氏によって描かれました。2つの脆弱性を発見したチームによって依頼されたようです。

Meltdownのロゴ

Meltdownのロゴ

 Meltdownのロゴは、壁やバリア(障壁)、入り口のサイン、安全なものが溶けているアイディアが元になっています。最終的にはおそらく盾(?)が溶けているデザインになったようです。

Spectreのロゴ

Spectreのロゴ

 Spectreのロゴは、Spectreが文字通り幽霊を意味する言葉なので、幽霊がデザインされています。また、枝を持っている理由は、投機的実行の分岐予測(branch prediction)の”branch=枝”から来ているものと思われます。

 ロゴが作られた理由は良く分からなかったのですが、おそらく脆弱性のイメージを伝えやすくする事が一番の目的だと思われます。

Heartbleedのロゴ

Heartbleedのロゴ

 見つかった脆弱性全てにロゴを作らなければいけないと言う取り決めは無いようですが、脅威レベルの高い脆弱性では過去にも作られています。代表的なものは、2014年4月に見つかったOpenSSLの脆弱性、Heartbleed(ハートブリード)です。

 基本的に脆弱性を発見した企業や研究者がロゴを作り、著作権フリーで公開されます。MeltdownとSpectreのロゴもこちらのぺージで公開されています。

Intelの対応に問題はないのか?

 MeltdownとSpectreが複数の研究者によって見つけられたのは2017年7月の事です。実際に世間が認識したのは2018年1月3日です。

 Intelが公表する前に報道によって発覚した訳ですが、2017年末にLinuxカーネルの修正パッチが公開された事により、疑いの目を向けられていたようです。そのため、遅かれ早かれ発覚するのは時間の問題でした。

 脅威レベルの高い脆弱性がすぐに周知されない理由は、修正対策に時間的猶予を与えるためです。今回は影響範囲が広範囲に渡るため、半年も要したとも言えます。問題発覚から比較的速やかに各企業から修正パッチがリリースされたのは、その準備の賜物(たまもの)とも言えます。

 しかし、当事者のIntelが本来真っ先に公表して然るべきだったのも事実で、その点は明らかにIntelの不手際と言えます。

 問題発覚後のIntelの声明にも問題があります。記事冒頭でも触れましたが、自社に対する非難を抑える事を目的とした内容だからです。

 1月10日にIntelが報告した内容にも疑問があります。

 上記のIntelの報告内容は、修正パッチを当てた後のベンチマーク結果の報告です。Skylake世代以降のCore iシリーズのベンチマーク結果から、修正による性能低下はほとんど無かったと言う内容です。

 しかし、Microsoftの報告でSkylakeよりも古いHaswell世代以前では修正による性能低下が大きいことが知られています(上記PC Watch記事参照)。Intelはベンチマーク結果をまとめるならHaswell世代以前も含めて報告すべきでした。どう考えても、問題に正面から向き合わず、避けようとしているようにしか見えません。

 そもそも、今に至るまでMeltdownの影響を受けるCPUの範囲をIntelは明らかにしていません。

 他にも問題があります。脆弱性をIntelが知っていたのは2017年7月にも関わらず、Coffee Lake世代のCPUの販売を開始したのは2017年10月です。

 また、IntelのCEOは同10月以降に自社株を大量に売却している事も明らかになっています。株売却は予定通り実行されたものと説明していますが、確実に疑われるタイミングで実行しているため印象は最悪です。予定にあったから、それを利用して早めに売却したように見えます。

 企業姿勢として、今回の脆弱性発覚前後のIntelの対応には疑問を抱かざるをえません。

 少なくとも私が次にPCを自作する時は「絶対に」IntelのCPUは購入しません。