2019年、CPUハードウェア脆弱性のゆくえ

2019年1月16日

2つのCPU脆弱性「Meltdown」「Spectre」が初めて発表されてから約1年。第35回Chaos Communication Congress(英語)で、オーストリアのグラーツ工科大学(Graz University of Technology)の研究チームが、これら脆弱性の現状を報告しました。少々ネタばらしをすると、これらの脆弱性に関しては、昨年のうちに多くのことが明らかになったのでした。

Meltdown、Spectreとは?

まず、MeltdownとSpectreとは何か、その違いは何かを復習しましょう。

現代のCPUは、順序にとらわれずに命令を実行(アウトオブオーダー実行)できます。その結果生じたのが、Meltdownという脆弱性です。アウトオブオーダー実行は、コードを迅速に処理するには大変便利ですが、期せずして、エラーにつながるコード、要は絶対に実行すべきではないコードを実行してしまう場合があります。CPUがそのコードを実行して初めて、処理を完了できないことが判明するのです。これは、アウトオブオーダー実行が可能だからこそ陥る状況です。

もちろん、このような処理の結果はどこにも出力されませんし、使用されることもありません。それでも、マイクロアーキテクチャのレベル、つまりCPUのキャッシュメモリ内に痕跡が残り、これはメモリから抽出可能です。このため、他の方法ではアクセスできないデータ、たとえば、パスワードをキャッシュから入手できるようになるのです。仕組みはこうです。あるプログラムが、保管領域にあるデータへのアクセスをリクエストします。しかし、認証情報が不足しているため、システムは当然アクセスを拒否します。ところが、順番どおりに命令が実行されていなかったので、パスワードはキャッシュに残ったまま、簡単に取り出せるようになっていました。これがMeltdown、つまり、正しいと認められない操作を実行しようとしたときに起こる可能性のある脆弱性です。

SpectreもMeltdownに似た脆弱性で、CPUの計算の加速に関連していますが、こちらは現代のCPUの分岐予測機能に由来しています。通常動作Aに続いて動作Bが起こる場合、CPUは本質的に、Aの結果が明らかになる前にBを実行できることをある程度正確に予測できます。この予測どおりに動作Bが続けて行われた場合は、何の問題もありません。Aの結果が、BではなくCを行うべきだったことを示した場合、 CPUはBへの分岐を取り消し、Cを行う処理に切り替えます。

この分岐予測機能は学習可能であり、ほとんどの場合で動作シーケンスのパターンを記憶するので、CPUの性能が大きく向上します(A→Bという処理が数回繰り返された場合、その状況下では、Aの後にBも実行しなければならない、とCPUは論理的に推測します)。それでも、予測ミスは起こります(Aに続くのは通常Bであることを分岐予測機能が十分に記憶していたとしても、BではなくCが起こる場合があります)。

ある分岐を正しいものとして常に実行し、長期間にわたりシステムを学習させた後で、その分岐が正しいものではなくなるようにパラメーターを変更した場合、CPUはとりあえず学習した方の分岐を実行し、別の分岐を実行すべきだったと気付いた後に最初の分岐を取り消します。しかし、Meltdownの例と同様、動作の結果がキャッシュなどに残る可能性があります。残ったものはもちろん取り出すことが可能です。

その結末もほぼ同じで、Spectreによってデータへの不当なアクセスが可能になります。もちろん、誤った分岐予測が行われることが前提ですが、あり得ないことではありません。

1年後のSpectreとMeltdown:20数種類の新たな変種

MeltdownとSpectreの脆弱性が初めて発見された後、調査チームはさらに掘り下げた調査を開始し、多少の差こそあれ、ほぼ同じ問題点を複数見つけました。一方でPUの開発側では、MeltdownやSpectreのような脆弱性をもたらす可能性のある最適化を採用していました。グラーツ工科大学チームは、Meltdown系の脆弱性を14種類、Spectre系の脆弱性を13種類、合計27種類のCPUハードウェアの脆弱性を発見しています。2018年初めには両方合わせてわずか2種類だったのですが。

2018年に捕捉されたMeltdownとSpectreの変種の系図

2018年に捕捉されたMeltdownとSpectreの変種の系図

さらに、AMDは当初、同社のCPUにはMeltdown級の脆弱性はないと主張していましたが、後にAMDのCPUで完全に濫用可能なMeltdownの変種(Meltdown-BR)が発見されています。つまり、現時点では、世界3大CPUメーカー(AMD、ARM、Intel)すべてのCPUが、MeltdownとSpectre両方(少なくとも、これらの変種の一部)の危険にさらされています。

幸い、多数ある変種のほとんどはARM、AMD、IntelのいずれのCPUでも機能しません(少なくとも、テスターは機能させることができませんでした)。とはいえ、これらの大半はどこかしらで機能します。

このような問題の発生を阻止するため、2018年1月、複数の企業がCPUマイクロコード、OS、個別プログラム用のパッチをリリース開始しました。しかし、残念ながら、SpectreとMeltdownはハードウェアの脆弱性です。ハードウェアのレベルに存在する脆弱性であるため、ソフトウェアにパッチを適用しただけでは完全には解決できません。

あるパッチをLinux OSコアの内部に実装したところ、システムの動作が非常に遅くなったため、しばらくしてこのパッチはコードから削除されました。

Spectreは、さまざまなマイクロアーキテクチャコンポーネントを標的とするため、パッチを個別に設計しなければならないという問題があります。また、停止しなければならない機能や追加で実行しなければならない動作がパッチごとにあるので、パフォーマンスがさらに低下します。

事実、多くの場合でパッチがパフォーマンスに与える影響は極めて深刻で、パッチが適用されたシステムは、脆弱なCPUコンポーネントをすべてオフにしたシステムよりも動作が遅くなります。

抜本的な対策 — 指定された場所をドリルで壊してCPUの脆弱な箇所を除去(もちろん冗談です)

抜本的な対策 — 指定された場所をドリルで壊してCPUの脆弱な箇所を除去(もちろん冗談です)

SpectreとMeltdownの今後

2018年10月、Intelは新型CPU(2019年に発売が予定されている世代)では、SpectreとMeltdownに対するハードウェアレベルでの保護を搭載すると発表しました(英語記事)。しかし、これは「基本的な」脆弱性2つに対しての話であり、ここまで見てきたようにSpectreとMeltdownには多数の変種があります。AMDも、2019年にリリースされるZen 2アーキテクチャプロセッサーの新世代でSpectre変種の1つにパッチを適用する計画です。ARMもハードウェアアップデートを約束し、今後、同社から出る「CPUはすべてSpectre系の攻撃に対する耐性を持つ」と主張しています(英語記事)。

もちろん、素晴らしいニュースです。今後、新しいデバイスの購入を考えている人にとってはそうでしょう。しかし、たまたま2018年以前にIntel、AMD、またはARM製のCPUを搭載したコンピューターやスマートフォンなどを買ってしまった人は、ほぼすべてにパッチをインストールしなければなりませんから、パフォーマンスが大きく低下することでしょう。中には、そこまで手が回らない人もいるかもしれません。

CPUメーカーは、パフォーマンス向上のためだけにCPUを最適化しようと専念し、ハードウェアレベルの脆弱性をあまりにも長い間、無視し続けてきました。しかし、このような最適化はすべて犠牲の上に成り立っています。高められた機能がある一方で、より多くの問題を抱える結果となったものもあります。これからは、深く埋もれたこのような脆弱性を取り除くのが大きな課題です。しかし、こうした脆弱性の悪用はそれほど簡単ではないので、希望を持つことはできます。少なくとも、次世代CPUが登場するまでの間は。