すべての夢のたび。

1日1記事ぐらいな感じでいきたい雑記ブログ

スペクターとメルトダウン

大騒ぎになってるスペクターとメルトダウンをどうやったらコンピュータを知らない人にも説明できるんだろう、って考えてたんですが、すごい難しい。そもそもぼくが原理を理解するのに時間掛かった。まぁぼくにはふつうの人に説明すんの無理、って結論ですが、コンピュータ多少知ってる人ならわかるかも?

まず「投機的実行」について。これリアルのお仕事でもままある話と思うんですけど。先読みして作業をしておく、ってやつですね。ある件の結果が出ないと次に何したらいいのか決まらんのですけど、たぶんこうなるだろうから、そうなった場合の作業を先に進めておく、ってやつ。無駄になってあーっ!っ!ってことも多いのですが。

それでスペクターとメルトダウンが何をしているのか、というと。まず「読めたらマズいアドレスの内容を読め」って命令を出すわけです。読めたらマズいアドレス、ってのは、パスワードとかそういうのが入ってるかもしれない、本来読めるはずがないアドレスですね。まともなプログラムはそういうことしない。だって普通はそんな「悪意」はないし、そもそも例外、エラーで弾かれて読めるわけないので。スペクターとかメルトダウンは「絶対無駄になる仕事をしろ」っていう。

しかし、やつらは、その「読めたらマズいアドレスの内容を読め」命令の次に、面白い命令を置くわけです。ここがすごい。仮に自分がふつうに読める番地、アドレスを1000番地とすると、「今読んだ内容の一番下のビットを、1000番地に加算して、そこの内容を読め」って命令を出すわけです。ビットってのは0か1ですね。つまり「1000番地か1001番地の内容を読め」っていうわけです。どっちになるのかはまだ決まらない。その直前の「読めたらマズいアドレスの内容を読め」が成功するまでは決まらないわけです。でもこいつは100%失敗する。読めたらマズいとこが読めたらマズい。

でもCPUは先に説明した「投機的実行」をやってしまうのです。1000番地か1001番地の内容を、先に読んでしまう。読んでしまうんですけど、その直前にある「読めたらマズいアドレスの内容を読め」がエラーになるので、今やったお仕事はキャンセルされるんですね。「投機的実行」で先読みしてやってたお仕事が無駄になる。

さてここからがまたすごいんですけど。スペクターとメルトダウンは何をするのか。さらに「1000番地の内容を読め」「1001番地の内容を読め」って命令を追加で連続で出すわけです。するとどうなると思いますか。CPUにはキャッシュというものがあり、さっき1回やったことは2回目は超高速に実行できるわけです。さっきやった「投機的実行」の結果は無駄になって捨てられてますけど、0か1か、どっちかはやっているので結果がキャッシュに残ってるわけです。仮に「読めたらマズいアドレスの内容を読め」の読んだ結果の一番下のビットが「1」だとすると「1000番地の内容を読め」より「1001番地の内容を読め」のほうが超高速に実行できる……!

スペクターとメルトダウンはここをタイマーで計ります。あっ「1000番地の内容を読め」より「1001番地の内容を読め」のほうが速かったわ。ってことは、「読めたらマズいアドレス」の一番下のビットは"1"だ!ってわかるわけですね。あとはこれを「読めたらマズいアドレス」の下から二番目のビット、三番目のビット、ってぐるぐる回していけば、読めたらマズいアドレスの内容が全部わかっちゃう……。

天才か、と思いましたよね。このアイデア感動した。スペクターとかメルトダウンを見つけたのはGoogleの人でしたっけ。忘れました。「サイドチャネル攻撃」というらしいですけど。サイドチャネルってのは、メインのチャネルは「どこそこのアドレスの内容を読め」であり、それ以外の方法で内容を手に入れるのがサイド、なわけです。たとえばキーボードを叩く時の音でどのキーを叩いているか知り、パスワードを手に入れるとか、そういう手法です。そのくらいならあり得るのかも知れないなぁ、と思うかも知れません。でも実際には、コンピュータの画面になんか表示する時の電磁波の変化とか、CPUがなんか処理してる時の消費電力の変化とかとか、そういうのを見張ってるとなにやってるかわかる……という研究があるらしいです。サイドチャネル攻撃恐ろしすぎる。

それで例えばブラウザーとかにもスペクターやメルトダウン、どっちだったかな?は仕掛けられるらしいんですね。あなたがどっかのサイトを見る。そこにはこいつが仕掛けられていて、あなたのコンピュータの見られちゃいけないアドレス、パスワードとか書いてあるところが読めてしまう、そういうことが可能らしい。だからパッチは当てといたほうがいい、というわけです。いやースクリプトでどうやってんの、と思うんですけど。タイマーが無理でしょ。何万回も同じことやってどっちが速いか見てんのかな。

そんでもってこういうの知ると、コンピュータとか、言語だけじゃなくて、原理知ってたほうが楽しいなぁ、と思うわけです。