今回は、少しの間お休みしておりました「NDSS'06」の話題を続けたいと思います。
NDSS(Network and Distributed System Security)は、ISOC(Internet Society)が主催するセキュリティ・カンファレンスです。詳細については、NDSSに関する過去の記事(Part 1、Part 2、Part 3)を参照ください。
“Black Hatの常連スピーカー”登壇
今回紹介するのは、テキサス州出身のDerek Soederによるプレゼンテーションです。タイトルは、「PiXiE: A Self-Propagating Network Boot Virus for Windows(Windows用の自己増殖ネットワークブート・ウイルス)」です。
彼は私と同様、セキュリティ脆弱性スキャナ「Retina」の開発とリサーチを兼任しています。彼は非常に多くのセキュリティ脆弱性を発見しており、Black Hat USAでも今や常連スピーカーです。
とても若いですが、eEyeリサーチ・チームの中で最もリバース・エンジニアリング技術に優れており、その速さは私も全然かないません。また、Shellコードなど数百バイト程度のコードなら、アセンブラを使わずバイナリ・エディタでマシン・コードを直接書いてしまいます。
今回の彼の発表は、Black Hat 2005で発表した「eEye BootRoot」をより発展させたものです。そこで、彼の発表を紹介する前にeEye BootRootについてお話ししましょう。
「eEye BootRoot」~ブート・プロセスに割り込むバックドア~
eEye BootRooは、一言で言えば「Windowsのブート・プロセスに割り込んで注入されるローカル・バックドア」です。CD-ROMなどのブータブル・メディアが利用できるシステムでeEye BootRootを利用すれば、Windowsシステムの起動時に、そのシステムを完全に掌握する事ができます。システムにログオンすることなくあらゆる権限でコードを実行できますので、当然ながらWindowsログオンのバイパスも可能です。
eEye BootRootでは、CD-ROMなどのブータブル・メディアのブート・セクタに記述されたコードがWindowsカーネルを汚染し、最終的に、用意されたコードがユーザー・ランド(SYSTEM権限)で実行されます。
まず、ブート・セクタに記述したコードで、BIOSのディスク読み込みアクセス(INT 13H/AH=02H および INT 13H/AH=42H)をフックし、その後、通常のブート・プロセスに移行します。フックされたBIOSは、OSローダーのイメージ(特定シグネチャ)を監視し、発見するとそのイメージを書き換えてバックドア・コードを注入します。
汚染されたOSローダーは、さらにNDIS.SYS(NDISラッパー・ドライバ)のパケット読み込み(ethFilterDprlndicateReceivePacketのエントリ・ポイント)をフックしてバックドア・コードを注入します。
これにより、ネットワークから特定のパケットが飛んでくると、注入したバックドア・コードをRing 0(カーネルの動作権限)で走らせる事が可能となります。その後は、ユーザー・ランドで動作している何らかのスレッドをハイジャックするなどして、ユーザー・ランドでコードを動かします。
以上がeEye BootRootの一連の流れです。eEye BootRootは既に実装も完了しており、eEyeのセキュリティ・リサーチ・ツールのページからダウンロードできます[注]。ソース・コード(IA32アセンブリ言語)やプレゼン用資料も同梱されていますので、興味のある方はぜひ読んでみてください。
[注]アーカイブ中に含まれるreadme.txtに、概要や利用法などが記載されています。お試しになる前に必ずお読みください。動作結果については一切保証できません。また、eEye BootRootはコードの性質上、一部のアンチウイルス製品にトロイの木馬として検出される事があります。
「PiXiE」~ネットワーク・ブートのリスクを実証~
PiXiEは、eEye BootRootを発展させたものです。近年のシステムの多くは、ハードディスクやCD-ROM、フロッピー・ディスク以外にも、「ネットワーク・ブート」というネットワーク経由でのシステム・ブート機能を提供しています。また、「Wake-On-LAN」というネットワーク経由でのシステム起動も提供しています。
これらが有効になっている環境下でeEye BootRootのテクニックを応用すると、ネットワーク経由で任意のコードを対象システム上で実行する事ができます。さらには、ネットワーク・ブート経由で伝播するワームにもなり得ます。このコンセプトを証明したコードがPiXiEです。
eEye BootRootで証明したコンセプトは、「そういう仕様だから」と言う事もできるでしょう。しかしながら、ブート・プロセスは安全であるべきです。そもそも、セキュリティ上重要なシステムではブータブル・メディアによるシステム起動は禁止されていてしかるべきです。例えば、CDブート可能なLinuxを起動し、Windowsのファイル・システムにマウントするといった事が可能になるからです。
当然、ネットワーク・ブートも通常は禁止するべきです。ただ、「ブータブル・メディアによるシステム起動は禁止すべき」と認識している人でも、「ネットワーク・ブートが有効になっているだけでシステムが完全に掌握される可能性がある」という事は認識していないのではないでしょうか?
ネットワーク・ブートのプロトコルは非常に単純です。システム管理者がネットワーク・ブートを利用する際、攻撃者がそのパケットをモニタリングしていれば、パケットをすり替える事も可能です。このため、同一ネットワークに攻撃者が存在する場合は、バックドア入りのブート・コードを受け取って実行してしまうかもしれません。PiXiEのようなコードを受け取ると、インストールされているシステムは汚染されてしまいます。
これはある意味「仕様」なのかもしれませんが、ネットワーク・ブートにもセキュリティ上のリスクが存在することは確かです。ネットワーク・ブートに存在するリスクを理解し、セキュリティ上重要なシステムでは安易にネットワーク・ブートを有効にすべきではありません。
最近では様々な機関で安全なネットワーク・ブートに関する検討が行われており、eEyeでもリサーチを進めています。何か良い成果が出れば、随時紹介したいと思います。
なお、3月1日からITproサイトにおいて「Security Tech」と題し、セキュリティ関連の研究成果やテクノロジに関するコラムを執筆しています。
1回目のテーマは「組み込みシステムのセキュリティ」です。全8回にわたって同テーマに関するコラムをお届けします。こちらの方も、ぜひよろしくお願いします。