Variant1（CVE-2017-5753） ：配列の境界チェックバイパス

：配列の境界チェックバイパス Variant2（CVE-2017-5715） ：分岐ターゲットインジェクション

：分岐ターゲットインジェクション Variant3（CVE-2017-5754）：不正なデータキャッシュ読み込み

Microsoft「Internet Explorer 11」

Microsoft「Edge」

Mozilla「Firefox」

Google「Chrome」

Apple「Safari」

自分のWindows搭載PCで脆弱性対策が完了済みか否かを調べてみよう

Microsoft Support以下に，当該記事がある

コマンドプロンプトを管理者で実行する

C:\WINDOWS\system32>cd c:\check［Enter］

c:\check>check［Enter］

ここまでの入力例

こんな感じで結果が出る

Speculation control settings for CVE-2017-5715 [branch target injection]



Hardware support for branch target injection mitigation is present: True（1）

Windows OS support for branch target injection mitigation is present: True（2）

Windows OS support for branch target injection mitigation is enabled: True（3）



Speculation control settings for CVE-2017-5754 [rogue data cache load]



Hardware requires kernel VA shadowing: True（4）

Windows OS support for kernel VA shadow is present: True（5）

Windows OS support for kernel VA shadow is enabled: True（6）

Windows OS support for PCID performance optimization is enabled: True [not required for security]（7）





BTIHardwarePresent : True

BTIWindowsSupportPresent : True

BTIWindowsSupportEnabled : True

BTIDisabledBySystemPolicy : False

BTIDisabledByNoHardwareSupport : False

KVAShadowRequired : True

KVAShadowWindowsSupportPresent : True

KVAShadowWindowsSupportEnabled : True

KVAShadowPcidEnabled : True（7）

こちらは手元のRyzen 7 1700搭載機でテストした結果。軒並みFalseとなるが，これで正常である

脆弱性対策による性能への影響は

Variant1およびVariant3対策による性能への影響は最小限

Variant2対策は性能に大して有意に負の影響がある

Skylakeマイクロアーキテクチャ以降のCPUと，Windows 10の組み合わせならば，脆弱性対策が性能に与える影響はミリ秒単位でしかない Haswellマイクロアーキテクチャまたはそれ以前のCPUとWindows 10の組み合わせでは，脆弱性対策により，「一部のベンチマーク」で大幅なスコアの低下が見られる。一部のユーザーはシステムの性能低下を体感することが予想される Haswellマイクロアーキテクチャまたはそれ以前のCPUとWindows 7＆8.1の組み合わせにおける性能低下は大きく，ほとんどのユーザーがシステムの性能低下を体感するだろう Windows Serverでは，CPUを問わずI/O集約型（IO-intensive）のソフトウェアにおいて性能低下が顕著に見られる

Variant1対策

Variant2対策

Indirect Branch Restricted Speculation（IBRS）：間接ジャンプにおける分岐予測を抑制する

Single Thread Indirect Branch Predictors（STIBP）：Hyper-Threadingにおいて論理CPU間の分岐予測の制御を防ぐ

Indirect Branch Predictor Barrier（IBPB）：コードの挙動によって間接分岐の予測が制御されることを防ぐ

Variant3対策

Ivy Bridge-E世代のCPUを搭載する環境でテストを実行した結果。Windows OS support for PCID performance optimization is enabledとKVAShadowPcidEnabledは見事にFalse

Intel製CPU搭載環境では性能低下を免れ得ない

