grafi.jp

cold boot attack という攻撃手法は、DRAM(いわゆる計算機の「メモリ」)は電源が切れてすぐにはデータは消えない(温度によるが数秒から数分)ということを逆手にとって、DRAMを物理的に冷却した上で、電源断→起動を高速に行うもしくはDRAMを外して別の機械から読み出すというものである。

たとえばBitLockerなどでラップトップマシンのストレージを暗号化した上で、ログインが必要になるようロックしておいたとしても、ディスクを暗号化するための鍵は(多くの場合)メインメモリ上にある。なので、この間にマシンを盗まれてしまうと、 cold boot attack によってディスクを暗号化する鍵が読み出され、ディスクの中身を奪われる危険性がある。TPMを利用したところで、結局のところ鍵はメモリ上に保持されるのだから同じことだ。特に現在ではスマートフォンにおける危険が大きい。

対策としては、暗号化するための鍵をメモリ上に持たないようにするしかない。上のようなケースでは、ロックを解除するときに入力するパスワードでディスクを暗号化するようにすれば良い。たとえば、マシンをサスペンド(ACPI S3)にするのではなく休止状態(ACPI S4)にすれば、安全ということになる。Androidでも画面をロックする度に内部ストレージをunmountすれば安全になるわけで、実際に DeadBolt という実験的な実装が存在する。

しかし、この方法は利便性という面から見ると完全に腐っている。ロックを解除する度に、(ブルートフォースを防ぐために十分に複雑である必要のある)暗号化キーを入力するというのは面倒極まりない。ロック画面で入力するパスワードは短くした上で、数回誤った入力が行われたら電源を落とし、そこで暗号化キーを要求するという方がよほど使いやすい。

あるいは、別の問題として、サスペンドしていない稼働中のマシンをひったくられるという局面に際しては全く無力であることも挙げられる。ただ、このような攻撃はCPUのレジスタ上の暗号化キーを保持することで対処可能であり TRESOR というLinuxカーネルなどのパッチなどの実装が存在する。しかし、デバッグ用のレジスタを使うなどの工夫はしているもののやはり暗号化キーにレジスタをいくつか専有されるのは他のアプリケーションにとって邪魔であり、また暗号処理を必然的にCPUの汎用レジスタ上で行うことになるため、空間消費の多いアルゴリズムは実行できず、そうでなくとも時間と空間のトレードオフによる性能の劣化は起こりうる。

さて、これらを踏まえた上で、安全性と利便性を両立するためにどのような方法があるだろうか?結局のところ求められているのは、物理的にマシンを奪われて何をされたところで、中身を読み出されることの無い記憶装置だ。TPMがそうだと言われるかもしれないが、あれは周辺機器の構成やRAMに読み込まれるプログラムの正しさを検証するのに役立つものの、プログラムを実行するハードウェア自体の耐タンパー性を高めるようにはできていない(脱線するが、Trusted Computing Groupの提供しているTPMなどに関するドキュメントを色々読んでいたもののやたらと分かりづらくて弱った)。また、TPMは容量が小さく遅い。暗号化のような処理をパフォーマンスの問題無く遂行するには、この記憶装置はキャッシュメモリのようにCPUに組み込まれるしか無いだろう。十分な耐タンパー性は物理的に大変なのかもしれないが、少なくともダイサイズに関しては最近のCPUが数MBのキャッシュや特定用途の命令(のための演算器)を平気で持つことを考えると問題無いレベルであろう。そういえばCellはCPUによるデータ保護を提供していたような気がする(調べ直す気力が無かった)。

