BitVisor Summit 2012

Customizing BitVisor 1.3

松原 克弥／株式会社イーゲル
2012.12.4

はじめに：BitVisorとのかかわり

2007
2008
2009
2010
2011
2012
2012.12.4

USB対応(USBメモリ暗号化、libusb互換API for ICカード）

ATAPI対応(光学メディア暗号化）

保護ドメイン
(VMM内Ring-3で動作）

ATA piggyback(VMMからディスクI/O)

TPM対応

サスペンド対応
バックグラウンドFDE(Trusted Boot、乱数生成器)(OS動作中のFull DiskEncryption)

USBドングル利用

最新VT機能の対応(バイナリライブラリのリンク)(性能向上)

BitVisor Summit 2012

2

BitVisor powered by IGEL
 導入サポート– プラットフォーム選定、動作検証– インストール、セキュリティポリシー設定、リカバリメディア作成

 受託カスタマイズ– 新たなデバイス対応、新機能実装

 ソリューション開拓– USBデバイス隠ぺい（偽装）– ICカード連携画面ロック– UEFI対応– “BitVisor for Mac”

 オープンソース・コミュニティ活動– インストールマニュアル作成– Realtek RTL8169ドライバ, ADvisorのマージ
2012.12.4

BitVisor Summit 20123

本講演の内容
BitVisor 1.3のカスタマイズに関するミニチュートリアル
 リニューアルされたビルドシステム
 多様なデバッグサポート機能
 ドキュメント化されていない内部API
Yes

BitVisorをいじりたい
Yes
BitVisorを改造したことがあるNo

最新仕様を理解してBitVisor 1.3へ移行する
2012.12.4

BitVisor Summit 2012

内部仕様を理解して改造を楽しむ
4

BitVisor 1.3 Changes

 AMD-Vマルチコア対応
 64ビットゲストOS対応
 バックグラウンド暗号化
 起動時間短縮
 高速化
 画面への描画機能（ADVisor）
 ビルドシステム改善 OpenSSL更新
 バグfix、その他機能改善
2012.12.4

BitVisor Summit 2012

5

BitVisor 1.2/1.3の起動時間
BitVisor起動に要する時間をTSCでカウントした。BitVisor 1.3は、1.2と比較して44.4%起動時間が減少している。
7E+09

6,266,251,040
6E+09

TSC

5E+09
4E+09

3,483,606,024

3E+09
2E+09
1E+09
0

BitVisor 1.2

BitVisor 1.3

測定環境: ThinkPad X200 (Core 2 Duo P8600 2.4GHz/メモリ2GB)
2012.12.4

BitVisor Summit 2012

6

BitVisor 1.3 Changes

 AMD-Vマルチコア対応
 64ビットゲストOS対応
 バックグラウンド暗号化
 起動時間短縮
 高速化
 画面への描画機能（ADVisor）
 ビルドシステム改善 OpenSSL更新
 バグfix、その他機能改善
2012.12.4

BitVisor Summit 2012

7

暗号化ディスクからのOS起動時間
GRUBメニューよりWindowsを選択した時間から、スタートアップ設定したアプリケーションが起動してWindowsデスクトップに表示されるまでの時間をストップウォッチで10回測定した。 （Windowsログインパスワードは削除状態）

BitVisor 1.2

BitVisor 1.3

020406080100120140160180

Windows起動時間（秒）測定環境: Let‘s note CF-J9 (Core i7 M640 2.80GHz/メモリ4GB、 OS:Windows7 32bit)
2012.12.4

BitVisor Summit 20128

OS上でのビルド・ベンチマーク
BitVisor無し、BitVisor 1.2、BitVisor 1.3の各条件にて、BitVisor1.3をmakeし、終了するまでの 時間をtimeコマンドで10回測定した。（BitVisorによるディスク暗号化無 ）BitVisor無し

BitVisor 1.2

BitVisor 1.3

050100150200250300350400450

make所要時間（秒）測定環境: Let‘s note CF-J9 (Core i7 M640 2.80GHz/メモリ4GB、OS:Ubuntu 12.04.1 LTS 32bit)
2012.12.4

BitVisor Summit 2012

9

BitVisor 1.3 Changes

 AMD-Vマルチコア対応
 64ビットゲストOS対応
 バックグラウンド暗号化
 起動時間短縮
 高速化
 画面への描画機能（ADVisor）
 ビルドシステム改善 OpenSSL更新
 バグfix、その他機能改善
2012.12.4

BitVisor Summit 201210

BitVisor 1.3をカスタマイズする

題材
1. VMM内で動作するタスクを追加
2. VMMから画像を表示する
3. 保護ドメインを使ってタスクを隔離する
4. ディスクからデータを読み込む

以降、このマークの場所では、実例を動作させて説明します。
2012.12.4

BitVisor Summit 2012

実演
11

ディレクトリ構成 in 1.3
boot – ブートローダ、mini OS
core – VMMコアコード
crypto - OpenSSL
drivers – PCI, ATA, USB, ネットワーク等ドライバ
idman – ICカード管理
include – ヘッダファイル
process – 保護ドメイン動作のタスク・ライブラリ
storage – ストレージ暗号化
tools – 各種ツール
vpn - VPN
2012.12.4

BitVisor Summit 201212

Makefileの変更 （１）コンパイル対象を最小限に1.3でビルドシステム（Makefile）が大幅に改善
 core/にファイルを追加

並列コンパイル可– 自動的にビルド対象（Makefileの変更は必要なし）

 新たなディレクトリを追加– 親ディレクトリのMakefileに以下の行を追加
subdirs-1 += newdir– ディレクトリ内Makefileに以下を記述
objs-1 += newfile.o process/にファイルを追加 ⇒ 後述
2012.12.4

BitVisor Summit 201213

1. VMM内動作するタスクを追加
一定周期（5秒毎）にログ出力を行うheartbeatタスク
static void heartbeat_thread (void *arg){...
for (;;) {schedule();cur = get_time();...
}thread_exit();}実演

static void heartbeat_kernel_init (void){
thread_new (heartbeat_thread, NULL, VMM_STACKSIZE);}INITFUNC (“config1”, heartbeat_kernel_init);2012.12.4

BitVisor Summit 201214

INITFUNCマクロ
VMMから呼び出される初期化関数を登録

INITFUNC(呼び出しタイミング・ラベル, 関数)
呼び出しタイミング・ラベル= 「プレフィックス＋数字」の文字列
 VMMコアからcall_initfunc(プレフィックス)で呼び出し 同じプレフィックス間はascii順にソートされて呼び出し ラベルは8文字以内

実演
2012.12.4

BitVisor Summit 201215INITFUNC:
ラベル・プレフィックス一例

起動順

2012.12.4

プレフィックス

呼び出しタイミング

globalVMM起動直後

pcpu（各）プロセッサコア開始直後

msg

メッセージI/F初期化後

vmmcall

ゲストOS I/F利用可能後

config0

mini OS 起動後

driver

ドライバの初期化時

config1

mini OS 起動＋ドライバ初期化済

suspend

サスペンド直前

wakeup（各）プロセッサ再開直後

resumeレジューム直後
BitVisor Summit 201216

デバッグ：ログ出力
 logコマンド in dbgsh– CONFIG_DBGSH=1 (vmm.dbgsh=1)– tools/dbgshにゲストOS上で動作するツール

 シリアル出力– CONFIG_TTY_SERIAL=1– 115200bps@ttyS0(COM1)で接続– core/serial.cを変更することで、他の設定も可 ネットワーク出力– CONFIG_TTY_PRO1000=1 or CONFIG_TTY_RTL8169=1(vmm.tty_pro1000=1, vmm.tty_pro1000_macに受信側MACアドレス)– ログ受け取り側は、core/tty.c:L126-129にperlスクリプトあり
2012.12.4

BitVisor Summit 201217

デバッグ：ログ出力 (contd.) 画面出力– CONFIG_VGA_INTEL_DRIVER=1, CONFIG_TTY_VGA=1– 画面がスクロールするので、動画で撮影するのがおススメ linux syslog出力– CONFIG_LOG_TO_GUEST– tools/logにあるカーネルモジュールをロード– OS上のログとVMMのログが時系列に並ぶので、OS挙動とのVMM処理のマッピング把握に便利

実演
2012.12.4

BitVisor Summit 201218

Tips:Panicログの読み方

SEGV等のエラーが発生したら‥実演

Error: An exception in VMM!
Interrupt number: 0x0E Page-Fault Exception (#PF)
CR0: 0x8000003B CR2: 0x00F20119 CR3: 0x71772000...
CPU0 RSP on interrupt: 0x42887F90 Stack information:+00 Errcode 0000000000000000 +20 RSP 0000000042887FC8+40 00000000+08 RIP00000000401566D9 +28 ...

addr2lineコマンドでソースコード該当行を見つける~/bitvisor$ addr2line –e bitvisor.elf 0x401566D9/home/matsu/bitvisor/heartbeat/kernel.c:16

2012.12.4

BitVisor Summit 201219

2. 画面に画像を描画する

画面描画API in include/core/vga.h vga_is_ready ()画面描画が可能な状態かを調べる。グラフィックH/Wが初期化されるまでに描画してしまうことを防ぐ。
 vga_transfer_image ()画像データをフレームバッファへ転送する。
 vga_fill_rect ()画面に矩形を描画する。

実演
2012.12.4

BitVisor Summit 201220

3. 保護ドメインでタスクを隔離
Ring-3特権レベルで実行されるVMM内プロセス
OS/ring-3
processApp

OS/ring-0

process

OS kernel

VM/ring-3
shell
VM/ring-0
2012.12.4

IDMan

VPN

暗号処理

保護ドメイン

VMM コア
BitVisor Summit 201221

保護ドメインの特徴

 メモリ空間が分離独立していて、他の保護ドメインやVMMコアのメモリ領域へ直接アクセス不可
VMM各機能のコンパートメント化が可能
 保護ドメインのタスクが異常終了してもVMMは継続動作
ロバストなVMMを実現

2012.12.4

BitVisor Summit 201222

保護ドメイン化

1. processの下にコードを移動–

Makefileには、以下の行を追加
bins-1 += myprocess
myprocess-objs = myprocess.c
myprocess-libs = ...

2. _start () 関数を作成–

終了時はexitprocess ()を実行すること

3. ヘッダファイル、ライブラリはprocess/libのものを使用
4. VMMコアとのやりとりはメッセージI/Fで2012.12.4

BitVisor Summit 2012

実演
23

メッセージI/F

 msgregister, msgunregister：メッセージハンドラの登録 msgopen, msgclose：メッセージ経路の確率 msgsendint：メッセージ（integer）の送信
 msgsenddesc：メッセージ（ディスクリプタ）の送信 msgsendbuf：メッセージ（バッファ）の送信 setmsgbuf：メッセージの作成

2012.12.4

BitVisor Summit 201224

メッセージI/F (contd.)

SenderReceiverd = msgopen(“name”);

msgregister(“name”,_handler, ...);...
_handler(int m, ...)
{switch (m) {case MSG_INT:...
case MSG_BUF:
p = mbuf->base; ...
}msgsendint(d, )...
setmsgbuf();
msgsendbuf(d, );msgclose(d);2012.12.4

BitVisor Summit 201225

保護ドメインを適用したタスク起動

 VMMからnewprocess()でインスタンス生成、
msgsendint()で起動
p = newprocess(“process_name”);
d0 = msgopen (“ttyin”);
d1 = msgopen (“ttyout”);
msgsenddesc (p, d0);
msgsenddesc (p, d1);
msgsendint (p, 0);...

 dbgshから起動

実演
2012.12.4

BitVisor Summit 201226

4. ディスクからデータを読み込む

保護ドメイン・ディスクI/O in process/lib/lib_storage_io.h storage_io_init ()– 開始処理 storage_io_get_num_devices ()– デバイス数をカウント、I/O前に必須な処理

 storage_io_deinit ()– 終了処理 storage_io_aread ()– 非同期ファイルread storage_io_awrite ()実演– 非同期ファイルwrite
2012.12.4

BitVisor Summit 2012

27

他の内部API USB– libusb互換API– USB通信フック

 ネットワーク– UDPパケット送信 PCI– PCI configuration spaceへのアクセスフック

 TPM– TCG BIOS API

 vmmcall2012.12.4

BitVisor Summit 201228

おわりに 最新BitVisor 1.3のススメ– サポートプラットフォームの拡充– 性能向上– 画面描画やバックグラウンド暗号化等の新機能

 BitVisor改造テクニックを紹介– Makefileの仕組み– ログ出力 “Undocumented” 内部APIの（一部を）解説– 画面描画機能– 保護ドメインとメッセージI/F– ディスクI/O

2012.12.4

BitVisor Summit 201229

おわりに‥言いたいこと
 最新BitVisor 1.3のススメ– サポートプラットフォームの拡充– 性能向上– 画面描画やバックグラウンド暗号化等の新機能

 BitVisor改造テクニックを紹介– Makefileの仕組み– ログ出力BitVisorの “Undocumented” 内部APIの（一部を）解説
エコシステムを– 画面描画機能作りましょう！
– 保護ドメインとメッセージI/F– ディスクI/O

実装したコードはオープンソースへ
2012.12.4

BitVisor Summit 201230