ニュース
「CPUの脆弱性」に手元のゲームPCは対策できているのか。Windows環境で簡単にチェックできるツールを作ってみた
あれからまだ数日しか経過していないが,関連各社の対応は迅速で,本稿を執筆している1月10日の時点でほぼ出揃った。また,ゲーマーなら気になるであろう「性能への影響」についても,各社から公式コメントが出つつある状況だ。
今回は,4Gamer読者の中でもとくにユーザー数が多いと思われるWindows側の対応を中心に,ここまでの動きをまとめてみよう。
Variant2の対策にはBIOS(UEFI)のアップデートが必要
1月5日掲載の記事を簡単に振り返っておくと,Project Zeroが公表した脆弱性には下の3つがあった。
- Variant1(CVE-2017-5753):配列の境界チェックバイパス
- Variant2(CVE-2017-5715):分岐ターゲットインジェクション
- Variant3(CVE-2017-5754):不正なデータキャッシュ読み込み
それぞれの概要は先の記事を参照してもらうとして,Variant1と2には「Spectre」(スペクター),Variant3には「Meltdown」(メルトダウン)という識別名が与えられている。
Variant1とVariant2を組み合わせて使う,つまりSpectreを使うと,JavaScriptからWebブラウザを経由して,重要な情報を盗み出すことができてしまう。つまり,Webブラウザを通じた攻撃が可能であって,その点においてSpectreの脅威度はかなり高い。
また,Variant3は,本来ならユーザー権限ではアクセスできない「カーネルメモリ領域」のデータを読み出すことができるため,Meltdownの脅威度も高い。ただ,Meltdown“だけ”を使って攻撃を行うのは,Spectreと比べるとやや難しいはずだ。
SpectreにおいてはWebブラウザ経由の攻撃がもっとも懸念されるため,Webブラウザレベルでの対応が進んでいる。本稿を執筆している時点で,
- Microsoft「Internet Explorer 11」
- Microsoft「Edge」
- Mozilla「Firefox」
- Google「Chrome」
- Apple「Safari」
といった主要な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で脆弱性対策が完了済みか否かを調べてみよう
「自分のWindows搭載PCで脆弱性対策が完了しているか否か」が分からないという読者もいると思うが,そんな人のため,Microsoftは調べるための方法を公開している。
さて,利用にあたって,まずは下のボタンを押してzipファイルをダウンロードし,適当なフォルダにzip内の3ファイルを解凍してほしい。
以下本稿では,cドライブ直下に「check」フォルダを作り,そこへ展開する前提で話を進める。
check.zip(823bytes)を4Gamerからダウンロード
※2018年1月11日10:30頃追記
“怪しげなバッチファイル”の実行に不安がある人もいると思われることから,ソースコードを2pめに掲載しました。ソースをいずれもテキストエディタへ貼り付け,片方を「check.bat」,もう片方を「check.ps1」として保存すれば,ダウンロードしたファイルと同じように機能します。
※2018年1月11日11:25頃追記
Microsoftが公開している方法では,ExecutionPolicyを変数として保存し,処理終了後に戻しています。公開したスクリプトではそれを行っていない点に懸念を抱く人がいるかもしれませんが,本バッチファイルではコマンドプロンプト上のPowerShellコマンド引数でExecutionPolicyを一時的に変更しているだけです。
コマンドプロンプトのコマンド引数で指定されたExecutionPolicyは,そのセッションのみ有効で永続しません。なので,このバッチファイルを実行してもExecutionPolicyが永続的に変更されたりすることはありません。
次に,スタートボタンをクリックして,スタートメニューを開いた状態から「cmd」と入力。「コマンドプロンプト」が出てきたら,右クリック→「管理者として実行」を選ぶ。
「ユーザーアカウント制御」が出たら[はい]をクリックすると,「管理者:コマンドプロンプト」のウインドウが開くはずだ。
以下,太字部分は実際に入力する文字列,[Enter][Y]は順に[Enter]キー,[Y]キーの押下を示すが,まず,次のように入力してほしい。1行めは解凍したファイルの在りかを指定し,2行めで実行している。
C:\WINDOWS\system32>cd c:\check[Enter]
c:\check>check[Enter]
すると実行が始まり,まず「セキュリティ警告」が出るので,[R][Enter]。
しばらく待つと「実行にはNuGetプロバイダーが必要です」と出るので,今度は[Y][Enter]だ。さらにしばらく待つと「信頼されていないリポジトリ」と出るので,ここでも[Y][Enter]とキーを叩く。信頼できないなら実行してはならないのだが,今回は4Gamerと筆者を信用してもらえればと考えている。
ちなみに,本バッチファイルの初回実行時に表示される「信頼されていないリポジトリ」に関する警告は,Microsoftが公開したやり方に従って手動で行っても出てくるので,バッチファイル固有の問題というわけではない。
そうすると,ずらずらと文字が並ぶはずだが,これが脆弱性検査結果となる。
ウインドウサイズによっては結果が一部流れてしまうが,スクロールさせれば前に戻れるので安心してほしい。
というわけで結果の見方だが,見るべきは「Speculation control settings for CVE-2017-5715 [branch target injection]」以下だ。一例をテキストで示しておこう。
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)
まず,「Speculation control settings for CVE-2017-5715 [branch target injection]」以下がVariant2への対応状況,「Speculation control settings for CVE-2017-5754 [rogue data cache load]」以下がVariant3への対応状況を示す。
(1)のところは,CPUのファームウェア(≒BIOS,UEFI)がアップデートされ,CPUのファームウェアレベルでVariant2対策が終わっていればTrueとなる。ここがFalseの場合は,まだ適切なBIOSアップデートを行えていないか,そもそも対策が不要ということになる。
(2)はWindowsにVariant2対策がインストール済みならTrueとなり,(3)はその対策が有効になった状態のWindowsが実行中ならTrueとなる。(1)(2)(3)のすべてがTrueなら,Variant2対策済みというわけだ。
話を戻すと,(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に掲載した。
それによると,
- Variant1およびVariant3対策による性能への影響は最小限
- Variant2対策は性能に大して有意に負の影響がある
とのことだ。また,対象となるCPUについては,大まかに次のとおりまとまっている。
- Skylakeマイクロアーキテクチャ以降のCPUと,Windows 10の組み合わせならば,脆弱性対策が性能に与える影響はミリ秒単位でしかない
- Haswellマイクロアーキテクチャまたはそれ以前のCPUとWindows 10の組み合わせでは,脆弱性対策により,「一部のベンチマーク」で大幅なスコアの低下が見られる。一部のユーザーはシステムの性能低下を体感することが予想される
- Haswellマイクロアーキテクチャまたはそれ以前のCPUとWindows 7&8.1の組み合わせにおける性能低下は大きく,ほとんどのユーザーがシステムの性能低下を体感するだろう
- Windows Serverでは,CPUを問わずI/O集約型(IO-intensive)のソフトウェアにおいて性能低下が顕著に見られる
全体としては,「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が発表した「脆弱性の対応指針」
本件に関連して,Intelは北米時間1月5日,「脆弱性への対応をまとめた文書」を公開している(※リンクをクリックするとpdfファイルのダウンロードが始まります)ので,こちらも簡単に紹介しておきたい。
Variant1対策
Variant1に向けてIntelは「ソフトウェア的な対策」を提案している。具体的には「適切な箇所にLFENCE命令を挿入し,メモリの先読みを抑制する」というものだ。
LFENCE命令とは,「当該命令以前の命令実行が終わるまで,その先のメモリを読まない」という命令だ。メモリアクセス順序を制御する命令としてはLEFENCE,SFENCE,MFENCEといった命令があるのだが,これらを適切に挿入することでVariant1は防げるというわけである。
この対策を行うためにはソフトウェア開発ツール,具体的にはコンパイラの対応が必要で,Intelはコンパイラベンダーと共同で対応を進めるとしている。
Variant2対策
前述のとおり,Variant2の対策にはマイクロコードのアップデートが必要だが,Intelは文書の中で,マイクロコードに以下のとおり,3つの対策を施したとしている。
- Indirect Branch Restricted Speculation(IBRS):間接ジャンプにおける分岐予測を抑制する
- Single Thread Indirect Branch Predictors(STIBP):Hyper-Threadingにおいて論理CPU間の分岐予測の制御を防ぐ
- Indirect Branch Predictor Barrier(IBPB):コードの挙動によって間接分岐の予測が制御されることを防ぐ
この3つがどう異なるのか,Intelは明言を避けているのだが,Microsoftのblogに書かれている内容も踏まえるに,「Skylake以降では,IBRSを使うことで,性能低下を比較的抑えることができている」ということではないかと思う。
なお,これら3つのマイクロコードによる対応だけでなく,ソフトウェア的な対策も行っていると,Intelは述べている。いわく,「Return Trampoline」(略してretpoline)という方法を使い,リターンアドレスとして分岐先アドレスをスタックにプッシュし,ret命令で分岐するとのこと。割とトリッキーな,というか笑ってしまうようなやり方である。
この方法だと分岐予測は効かない気もするので,性能低下抑制にはなりそうもないが,Intelはコンパイラベンダーと協力してretpolineの実装を進めたいとしている。
Variant3対策
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という命令が必要になる。
検証していないので断言まではしないが,KVAShadowPcidEnabledがFalseになっているIntel製CPUで,Variant3対策による性能低下はかなり大きくなるのではなかろうか。
Intel製CPU搭載環境では性能低下を免れ得ない
というわけで,多かれ少なかれ性能低下は免れられないとまとめていいだろう。これから,さまざまなアプリケーションで性能低下の有無が検証されることになると思われるので,ゲーマーとしても,まだしばらくは情報を追っていく必要があるのではなかろうか。
一方,Ryzen環境であれば,確認されている脆弱性はVariant 1のみで,かつVariant 1単独では攻撃につながりにくく,ソフトウェア的な対策も進んでいるので,基本的には静観していて大丈夫だ。むしろ,動揺して下手に手動で不要な修正をインストールしたりすると面倒なことになるので,触らぬ神に祟りなしである。
※2018年1月12日12:00頃追記
脆弱性対策について,AMDから公式のアナウンスがありました。続報を用意したので,合わせて確認してください。本稿の表現は掲載当時のまま残しておきます。
Googleが発見した「CPUの脆弱性」とは何なのか。ゲーマーに捧ぐ「正しく恐れる」その方法まとめ
Microsoft公式blog「Windows Client Guidance for IT Pros to protect against speculative execution side-channel vulnerabilities」(英語)
- 関連タイトル:
Windows 10
- この記事のURL: