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