さらに、フラッシュメモリのような不揮発性の記憶が、耐タンパー性のあるモジュールとしてCPU内に提供され、また現在TPMによって行なえるようなプログラムの検証が行われるとしよう。ロック画面で何回か短いパスワードの入力を間違えると長い暗号化キーの入力を要求するようにしようと上に書いたが、不揮発性の記憶を提供することで、これを電源断の後の通常のブート時にも行えるようになる。要はディスクを暗号化するキーおよび、パスワードを間違えた回数を不揮発性の記憶に保持すればいい(BitLockerのようにディスクを暗号化するキー(を暗号化するキー)をTPMに保持しても良いのだが)。この不揮発性の記憶がCPUに組み込まれていないと、たとえば信号線に細工して物理的に特定のアドレスへの書き込みを無効化することでパスワードの入力を間違えた回数を記憶させないようにする攻撃が可能になってしまうだろう。

そこまでするならTPMもCPUに組み込んでしまえば良いのではないかという話になる。外部の配線を介して繋ぐと何でも遅く危険になるし、貧乏臭いデバイスはプログラマにとっても使いづらい。やはりCPUというのは計算機にとって約束された聖域である。国家機関からの圧力などによってCPUにバックドアを仕込まれる危険はもちろんあるが、そもそもCPUにバックドアがあったら全てのプログラムが処理する情報が筒抜けなわけで、今更何が変わるということもない。CPUは信用するしかないというわけだ。


モバイル端末の普及によって、物理的なコントロールが奪われても計算機を守り抜かねばならなくなっているのは間違いない。分解しようとすると爆発する時限爆発のように、時にはフェイルデッドも必要なのだろうか。ただ、これは本当に実体のあるモノを守りぬかねばならないというのとは訳が違うと思う。それは、一箇所を完璧に守りぬくことができれば、後は暗号化を適切に施すことによって、そうでない場所を保護することができるということだ。ここに計算機の勝ち目がある。まだまだリアルワールドより安全だ。


さて、CPUの製造者に全てを委ねるというのは良いのだろうか。GNU的には LEON のようなオープンソース(さらにLEONはGPLライセンス)のCPUを使うのが正しいのかもしれない。ただ、オープンソースで提供されるのはCPUの回路記述であり、誰でもASICを作れるわけではないし、FPGAを使うにしてもFPGAにバックドアが無いことも論理合成ソフトウェアにバックドアが無いことも保障されない。

そもそも、ソフトウェアは誰にでも複製可能な存在であるが、優れたハードウェアを製造出来るのは限られた製造者だけだ。およそ工業製品と呼ばれるものは、製造のための装置に金がかかるもので、その装置を苦労して手に入れたものが大量に生産するものだ。もちろんさほど複雑な初期投資を必要としなくても作ることのできる工業製品も存在するが、悪いことに最近のCPUやFPGAは初期投資が極端にかかる類の工業製品だ。

確かに、性能の極めて低い半導体製品であれば、個人が作れるとは言わないがもっと小さい規模の組織でも作れるかもしれない。しかし、そんな性能の低い計算機を誰も求めていない。さらには、電力に対して性能の低い計算機を使うことはエネルギー問題の観点からみると罪ですらある。

このジレンマはどうにもしようがないが、個人的には諦めとともに楽観するような気分である。国家と言えども神ではない。CPUに仕掛けたバックドアを経由して個人を監視するほど暇も技術も有るとは限らない。計算機づくりは国際的な仕事(アメリカに集中しているのは否めないが、いつまでも続くとは限らない)であるからして、一つの国家が全てを支配していられるというわけでもない。そもそも一つ国家からして一筋縄な存在で無い。仮に個人を監視する仕掛けが存在したとしても、少し工夫すればしばらくの間は撒くことができるかもしれない。支配者にとって善良な者であれば気にしないことにすれば初めから困らないし、あるいは支配者にとって善良で無いものは昔からある程度世を忍んで暮らしていたのだから何も変わらないとも言えるのだ。

ちょっと話は外れるが、CPUにバックドアを仕掛けるなんて圧倒的な火力で攻めるという米軍のドクトリンであるかのような正攻法に思いを巡らせたくなる気持ちはあるものの、中国製製品の仕業である 無線LAN経由でウイルス攻撃を行なうアイロンが発見される なんてのも面白く、実はこれからの脅威かもしれないとも思われる。

blog comments powered by Disqus