第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さん、スタッフの皆さま、参加者の皆さま
大変お疲れさまでした。