2012-06-08

セキュアブートのセキュリティ

mjg59 | The security of Secure Boot

UEFIのセキュアブートに対する、よくある批判に、実際には全然セキュリティが向上していないんじゃないのか、というものがある。これにはふたつの論法がある。どうせすぐに破られるだろうというものと、署名サービスが一般に提供されていては意味がないというものである。

セキュアブートは破られるか?

イエス。まず確実に破られるだろうね。大金を賭けてもいい。ありそうな方法としては、USBメモリー内の細工されたFATか、プログラム可能なUSBデバイスからUSBスタックに対して未定義動作を引き起こすような攻撃だ。運が良ければ、USBハードウェアがつながれていなくても、EFIのシステムパーティションのファイルシステムを、ブート毎に常に破壊できるようになるだろう。また、バイナリ認証プロセスにバグがある可能性があり、未署名なのにも関わらず認証を通過するようなバイナリを作れるかもしれない。多くのベンダーは、署名されたROM内のコードで未署名のデータを扱うだろうから、誤動作するように攻撃できるだろう。しかし、これらの攻撃の多くは、物理的なアクセスを必要としたり、あるいは特殊なハードウェアが装着されていることが必須である。これらの脆弱性は、発見後ただちに修正される。次第に、攻撃手段は少なくなっていくだろう。

どうも、セキュアブートの設計が、根本的に欠陥であると信じたい人間がいるようだが、それは正しくない。すでによく検証されている暗号技術に基づいているからだ。署名したいバイナリのSHA256ハッシュを計算する。ハッシュを2048bitのRSAキーの半分で暗号化する。バイナリに暗号化されたハッシュを埋め込む。バイナリを実行する際には、ハッシュを公開鍵で復号化する。そして、バイナリのハッシュを計算し、一致するかどうか確かめる。もし一致すれば、このバイナリを署名した人間が誰であれ、自分の信頼する秘密鍵にアクセスできる者であるし、また、バイナリは署名後に改変されていないことが保証できる。

セキュアブートは、CSSやWEPとは違う。セキュアブートは既存の暗号技術を使い、しかも、暗号がどのように機能するかを理解している人間によって設計されている。マイクロソフトがドライバーを署名するのに使う技術と全く同じだ。世間では、この技術を破るより、Realtekからキーを盗み出したほうが簡単である。実装に、まだ誰にも知られていないバグがない限り、攻撃手段は限られている。SHA256の衝突を引き起こす(現在の技術で可能、ただし、この宇宙に存在するよりも桁違いに多い多額の金をつぎ込まねばならない)、もしくは、RSAを破ることである(これはつまり、SSLが破られることを意味する)。もし、誰かがそんなことを実現したとしたら、セキュアブートの他に心配することが山ほどある。

というわけで、結論としてはイエスだ。セキュアブートは破られるだろう。しかし、すぐに修正される。これが何度か起こった後には、それ以上破られることはなくなるだろう。

誰でも署名できるとか、何の意味があるんだ

誰でも99ドル払ってバイナリを署名できる。じゃあ、マルウェア作者だって署名するに決まってるだろ。まずその前に、Verisignの有効なIDを提供して、自分が誰であるかを証明して、バイナリも提供しないといけない。偽造IDをでっち上げても、認証局にはねられる。およそコンピューターに侵入して悪事を働こうとする者は、身元を明かして捕まりたくはないものである。そして、署名システムを使うには、Veerisignが郵送する物理的なスマートカードを使う必要がある。そのため、物理的な住所を知らせなければならない。転送サービスを使ったとしても、やはり追跡は容易だ。現実世界に身元がバレるリスクを抱えるのだ。

まあいいだろう。そういう手続きはしたとして、署名キーを入手してマルウェアを署名したとする。とりあえずいくつかのマシンに感染させた。しかし、いずれ発見される。発見されたら、マイクロソフトは該当キーの無効化を宣言し、OSベンダーは各自のアップデート機構でキー無効化を配信する。マルウェアが無害なものであれば、話はそこで終わりだ。しかし、もしそのマルウェアが銀行の情報を盗むようなものであれば、多くの人間の注目を集める。そのため、キーの所有者にも注目が集まるだろう。つまり、マルウェアはそれ以上多くのコンピューターに感染を広げることができないのだ。

現在の状況では、Windowsがデスクトップのオペレーティングシステムの主流だ。botnetとか銀行情報を盗み出すとかいうことをしたければ、攻撃対象は当然、Windowsに決まっている。今日、Windowsのセキュリティは向上し、そういうことはユーザー空間からやるには、だいぶ難しくなっている。そのため、当然の結果として、マルウェアはカーネル上で走らせたい。最も簡単な方法は、ドライバーとして読み込ませることである。しかし、Windowsは未署名のドライバーを読み込まない。そのため署名ドライバーが必要になる。どうやって入手するのか? 同じく99ドル払ってマイクロソフトの署名サービスにアクセスする。EFIのバイナリを署名するのと同じ機構だ。

署名サービスをつかってWindowsを攻撃するのならば、すでにできたのだ。しかし、現に行われていない。Stuxnetの作者は、自前のキーを用意するよりも、本物のハードウェアベンダーのキーを盗んだほうが手っ取り早いと判断した。だから、理論上は、攻撃者は署名サービスを使って署名を入手できる。しかし、現実の事例で明らかなように、物事はそういうふうには動かないのだ。

結論

セキュアブートは、実装上の欠陥によって破られることはない。一般公開されている署名サービスの存在が、ブート時のマルウェアを増加させる証拠もない。

なるほど。たしかにその通りだ。明らかに国家が背後にあるStuxnetやFlamesでさえ、大真面目に署名しなかった。代わりに、他人のキーを盗みだす方法をとった。署名サービスが一般に解放されていても、セキュリティ上の欠陥にはならない。なぜならば、署名するには身元を証明しなければならず、マルウェア作者としては利用しがたい。身元がバレてもいいとしても、糞真面目に自前のキーで署名しては、すぐに気が付かれて、無効化されてしまう。やはり、他人のキーを盗むのが最も効果的だ。

セキュアブートは、CSSやWEPとは違うというのはどういうことか。WEP(無線LANの暗号)との違いは、十分に強い暗号を利用しているということだろう。CSS(DVDのDRM)やACCS(ブルーレイのDRM)やB-CAS(地デジのDRM)との違いは、ちゃんとした暗号理論に基づいて設計されているということだ。CSSでは、ユーザーは復号化のための秘密鍵を所有している。なぜならば、復号しなければ、DVDは再生できないからだ。ただし、この復号鍵は認証を受けたハードウェアとソフトウェアベンダーにしか知らされず、ハードウェアやソフトウェアは、あらゆる難読化を限りを尽くして、鍵をエンドユーザーから隠そうとしているからだ。これは、技術的に正しくない規格である。暗号ではなく、偽装化とか難読化と呼ぶべきものだ。当然、破られる。

No comments: