virtual rootkit

20
Virtual rootkit from 黒黒黒 (r00tapple)

Upload: -

Post on 14-Jun-2015

848 views

Category:

Education


0 download

DESCRIPTION

Hypervisor !!

TRANSCRIPT

Page 1: Virtual rootkit

Virtual rootkit from 黒林檎 (r00tapple)

Page 2: Virtual rootkit

[ 自己紹介 ]

Page 3: Virtual rootkit

[ 個人的疑問に ]OpenSSL の Web サイトに改ざん被害でハイパーバイザーを対象にしたハッキング問題に ..

[ 改竄方法 ]OpenSSL が使っているプロバイダーのパスワードセキュリティの不備を突いてハイパーバイザーの管理コンソールを制御され、 OpenSSL の仮想サーバが操られていた。

[ 最初に… ]

Page 4: Virtual rootkit

取りあえず、ハイパーバイザを図で見ると .. 。[ ホスト型ハイパーバイ

ザー ]  [ ペアメタル ハイパーバイザー ]

基本的に、ペアメタルの方が世間一般で言われる Hypervisor です。( イメージ掴みにくいとウェブプロキシを想像すると良い ?)

Page 5: Virtual rootkit

ring -1( リング マイナス 1)

右図を見て解る様に、 CPU モードは最高権限とされている“kernel-Mode” の ring 0 が最高権限とされています。Intel と AMD によってハードウェア仮想化サポートによってring -1 という概念が作成されました。

『 ring 0 < ring -1 !! 』

そして、 CPU メーカーは ring -1 を実施するためにいくつかの新しい CPU 命令/レジスタ/プロセッサ制御フラグを追加しました。

Picture For Wikipedia!

Page 6: Virtual rootkit

[ 追記 ]

[ 動作モード ]-vmx root モード-vmx-non-root モード

[VMCS]- 仮想マシン用の情報領域

- 動作条件 - レジスタ情報

[vmx 命令 ]-vmxon/vmxoff //vmx 操作の有効化・無効化-vmread/vmwrite //VMCS 領域の書き込みと読み込み-vmclear //vmcs 用メモリ領域の初期化-vmcall // ゲスト OS から VMM へ推移

Page 7: Virtual rootkit

HyperJacking は、実行中オペレーションシステの偽物として新しい仮想マシンを形成する必要があります。

[1] 対象に悪意ある kernel ドライバをインストール[2] 低レベル仮想化支援命令にアクセス。[3] 悪意あるハイパーバイザー用メモリー空間を作成[4] 新しい VM のための記憶空間を作成[5] 新しい VM へ動作中 0S を移動[6] 新しい VM からのコマンドをすべてトラップに掛け 悪質なハイパーバイザーを定着させる、

仮想マシンの為の設定は VMCS で VMX の CPU 命令を使用し操作され予約ページがない箇所のメモリーに保存される。

設定は、ホスト状態 / ゲスト状態 / コントロールで読み取り専用データフィールドに割り当てています。※ 分割詳細はアーキテクチャ情報参照

Hyperjacking

Page 8: Virtual rootkit

[HyperJacking 入門 ]

マルウェア的な活動しない、 hyperjacking 一部例。現在のオペレーションシステムからの値を使用し、 VMCS 中のホスト状態フィールドの初期化を要求する部分。

[--- じゃいあん .cpp から抜粋 ---]/*VMCS の中のホスト状態のフィールドをすべて初期化 */static void _hyperjack_init_vmcs_host_fields(){

uint32_t selector; uint32_t base;

uint32_t msr_lo, msr_hi;uint32_t host_rsp, host_rip;

// メモリセグメント、ベースレジスタ、コントロールレジスタx86_get_es(selector);__vmwrite(HOST_ES_SELECTOR, selector);x86_get_cs(selector);__vmwrite(HOST_CS_SELECTOR, selector);

.....

//vm-exit ハンドル…” on_vm_exit()”host_rsp = 0xdeadbeef;

__vmwrite(HOST_RSP, host_rsp);host_rip - 0xdeadbeef;__vmwrite(HOST_RIP, host_rip);

}

