CPUの脆弱性[Spectre/Meltdown] の概要をプログラマー小飼弾が解説「キーワードは、アウト・オブ・オーダー実行、投機的実行、キャッシュの3つ」
プロセッサの脆弱性『Meltdown』、『Spectre』が確認され、話題となっています。
1月8日放送の『小飼弾の論弾』では、プログラマー小飼弾氏と山路達也氏が特集を組み、CPUでなにが起こっているかの説明と、その脆弱性について詳細な解説を行いました。
―人気記事―
『ポプテピピック』15分アニメ×2回放送に中年男性ガチ困惑「録画失敗したのかと思った」
はあちゅうさんの“ #MeToo 騒動”はいったい何だったの? 世界的なセクハラ告発から見る「ハラスメントが持つ構造」を解説してみた
「Intel、バグっている」のか?
山路:
経緯から言うと、Intelのプロセッサ【※】にバグがあって、本来だったら読み取られるはずのないパスワードとか、そういうものを読み取られてしまう脆弱性があるという報道が出た。対して、Intelも含めた業界団体が、「それは報道が微妙に間違っていますよ」と。
小飼:
実は問題はもっと深刻です。
※プロセッサ
処理装置の総称。コンピューターの中で、プログラムの命令セットを実行する(=プロセス)ためのハードウェア。CPU、マイクロプロセッサなどがある。
山路:
Intelの責任以上にもっと大きな話だったと。このセキュリティーホールには、『Meltdown』と『Spectre』という名前が付いているわけですけれども、ではそれがどういったものなのか? 別々に説明したほうがよろしいですか?
小飼:
どちらも共通はしています。キーワードになるのは、アウト・オブ・オーダー実行と投機的実行、キャッシュの3つですね。
昔話で学ぶ“アウト・オブ・オーダー実行”
小飼:
例えば、「昔々、あるところにおじいさんとおばあさんがおりました」という話がありますよね。これは「おばあさんとおじいさんがおりました」と順序を入れ替えても、話の内容というのは変わりません。それなら、同時におじいさんとおばあさんがポーンと乗ってもいいわけですよね?
今のCPUというのは、なるべく同時にできることは同時にやりましょうというやり方をしています。
山路:
Aが行って、その結果をBに渡すといった因果関係が無いならば、同時に行うということですね。
小飼:
dependency【※】というのは、プログラムを解析すればわかるわけです。例えば、「A=B、C=D」となっている場合というのは、これは順番を入れ替えても、同時にやっても変わらないわけですよ。
※dependency
因果関係。あるオブジェクトが、別のオブジェクトに依存して動くようにする仕組み。
ところが例えば、「A=B、C=B×2」となっていると、Bの結果がわからないとCを代入できませんよね? だからそういったものを解析したうえで、CPUに実行できるような形にしているんです。これがコンパイラ【※】の仕事ですね。
※コンパイラ
プログラミング言語を変換するプログラム。高級言語をコンパイラ方式で、機械語に変換した言語システムをコンパイラ言語と呼ぶ。
山路:
それがプログラムの時点で、CPUが処理しやすいようになっている。同時に実行できるものは、CPUが解釈しやすいようにコンパイラが整理してくれている。
豊臣秀吉の逸話と『HUNTER×HUNTER』32巻で理解する“投機的実行”
小飼:
もうひとつ重要なのが、投機的実行という概念です。これはわれわれも、特に仕事ができる人ほど“こんなこともあろうかと”よく行っています。
例えば、秀吉が信長の草履を暖めていたというのも、まさに投機的実行なわけです。もし信長が草履履くのをやめたら、それは無駄になってしまいますが、無駄になったところで、特に問題は無いわけですよ。
山路:
たいした手間じゃないですもんね。
小飼:
あらかじめやっておいて、必要なかった場合は、とりあえず無視しちゃえばいい。ところが、無視しちゃいけない場合というのが出たわけです。それがキャッシュメモリなんですよ。
山路:
それがどういうふうに関わってくるんですか?
こんなこともあろうかと“キャッシュ”に入れておきました
小飼:
カーネル【※】がやったことを、ユーザープログラムには直接見られてはいけないわけですよ。例えば、テーブルがメモリだとして、「僕が『HUNTER×HUNTER』32巻を取って来ました」「その投機的実行の結果、『HUNTER×HUNTER』32巻がキャッシュメモリに乗りました」
でも、やっぱり必要なかったという場合になにが起こるかというと、なにもしないわけです。しかし、テーブルの上に乗っかったままなので、そこの棚にあるはずの『HUNTER×HUNTER』32巻をほかのだれかが読めちゃうわけですよね。
※カーネル
OSの中で中核の機能を受け持つ基本的な部分。ハードウェアとソフトウェアの中間として、管理している。一般的に、ユーザーは直接制御できない。
山路:
つまり、一応見るかもしれないと思って用意したものを、結局これは使わなかったけれども、だれかが読めちゃうと。
小飼:
だから投機的実行をカーネルがやった結果、キャッシュにその結果が残っていた場合、単なるコピーなので、ユーザーがもう一度改めて読めちゃうかもしれないということです。
山路:
“こんなこともあろうかと”藤吉郎が入れて置いた草履を、ほかの人から見えてしまい、使えちゃうことがあり得る。
小飼:
本来暖かくないはずの草履が、「あれ、なんで暖かいんだ?」と。
要は投機的実行の結果、本来であれば読めてはいけないものまで読めてしまう。ですが、今時のCPUというのは、早く動かすためにそういった投機的実行をなるべくしておいて、データを残す。
山路:
『HUNTER×HUNTER』だけじゃなくて、いろんなものがテーブルの上、つまりメモリに乗っかっているわけですよね。
小飼:
だからすぐに使うものというのは、メモリの中ではなくてキャッシュの中にあるわけです。そこに書いたものを消さなきゃいけないのに、単に放置している。さっきの草履のアナロジーで言えば、わざわざ冷やさないといけないんですよ。だから投機的実行というのがあだになっちゃうんです。