解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【セキュリティ】Meltdown と Spectre

クリスマス&ニューイヤー休暇返上で Linux カーネルの Kernel Page Table Isolation (KPTI) *1のコミットが物凄い勢いで書かれ、しかもメインラインの RC 版のみならずリリースバージョンにも通常の手続きをバイパスしてマージするという特別なことが起こっていましたが、 ニューイヤー早々に、CPU の深刻なセキュリティバグが公表されました。 通称、 Meltdown と Spectre です。

googleprojectzero.blogspot.jp

これらは、CPU のキャッシュメモリの扱いが原因で、メモリ上の、ソフトウェアが自分と関係ない、OSや他のソフトウェアのデータを読み出せてしまうバグです。 Meltdown はOSのデータを読み出せてしまうバグで、Spectre は他のソフトウェアのデータを読み出せてしまうバグです。

Meltdown は主に Intel 製 CPU *2のバグですが、Spectre はメーカによらず AMD や ARM (Cortex) などにも幅広くあるバグのようです。

メモリキャッシュは演算結果を早く出すために処理済のデータを流用するしくみですが、今回の問題は、データの所有プログラム以外のよそのプログラムが盗聴可能であることです。 さらに近年の CPU は高速化のためにマルチコアマルチスレッドが一般的になってきていますが、つまりそういう CPU は複数のプログラムを同時に実行可能です。それで、キャッシュ上のデータの取扱がずさんだと、よそのプログラムが盗聴可能になってしまうわけです。

今回のバグは、PC のみならず、いわゆるタブレットスマートフォン、そのほか多くの端末と関係があります。 とはいえ、ソフトウェアを追加でインストールしないような端末(例えば既製ルータのようないわゆる「組み込み系」などの一部)は、そもそもマルウェアをインストールしてしまう余地がないので、あまり関係がありません。

裏を返せば、それに該当しない遅い CPU だと今回のバグがありません(例えば Raspberry Pi にはないらしい)。

Meltdown

Meltdown の方は、OS (カーネル)のセキュリティアップグレードでほぼ解決します 。なぜならば、カーネル自身がデータを監査して、よそからのアクセスが禁止可能なところに置けばよいわけですから。 Windows10 や macOSLinux カーネルでは既にセキュリティアップデートがリリースされています。(Linuxカーネルに関しては、使用しているディストリビューションとリリースバージョンによって今回のアップデートが既に流れて来ているか、異なりますが。)

ただし、その監査処理にオーバーヘッドが増えますから、システムの動作がある程度は遅くなってしまいます。 だから端的に言えば、 Meltdown は主に Intel CPUの問題なので、AMD製 CPU にすれば Meltdown 対策不要なため遅くならずに済みます。

なぜ Intel CPU ばかりかというと、 Intel CPU は高速化のために、カーネル所有のデータを読み込もうとするプログラムはエラーで実行中止すべきなのに、先読みしてしまって続きの命令まで実行してしまう(アウトオブオーダ実行)ため、その命令によって間接的にカーネルのデータも読み出せてしまうようなバグった設計になっているからです。

こういう設計思想だから Intel 製はよそより速いわけで、かなりの歳月の間「AMD CPU は遅い」という評価が続いておりました。が、そろそろ AMD にチャンスがめぐってきた予感。偶然にも、GPU方面ではライバルの NVIDIAGeForce のドライバのEULA改訂でデータセンターでの使用不可とか勝手にやりだして悪評だったりしますし*3AMD の APU の時代が来たかも?!

Spectre

Spectre の方は対策がかなり困難です

まず、ウェブブラウザなどのソフトウェア側で自衛をすることが考えられ、 Firefox などでは既にセキュリティアップデートした新バージョンがリリースされています*4なお、今回のバグは、 JavaScript (ECMA Script)のプログラムでも悪用可能です。 このように自衛をするソフトウェアも今後ある程度は増えてくるとは思いますが、それほど期待はしえないでしょう。

つぎに、 既知の マルウェアを防ぐには、マルウェア対策ソフトウェアでスキャンすればよい と考えられます。 しかし、未知のマルウェア、既存のソフトウェアが突然マルウェア化した、といったときには防ぎようがありません。

なぜなら、そのソフトウェアが Spectre を悪用していないことを分析するのはかなり困難だからです。「ウイルス対策ソフト」は、各ウイルスのバイナリコードの既知の特徴(いわば「指紋」)に合致するかをスキャンして分析します。しかし、Spectre は、マルウェア作者が自力でコードを書いたら、リバースエンジニアリングでもして分析しないと判りません。

ですから端的には、少なくともオープンソースで、Gentoo のようにソースコードからビルドするか、DebianFedora などの比較的に信用のおけるディストリビューションを使用する ことが考えられます。 よって、 Windows 界隈のように、インターネット上で、ソースコードのよくわからないビルド済バイナリをもらってくる(「フリーソフト」とか「無料ソフト」とか(笑))いう世界は、本質的にバグっています

つまり、 不要なソフトウェア、うさんくさいソフトウェアは、インストールしない、アンインストールすることが重要 です。

そして、オンラインバンキングとか、クレジットカード情報やプライバシー送信とか、機密文書を開いたりとかいう際には、比較的マシな端末でやる、ということが考えられます。 機密的な作業と、娯楽と、ネットサーフィンと、中身の信用ならないソフトウェアの使用と、一つの端末ですべてやるのは潜在的に危険だ、ということがいえます。

ひとつ、よい報せを言うとすれば、Spectre のバグは、「当てずっぽう」でないと読み出せないことです。 つまり、マルウェアにとって「運がよければ」、つまり被害者にとってみれば「運がなければ」、盗聴されてしまうということです。

参考