[※]中断されたオペレーティングシステムを再開するために保存された値を使用し VMCS 中にゲスト状態値を初期化するかもしれないが、 Hyperjack は現在のオペレーティングシステムからの値で VMCSの中のゲスト状態フィールドを初期化する。

Page 9: Virtual rootkit

UNIX vfork() システムコールのように、 2 つの異なるスレッドに実行しているオペレーティング・システムを分割します。[ 1 ] は Hypervisor として vmx-root モードで実行しているシステム[ 2 ] は仮想マシンとして vmx-non-root モードで実行しているシステム物理メモリーを共有するので、ハイパーバイザーはオペレーティングシステムのメモリに対してフルアクセス権を持っており、それを変更することができる。( ここらへんの問題は仮想メモリで対策 )

Page 10: Virtual rootkit

Hypervisor  rootkit  

Hypervisor   rootkit も技術的に難点はある物の脅威

対策としてもセキュリティソフトウェアもハードウェア支援型 ( 例 : インテル製プロセッサ VT-x を対象とした )OS よりも深いレベルで監視を行う方法が主流化。ヒューリスティック型検出エンジンを備えるなど rootkitやMBR感染型rootkit の検出する事が出来るなど。しかしハイパーバイザを使用した rootkit の検知はずいぶん前から考えられており目新しい技術ではないです。Microsoft が windows server に仮想化実装を施そうという話が出た時にはMicrosoft はハードウェアレベルで許可されていないハイパーバイザ^ーの検出をする事に AMD ・ Intel と話合うなど脅威としての認識は昔からされていた。

簡単にハイパーバイザー rootkit について触れて行きたいと思います。

Page 11: Virtual rootkit

Hypervisor   rootkit の説明の前に MBR rootkit について触れておきます。[MBR( マスターブートレコード )]MBR( マスターブートレコード ) は OS を見つける為に BIOS に指示するハードドライブの一部であり、コンピューター起動時に初期ブート・シーケンスを実行し BIOSから引き継ぐ重要な物です。 ( ハードディスクの先頭セクタにあるブートレコード )rootkit にはこのプロセスを感染させる事でその存在を隠しシステムを引き継ぐために送信されたデータを変更する事でハードウェアと OS の間で自分自身を Injectionする事がある。※ これは bootkit とも呼ばれていてる事もあります。

[hypervisor( ハイパーバイザー )]話を戻してハイパーバイザーは元々は物理コンピューター内に仮想マシンを作成し、ホストと同時に複数の OS を実行する事に可能にする仮想マシンマネージャーです。仮想ハードウェアを作成しハードウェアにアクセスする 0S によるリクエストを遮り、そのリクエストを翻訳し実ハードウェアに渡します。そこで rootkit は OS とユーザーから検知されないため悪意あるハイパーバイザーを作成する。上記で MBR を紹介した例として、 hypervisor   rootkit にも MBR rootkit に似ている物があり、それは boot プロセス間に悪意あるハイパーバイザーを作成するためにブートローダーを修正する rootkit も存在するから。そして OS を破壊しユーザーへの表示と再起動なしで実行中仮想マシンへ移行出来る。これらは CPU に組み込まれた仮想化支援機能を使用する事により可能です。

Page 12: Virtual rootkit

Hypervisor rootkit 入門

[ 図 ..vm起動シーケンス ]

[3 つの主な関数 ]

vmx-init() – VT-x機能を検出及び初期化

vmx-fork() – ゲスト OS とホストハイパーバイザー .. を実行中システムに fork

on_vm_exit() – VM終了イベント処理など ..

Page 13: Virtual rootkit

[vmx_init()]CPUID と MSR( モデル固有レジスタ )VMX の CR4 を有効VMCSC( 仮想マシンコントロールストア ) で物理メモリページ割り当てVMX 動作の許可 ---vmx_on 命令を持ったプロセッサー

[vmx_fork()]コード及びスタック ( ハイパーバイザー用データ ) を割り当て現在実行中のオペレーションシステムを VM へ移行実行中 OS の状態を VM に設定設定した実行コントロールが vm終了を最小化する様に例外や I/O アクセスなどを無視VM 実行において OS の実行を継続する。

[on_vm_exit()]VM終了イベントの処理CPUID 、 CR0-CR4 アクセス、 RDMSR/ WRMSR のような手順については、期待される動作をエミュレート CPUID 命令のコマンドを使用しバックドアを実装などに使われる。その他一般的な rootkit機能を提供する。

[CPU ID]EAX マジック値は、リクエストされた動作を示し、 root に指定されたプロセス UID を変更し指定プロセスを隠蔽する事が出来る。

主要関数について +a

Page 14: Virtual rootkit

on_vm_exit()関数のゲスト VM による CPUID 命令の実行を終了する時のイベント処理コードの構造部分。

void on_vm_exit(x86_regs_t* regs){ uint32_t error = 0, exit_reason = 0, reason, instr_len, guest_eip, guest_esp; uint32_t exit_qual = 0;//vmread 命令 VMREAD(VM_EXIT_REASON, &exit_reason); VMREAD(EXIT_QUALIFICATION, &exit_qual); VMREAD(GUEST_RIP, &guest_eip); VMREAD(GUEST_RSP, &guest_esp); VMREAD(VM_EXIT_INSTRUCTION_LEN, &instr_len);…. 。//CPU ID 命令 if ((regs->eax & 0xFFFF0000) == 0xdead0000) { int pid = regs->eax & 0xFFFF; proc_t p = proc_find(pid); if (p) { struct ucred* uc = proc_ucred(p); uc->cr_uid = 0; proc_rele(p); }

/*RDMSR と WRMSR 命令がハイパーバイザーによってどのように” vm root モード”で動作するか示す。 *///on_vm_exit()

case1 : // RDMSR x86_get_msr(regs->ecx, &(regs->eax), &(regs->edx)); break; case 2: // WRMSR x86_set_msr(regs->ecx, regs->eax, regs->edx); break;

※MSR は CPU 内部制御用のレジスタ群で、専用の RDMSR 、 WRMSR 命令を使用して MSR の読み書きを行います

Page 15: Virtual rootkit

vmx_on命令 {VT が対応しているか確認。 }vmx_on()関数

Vmcs メモリを初期化 /revision番号設定vmcs_alloc()関数と vmcs_free()関数

ついでに、 __vmwriteや __VMREAD などは vmx.h で先に定義し、こちらのプログラムで include しています。

Page 16: Virtual rootkit

最後に、 hyperjack()関数実行vmcs != NULL なら、 vmcs_free() を実行する。

Page 17: Virtual rootkit

[ 方法としては ..]デバッグレジスタを使いハイパーバイザーでもブレークポイントを設置出来る。カーネルメモリを変更しカーネル内の関数フック。プロセッサーが vmx non-root モードで動作してるか調べるvm- を作成するために vmx を使用しvm-exit イベントが発生し起きた遅れを検出。 ... など

そもそも OS よし下で動作する以上検出が困難なのですが .. 。再起動し、再ロードする事でバックドアや変更を探すためにフォレンジックする事で、メモリに Injection されハードドライブ上のファイル構造を変更しない Hypervisor   rootkit で無ければ検出は可能。勿論メモりに Injection されハードドライブ上のファイル構造を変更しない Hypervisor rootkit の場合は再起動する事で再起動後の存続は不可能。

[検出 1]

Page 18: Virtual rootkit

[Slabbed-or-not]特定ハイパーバイザー下で実行されているか検出する物。ハイパーバイザー下で実行され ..■Xen(PVM or HVM モード ハイパーバイザーのバージョン )■Vmware( ハイパーバイザーの種類 仮想化されたハードウェアモデルの検出 )※ ハードウェアモデル (hyper-v / KVM / bhyve.. など )

[Hooksafe]ハイパーバイザーの物理メモリーを使用し仮想環境内のrootkit を検出し削除又はブロックする事が出来るハイパーバイザーベースのシステム。

[ その他諸々 ]セキュリティベンダー各社が続々発表してる。

[検出 2]

Page 19: Virtual rootkit

ご清聴有り難うございましたI’m at....

Facebook:村島正浩 (むらしま まさひろ )

Twitter:r00tapple

Page 20: Virtual rootkit