連載
» 2019年04月03日 05時00分 公開

OSS脆弱性ウォッチ(12):QEMU脆弱性を利用したVM ESCAPE攻撃の検証:概要&テスト環境構築編 (1/2)

連載「OSS脆弱性ウォッチ」では、さまざまなオープンソースソフトウェアの脆弱性に関する情報を取り上げ、解説する。今回から数回に分けて、OSSのプロセッサエミュレータである「QEMU」の脆弱性を悪用したVMエスケープ攻撃に関する事例を紹介する。

[佐藤琳音,OSSセキュリティ技術の会]

 本連載「OSS脆弱性ウォッチ」では、さまざまなオープンソースソフトウェア(OSS)の脆弱(ぜいじゃく)性に関する情報を取り上げ、解説しています。

 今回から数回に分けて、セキュリティ技術の会の佐藤琳音が執筆します。具体的には、OSSのプロセッサエミュレータである「QEMU(キューエミュ)」の脆弱性を悪用したVM(仮想マシン)エスケープ攻撃に関する事例を紹介します。

脆弱性の概要

 2016年、CrowdStrike シニアセキュリティリサーチャーのJason Geffner氏はQEMUの仮想フロッピードライブコントローラのコードに存在するバッファーオーバーフローの脆弱性を発見しました。この脆弱性が悪用された場合、攻撃者が仮想マシンから抜け出し、ホスト側のシステムに対してアクセスし、任意のコード実行が可能となる恐れがあると「CVE-201503456」で報告されています。

 また2011年には、Nelson Elhage氏がQEMUのPCIデバイスホットプラグのエミュレーションに関する脆弱性を報告し、エクスプロイトに成功していました。

 最近では、Qihoo 360のXu Liu氏とShengping Wang氏が、HITBSecConf2016でKVM/QEMUの悪用に成功。2つの異なるネットワークカードデバイスエミュレータモデル、RTL8139とPCNETに存在する2つの脆弱性(CVE-2015-5165とCVE-2015-7504)をエクスプロイト(攻撃)しました。この組み合わせでVMから抜け出して、ターゲットのホスト上で任意のコードの実行することが可能になります。

 CVE-2015-5165(メモリリーク脆弱性)は、RTL8139ネットワークカードデバイスモデルのC+モードのオフロードエミュレーションにおけるプロセスのヒープメモリを読まれる脆弱性です。第三者により、プロセスのヒープメモリを読まれる可能性があります(エクスプロイトファイル)。

 CVE-2015-7504(ヒープベースのオーバーフロー脆弱性)はQEMUにおけるバッファーオーバーフローの脆弱性です。情報を取得される、情報を改ざんされる、およびサービス運用妨害(DoS)状態にされる可能性があります(エクスプロイトファイル)。

 VMエスケープ攻撃は、仮想OSからハイパーバイザー本体を操作できるものです。攻撃者が仮想マシンから抜け出し、ホスト側のシステムに対してアクセスしたり、任意のコードを実行したりするが可能となる恐れがあります。

テスト環境の構築

 以下、エクスプロイトコード実装におけるテスト環境構築時の流れを解説します。

 実装環境はLinux 3.2.0 x86_64、Debian 7(AMD64)、QEMUは4.9.2GCCで立てた脆弱なバージョンです。この脆弱性は既にパッチがリリースされているため、まずはパッチが当てられる前のQEMUレポジトリを取ってくる必要があります。

git clone https://git.qemu.org/git/qemu.git
git clone https://github.com/qemu/qemu.git
//クローン元のURLが変わっていた
$ cd qemu
$ git checkout bd80b59ccess

 git checkoutでパッチを当てられる前の状態のQEMUに変更(切り替え)しています。bd〜はバージョンの名前です。

$:~/qemu$ git branch -a)
 
* (detached from bd80b5963f58c601f31d3186b89887bf8e182fb5)
 
$ mkdir -p bin/debug/native
 
$ cd bin/debug/native
 
$ ../../../configure --target-list=x86_64-softmmu --enable-debug \ $ --disable-werror

 「-softmmu」はカーネルを実行することができるプロセッサエミュレータを指定するオプションです。

 結果、エラー「zlib check failed」が発生しました。

$sudo apt-get --no-install-recommends -y build-dep qemu 
$make
 
Linux rip 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

 QEMUをDebian 7(3.16 kernel on x_86_64architecture)で動かしているようなので、ここの「standard」をダウンロードします。

$wget
https://people.debian.org/~aurel32/qemu/amd64/debian_wheezy_amd64_standard.qcow2
 
$ ./qemu-system-x86_64 -enable-kvm -m 2048 -display vnc=:89 \
$    -netdev user,id=t0, -device rtl8139,netdev=t0,id=nic0 \ #rtl8139=Realtek Fast Ethernet
$    -netdev user,id=t1, -device pcnet,netdev=t1,id=nic1 \   #pcnet={AMDイーサネットカード}
$    -drive file={path_to_image},format=qcow2,if=ide,cache=writeback #qcow2={仮想マシンのディスクイメージ用のストレージフォーマット}

 なお{path_to_image}は、「Debian Squeeze and Wheezy amd64 images for QEMU」に書き換えました。

 「qemu-system-*」使ってシステムを仮想化したが、何も表示されない。つまり、「-display vnc」辺りが怪しいということで調べてみたら、GUIで使う設定であることが分かりました。

 QEMUをDebian 7で動かしているようなので、ここに戻って「standard」ではなく「display」の方をダウンロードしてみました。{path_to_image}を書き換えて再施行しても動きませんでした。

 ディスプレイで表示するには、VNC(Virtual Network Computing)を設定する必要があります。VNCはコンピュータを遠隔操作するためのRFBプロトコルを利用するリモートデスクトップソフトウェアです。

 VNCがポート番号89で動いているようなので「vnc://localhost:89」で自分のローカルホストの89番を開いてVNCサーバとしてエミュレータを作成しています。

 VNCの確認には、VNCクライアントが必要です。リモートデスクトップクライアントソフトウェアとして、Ubuntuにデフォルトで入っている「Remmina」を使いました。

hoge@rip:~/qemu/bin/debug/native$ sudo ./x86_64-softmmu/qemu-system-x86_64 -enable-kvm -m 2048 -display vnc=:89 -netdev user,id=t0, -device rtl8139,netdev=t0,id=nic0 -netdev user,id=t1, -device pcnet,netdev=t1,id=nic1 -drive file=debian_wheezy_amd64_desktop.qcow2,format=qcow2,if=ide,cache=writeback
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。