北米時間2018年1月3日にGoogleのセキュリティ研究チーム「Project Zero」が 発表した CPUの脆弱性について，4Gamerでは先に，脆弱性の概要と，ゲーマーはどうすべきかといった点をまとめている（ 関連記事 ）。あれからまだ数日しか経過していないが，関連各社の対応は迅速で，本稿を執筆している1月10日の時点でほぼ出揃った。また，ゲーマーなら気になるであろう「性能への影響」についても，各社から公式コメントが出つつある状況だ。今回は，4Gamer読者の中でもとくにユーザー数が多いと思われるWindows側の対応を中心に，ここまでの動きをまとめてみよう。 1月5日掲載の記事 を簡単に振り返っておくと，Project Zeroが公表した脆弱性には下の3つがあった。それぞれの概要は先の記事を参照してもらうとして，Variant1と2には「」（スペクター），Variant3には「」（メルトダウン）という識別名が与えられている。Variant1とVariant2を組み合わせて使う，つまりSpectreを使うと，JavaScriptからWebブラウザを経由して，重要な情報を盗み出すことができてしまう。つまり，Webブラウザを通じた攻撃が可能であって，その点においてSpectreの脅威度はかなり高い。また，Variant3は，本来ならユーザー権限ではアクセスできない「カーネルメモリ領域」のデータを読み出すことができるため，Meltdownの脅威度も高い。ただ，Meltdown“だけ”を使って攻撃を行うのは，Spectreと比べるとやや難しいはずだ。SpectreにおいてはWebブラウザ経由の攻撃がもっとも懸念されるため，Webブラウザレベルでの対応が進んでいる。本稿を執筆している時点で，といった主要なWebブラウザと，HTMLレンダリングエンジン「WebKit」が対応完了済みだ。少なくとも今からであれば，最新版へアップデートすることで，WebブラウザレベルでのSpectre対策は行えるだろう。本稿の主役となるWindows OS側は，MicrosoftがSpectreとMeltdown，双方に向けた対策を基本的に終えている。年明けに配信となったWindows Updateを適用してあれば，OSレベルの対応は完了……と言いたいところだが，注意が必要なのは，Variant2へ対策するには，BIOS（UEFI），より厳密に言うとCPUのファームウェアにあたるマイクロコードのアップデートが必要で，それを行って初めてVariant2対策は完了となる。大手メーカー製のゲームPCでは自動でBIOS（UEFI）アップデートまで入る可能性が高いが，中小ブランドやシステムビルダー製PC，自作PCでは，ユーザーが自分でアップデートを行う必要がおそらくあるので，その点は注意が必要だろう。「自分のWindows搭載PCで脆弱性対策が完了しているか否か」が分からないという読者もいると思うが，そんな人のため，Microsoftは調べるための方法を 公開している 「やり方はリンク先のとおりなので，各自やってみましょう」と書くのは簡単だが，さすがにそれでは不親切だと思うので，操作をある程度自動化できるバッチファイルを作ってみた。時間の都合で，Windows 7およびWindows 8.x環境との互換性を確保できなかったため，「Windows 10環境用」とさせてもらえれば幸いだ。さて，利用にあたって，まずは下のボタンを押してzipファイルをダウンロードし，適当なフォルダにzip内の3ファイルを解凍してほしい。以下本稿では，cドライブ直下に「check」フォルダを作り，そこへ展開する前提で話を進める。次に，スタートボタンをクリックして，スタートメニューを開いた状態から「cmd」と入力。「コマンドプロンプト」が出てきたら，右クリック→「管理者として実行」を選ぶ。「ユーザーアカウント制御」が出たら［はい］をクリックすると，「管理者：コマンドプロンプト」のウインドウが開くはずだ。以下，太字部分は実際に入力する文字列，［Enter］［Y］は順に［Enter］キー，［Y］キーの押下を示すが，まず，次のように入力してほしい。1行めは解凍したファイルの在りかを指定し，2行めで実行している。すると実行が始まり，まず「セキュリティ警告」が出るので，［R］［Enter］。しばらく待つと「実行にはNuGetプロバイダーが必要です」と出るので，今度は［Y］［Enter］だ。さらにしばらく待つと「信頼されていないリポジトリ」と出るので，ここでも［Y］［Enter］とキーを叩く。信頼できないなら実行してはならないのだが，今回は4Gamerと筆者を信用してもらえればと考えている。ちなみに，本バッチファイルの初回実行時に表示される「信頼されていないリポジトリ」に関する警告は，ので，バッチファイル固有の問題というわけではない。そうすると，ずらずらと文字が並ぶはずだが，これが脆弱性検査結果となる。ウインドウサイズによっては結果が一部流れてしまうが，スクロールさせれば前に戻れるので安心してほしい。というわけで結果の見方だが，見るべきは「Speculation control settings for CVE-2017-5715 [branch target injection]」以下だ。一例をテキストで示しておこう。まず，「」以下がVariant2への対応状況，「」以下がVariant3への対応状況を示す。（1）のところは，CPUのファームウェア（≒BIOS，UEFI）がアップデートされ，CPUのファームウェアレベルでVariant2対策が終わっていればTrueとなる。ここがFalseの場合は，まだ適切なBIOSアップデートを行えていないか，そもそも対策が不要ということになる。（2）はWindowsにVariant2対策がインストール済みならTrueとなり，（3）はその対策が有効になった状態のWindowsが実行中ならTrueとなる。（1）（2）（3）のすべてがTrueなら，Variant2対策済みというわけだ。なお，Ryzen環境の場合，そもそもVariant2への対応は不要なので，テストを実行するとすべてFalseとなる。Ryzen搭載環境に手動でアップデートを導入するとWindowsが起動しなくなったりするらしいので，決して施さないようにしてほしい。「Ryzen系は対策不要」だ。話を戻すと，（4）は，CPUがVarian3対策を必要とする場合にTrueとなる。ここがFalseの場合は，「対策そのものが不要」であり，（5）〜（7）は無視して構わない。というか，対策不要なCPUに対して無理に対策すれば，副作用が生じてしまう可能性のほうが高いだろう。筆者がテストした限り，Ryzenシリーズは（4）がFalseだった。AMDも「（Intelとは）アーキテクチャが違うため，Variant3の脆弱性を持たない」と断言しているので，RyzenはVariant3（＝Meltdown）とも無縁ということになる。（5）（6）は先ほどの（2）（3）と同じで，Variant3対策がWindowsにインストールされていれば（5）がTrueに，対策が有効な状態でWindowsが実行中なら（6）がTrueになる。（4）がTrueの場合は，（5）（6）の両方がTrueならVariant3対策済みという理解でいい。なお，2つある（7）については後ほど触れたい。Variant1は？ と思うかもしれないが，今回紹介する方法でチェックできるのはVariant2＆3の対策周りだけである。ただ，Variant2と3への対策が済んでいれば（もしくは対策するまでもないなら），Variant1に対しても安全と考えて構わない。というのも，Variant1とVariant2を組み合わせて初めて，Spectreという重大な脆弱性になるためだ。ひととおりの対策を行ったMicrosoftは，北米時間1月9日付けで，「脆弱性対策が性能にどれだけの影響を与えるか」についての説明を， 同社公式blogに掲載した それによると，とのことだ。また，対象となるCPUについては，大まかに次のとおりまとまっている。全体としては，「PCやOSの買い替えを促す」ような内容になっていると言っていい。ごく最近，バッテリーの“へたった”旧型iPhoneにおける意図的な性能低下が大きな話題になったばかりだけに，「これも意図的なものか」と疑う人が出てきそうな内容とも言えるのではなかろうか。ただ，Micorosoftは「どうしてそうなるのか」についても簡単に触れている。まず，Skylakeマイクロアーキテクチャ以降のCPUで性能低下がさほどでもないのは，IntelがSkylake以降に対して，「分岐予測の無効化範囲を間接ジャンプに限定する」という改良を施したことが影響だという。これにより，Variant2対策の影響が軽減したと，Microsoftは説明している。一方，Windows 7やWindows 8.1における性能低下が大きいことについては，これら古い世代のWindowsではフォントのレンダリングにカーネルモードを用いるなど，Windows 10に比べてカーネルモードとユーザーモードの行き来が頻発するためというのがMicrosoft側の説明だ。 先の記事 における内容と照らし合わせると，Windows 7やWindows 8.1における性能低下は，Variant3対策の影響だということが推測できるだろう。本件に関連して，Intelは北米時間1月5日，「脆弱性への対応をまとめた文書」を 公開している （※リンクをクリックするとpdfファイルのダウンロードが始まります）ので，こちらも簡単に紹介しておきたい。Variant1に向けてIntelは「ソフトウェア的な対策」を提案している。具体的には「適切な箇所にLFENCE命令を挿入し，メモリの先読みを抑制する」というものだ。LFENCE命令とは，「当該命令以前の命令実行が終わるまで，その先のメモリを読まない」という命令だ。メモリアクセス順序を制御する命令としてはLEFENCE，SFENCE，MFENCEといった命令があるのだが，これらを適切に挿入することでVariant1は防げるというわけである。この対策を行うためにはソフトウェア開発ツール，具体的にはコンパイラの対応が必要で，Intelはコンパイラベンダーと共同で対応を進めるとしている。前述のとおり，Variant2の対策にはマイクロコードのアップデートが必要だが，Intelは文書の中で，マイクロコードに以下のとおり，3つの対策を施したとしている。この3つがどう異なるのか，Intelは明言を避けているのだが，Microsoftのblogに書かれている内容も踏まえるに，「Skylake以降では，IBRSを使うことで，性能低下を比較的抑えることができている」ということではないかと思う。なお，これら3つのマイクロコードによる対応だけでなく，ソフトウェア的な対策も行っていると，Intelは述べている。いわく，「Return Trampoline」（略してretpoline）という方法を使い，リターンアドレスとして分岐先アドレスをスタックにプッシュし，ret命令で分岐するとのこと。割とトリッキーな，というか笑ってしまうようなやり方である。この方法だと分岐予測は効かない気もするので，性能低下抑制にはなりそうもないが，Intelはコンパイラベンダーと協力してretpolineの実装を進めたいとしている。Variant3に対してIntelは，CPUが持つ「PCID」（Process Context ID）という仕組みを使ってカーネルアドレス空間とユーザーアドレス空間を分離する，「Dual-page-table」アプローチを推奨している。Intelによると，Dual-page-tableを用いれば，性能低下を抑えつつも，Variant3を悪用した攻撃を完全に防げるそうだ。その例として同社は，Linuxカーネルにおける「KAISER」――2018年初頭に「KPTI」（Kernel Page Table Isolation）と改名された――という実装を紹介している。ただ，KPTIによる性能低下を抑えるには，Haswellマイクロアーキテクチャ以降でサポートされたINVPCIDという命令が必要になる。そんなKPTIのWindows版とでも言うべきものが，「Kernel VA Shadowing」（カーネル仮想アドレス隠し）だ。なので筆者は，「前段で（7）としておいた『Windows OS support for PCID performance optimization is enabled』と『KVAShadowPcidEnabled』は，INVPCID命令を使ってKernel VA Shadowingが機能しているときにTrueになるのではないか」と推測している。おそらくIvy Bridge以前のCPUではここがFalseになるだろう。検証していないので断言まではしないが，KVAShadowPcidEnabledがFalseになっているIntel製CPUで，Variant3対策による性能低下はかなり大きくなるのではなかろうか。というわけで，多かれ少なかれ性能低下は免れられないとまとめていいだろう。これから，さまざまなアプリケーションで性能低下の有無が検証されることになると思われるので，ゲーマーとしても，まだしばらくは情報を追っていく必要があるのではなかろうか。一方，Ryzen環境であれば，確認されている脆弱性はVariant 1のみで，かつVariant 1単独では攻撃につながりにくく，ソフトウェア的な対策も進んでいるので，基本的には静観していて大丈夫だ。むしろ，動揺して下手に手動で不要な修正をインストールしたりすると面倒なことになるので，触らぬ神に祟りなしである。