Upload
satoshi-mimura
View
54
Download
0
Embed Size (px)
Citation preview
こんなひと• みむら ( @mimura1133 / Satoshi Mimura )
• http://mimumimu.net/
• セキュリティキャンプ 2014
ソフトウェアセキュリティクラス チュータ(予定)
• SECCON 2014 CTF for Beginners の旗振り役
( http://2014.seccon.jp/2014_07_CTF_for_Beginners2.html )
• wasamusume という CTF チームの旗振り役
• 最近は土足で WinRT に入れないかいろいろ実験中
3
余談:この前。
• セキュリティキャンプ
ネットワークセキュリティクラスの問題を解く Write-up を書きました。
• 問題ファイルは pcap で、その中からファイルを出してきて解くもの。
• なんか怖い人からこんなこと言われたので:
• がんばってみました。
• https://mimumimu.net/blog/ 4
はじめに
• 話題がディープすぎるので
何となく雰囲気を感じて頂くような内容にしました。
• ガチなドライバ開発者さん:
目一杯マサカリを飛ばしたくなるかもしれません
• カーネルモードドライバ書いてみたい!という人:
別所で。15分では無理です。
8
カーネルモードとユーザモード• ユーザモード:
• 普段使うアプリケーションはここで動く
• よく見る Windows API はここで叩く。
• WoW64 もここ。
• 何かやろうとしたら Windows API やカー
ネルモードドライバを経由して指示を出す
• カーネルモード:
• HAL に直接触れられる
• Windows カーネルに必ずしもお伺いを立て
る必要なし。
• 各ビット用にプログラムを書く
ユーザモード
カーネルモード
ユーザモードドライバ
カーネルモードドライバ
Windows
カーネル
10
簡単なOS の知識おさらい
• OSによるアプリケーションの保護
• OS は各アプリケーションに
仮想的な I/O と
仮想記憶による資源を提供する。
• 各アプリケーション毎にアドレスは仮想化されており、
互いに互いの領域に侵入したり値を書き換えたりは出来ない。
• アプリケーションは個別に実行されるので落ちても大丈夫
12
カーネルモードドライバでは
• メモリアドレスは仮想化される:
• でもカーネル含んで全体で一つの仮想化テーブルを共有する
• カーネルモードドライバから
カーネルのメモリ空間にアクセスしたりその逆が出来る
• カーネルモードドライバが落ちるときは
カーネル含めて落ちる。一心同体。
13
でもいろいろと出来る
• ハードウェアに直接触っていじれる。
→ハードディスクに直接命令出せる。
• プロセスの起動を阻害する事とかできる。
• ファイアウォールとしてジャッジを下せる。
• ネットワークパケットを回収できる。
→正義の目的にも、悪い目的にもどちらにも使える。18
IRQL (割り込みレベル)
• 各コードの実行に関して
IRQL というレベルが設定されている。
• 通常実行時は
PASSIVE_LEVEL
• 緊急度の高いコールバックは
DISPATCH_LEVEL
で呼び出される。
Source IRQL
Hardware
HIGH_LEVEL クリティカルなエラー
POWER_LEVEL 電源周りのエラー
IPL_LEVEL プロセッサ間割込
CLOCK2_LEVEL
CLOCK1_LEVEL
PROFILE_LEVEL プロファイルタイマー
DIRQL I/O デバイス割込
Software
DISPATCH_LEVEL ディスパッチャ
APC_LEVEL 非同期処理 APC
PASSIVE_LEVEL スレッド実行
20
たとえば• 普通に main 関数から実行されるコード
PASSIVE_LEVEL
• タイマーを設定して呼び出されるコード
DISPATCH_LEVEL
[WdfExecutionLevelPassive を使って PASSIVE_LEVEL で呼び出すことも出来る]
• PsSetCreateProcessNotifyRoutine で設定したコールバック
PASSIVE_LEVEL
• Windows のファイアウォールとして設定したプログラムの呼び出し
DISPATCH_LEVEL
21
何か意味あるの
• これって何か意味あるの?
• 上のレベルから下のレベル
のコードは直接呼べない。
• 呼ぶとどうなるのIRQL_NOT_LESS_OR_EQUAL
で BSoD.
• 某R社のドライバで
一時期よくありました(
Source IRQL
Hardware
HIGH_LEVEL クリティカルなエラー
POWER_LEVEL 電源周りのエラー
IPL_LEVEL プロセッサ間割込
CLOCK2_LEVEL
CLOCK1_LEVEL
PROFILE_LEVEL プロファイルタイマー
DIRQL I/O デバイス割込
Software
DISPATCH_LEVEL ディスパッチャ
APC_LEVEL 非同期処理 APC
PASSIVE_LEVEL スレッド実行
22
つまり
• DISPATCH_LEVEL の例
• 波平によるカツオの呼び出し。
• クリティカル。
• 「勉強しろ」というのに
「遊んでいる」と
(許可されていない動作)
動作を強制停止させられる
(ブルースクリーン)
24
詰まったところ。
• IRQL の問題
• ディスクI/O (ファイル書き込みとかファイル作成とか)が
全部 PASSIVE_LEVEL じゃないと呼び出せない。
• でも仕掛けておいたタイマーは DISPATCH_LEVEL!
26
コード
void hogeo(int i)
{
// PASSIVE_LEVEL!!
}
void main(){
WORK_QUEUE_ITEM item;
ExInitalizeWorkItem(&item, hogeo,0);
ExQueueWorkItem(&item, DelayedWorkQueue);
} 28
イメージ
• カツオ(実行中のコンテキスト)が
波平の監視下にある(DISPATCH_LEVEL)
• 「終わったらお菓子食べるから取っといて」と
サザエに依頼する ( ExQueueWorkItem )
• 処理が終わった時に、サザエがお菓子を持って現れる
(関数のコール)
• カツオ、お菓子を食べる(処理の実行)29
コード
void hogeo(OKASHI okashi) // サザエによって呼び出される
{
// PASSIVE_LEVEL!!
}
void main(){ // ここは波平によって呼び出される
WORK_QUEUE_ITEM item;
ExInitalizeWorkItem(&item, hogeo,new OKASHI(“塩昆布”));
ExQueueWorkItem(&item, DelayedWorkQueue); // サザエにお菓子を依頼する。
} 30