第26回仮想化実装技術勉強会に参加してきました。
いっそのこと「軽卒」とか「無謀」とかいうタグを作ろうか。
改めて説明するまでもなく、またやらかしてきた。
今回は「仮想化実装技術勉強会」である。しかも「第26回」なので、私のような
冴えないやつなどお呼びじゃないのである。
第26回仮想化実装技術勉強会
上記のリンク先を見てもらえれば分かる通り、今回は「BlackHat USA 2010」と
「DefCon 2010」で発表した話をしていただいた。
ちなみに「DefCon」は聞いたことがあったものの、「BlackHat」は今回初めて
知った。有名なセキュリティの国際会議らしい。
話者は、産総研のNguyen Anh Quynhさん。発表は全て英語であった。
事前に話者を確認していなかったので、会場に着いてから少々嫌な予感がし、
いざ発表が始まると、予想通り英語だったので軽くうろたえた。
それでも、なんとか発表の内容を多少は理解できたので、以下にまとめる。
あくまで「多少」なので、あまり信用しないで欲しい。
BlackHat USA 2010の発表内容: ステルスデバッガ
ステルスデバッガとはなんぞや?
「ステルス」なので、当然「見えない」のであるが、誰から見えないのか?
マルウェアである。
そもそも、マルウェアもプログラムであるので、静的解析(逆アセンブルや
逆コンパイル)や動的解析(実際にデバッガで実行してみる)ができるのだが、
マルウェア作者にとっては、あっさり解析されて対策を施されるのは困る。
そこで、マルウェア作者は静的解析に対してはソースを分かりにくく記述して
対抗し、動的解析に対してはブレークポイントを無効化したり、デバッガを
直接攻撃(!)したりして対抗する。
解析する側としては、結局分かりにくいコードが出力される静的解析よりは
実際に動かしてみる動的解析の方が分かりやすいが、93.9%のマルウェアが
動的解析(デバッガ)対策済みなので、一筋縄では行かない。
では、マルウェアがデバッガを検出してしまう原因は何なのかというと、
- Windowsの場合、デバッガの存在を知らせるフラグやらAPIやらが用意
されている。 - デバッガがソフトウェアブレークポイントを設定する際にマルウェアを
書き換えるのを検出されてしまう。 - デバッガのウィンドウのタイトルやレジストリ、デバイスで存在がばれて
しまう。
であり、なぜデバッガはこのような問題を抱えるに至ったのかというと、
- デバッガはそもそもマルウェア解析用に作られていない。
(開発者がソフトウェアの不具合を見つけるためのものである。) - 開発者はデバッガを打ち負かすようなことはしない。
(そんなことをしたら開発者自身が打ち負かされるw)
とのことである。
では、どうするべきかということで、Nguyen Anh Quynhさんのアイデアは、
「デバッガをマルウェアから見えず、手の届かない所に置く。」
とのことであり、具体的には、
とのことである。このアイデアを実装したのが「Virt-ICE」である。
「Virt-ICE」はQemuを利用して作られており、Qemu上には、
が載っており、さらにVirt-ICEモジュールは、
の2つのフレームワークから構成される。ユーザは外部のクライアントからVirt-ICE
モジュールを通じてゲストVMを操作したり、結果を取得したりする。
尚、Qemuはそのままだと遅いのでKQEMUというライブラリを追加しているとのこと。
DefCon 2010の発表内容: OS Fingerprint
「OS Fingerprint」(以下OSF)とは各々のOSが示す特徴であり、これを利用すると、
外部から対象のマシン上で動作しているOSを判別することが出来るらしい。
これの何がありがたいかというと、例えば企業等で数千台のPCを運用していて、
ある日突然、OSのセキュリティホールが見つかって対策が必要になったとする。
1台1台のPCの前へ行きOSの種類、バージョン、サービスパックを確認するのは
骨が折れるし、セキュリティホールが見つかるたびに実施するのは現実的ではない。
そこで、OSFを利用すると外部から迅速に効率よく対策が必要なPCを見分けられる
とのこと。(逆にセキュリティの甘いPCを見つけて攻撃するのにも使える。)
ここで、1台の物理マシン上に複数のVMが載っている場合のOSFを考える。例えば、
以下に示すOSFの手法を使うと考えると、
- ネットワークを利用する。
パケットを作成してゲストへ送信し、戻りのパケットを解析する。
-> 最近のOSはデフォルトでファイアウォールが有効なので使えない。
-> 遅い。1台のVMに30秒以上かかる。(同一の物理マシンで) - ゲストのファイルシステム情報を見る。
-> OSとFSについて十分に理解する必要がある。(OS毎の全FS...)
-> 暗号化されてたら?
-> Hyper-Vの場合は? - メモリの情報を見る。
-> 多くのOSを熟知する必要がある。
以上のように、不確実だったり、膨大な知識を必要としたりする。
では、どうするべきかということで、Nguyen Anh Quynhさんのアイデアは、
これを実装したものは「UFO」と呼ばれており、専用のVMとSignature
Database(各OSのレジスタの情報を記録したファイル)を用意して使用する
とのこと。
実際にデモを行なっていただいたが、デモ環境上のWindows XP SP3とLinuxを
瞬時に判別していた。また、Signature Databaseの情報と実際のレジスタに
差異があってもある程度推測することが出来るとのこと。(実際にWindows XP
SP3のSignature Databaseを書き換えて実行したところ、約91%の確率で
Windows XP SP3であるという結果と共にSignature Databaseとレジスタとの
差異が出力された。)
「UFO」の利点としては、
- 完全に一致しなくともOSを推測できる。
- 速い。
- 高精度
- OS Contextを操作しない。
などが挙げられていた。
以上が、今日の発表の内容であり、正確に理解できているかどうか非常に不安では
あるものの、とても面白い発表であった。
尚、残念ながら、今日のこの発表がNguyen Anh Quynhさんの日本での最後の発表
とのこと。
最後になりましたが、Nguyen Anh Quynhさん、スタッフの皆さま、参加者の皆さま
大変お疲れさまでした。