31
Windows カーネルモードドライバで 填まった みむら (@mimura1133) 1

WHAT_A_KERNEL_IRQL

Embed Size (px)

Citation preview

Windows のカーネルモードドライバで

填まった話みむら (@mimura1133)

1

自己紹介

2

こんなひと• みむら ( @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

余談:この前。

5

こういう話ではなくてですね

→本題に戻る

6

Windows のカーネルモードドライバで

填まった話みむら (@mimura1133)

7

はじめに

• 話題がディープすぎるので

何となく雰囲気を感じて頂くような内容にしました。

• ガチなドライバ開発者さん:

目一杯マサカリを飛ばしたくなるかもしれません

• カーネルモードドライバ書いてみたい!という人:

別所で。15分では無理です。

8

そもそも「カーネルモード」ってなんぞ

•カーネル空間で動作するもの!

• 簡単ですね

•カーネルモードとユーザモードがあって・・。

9

カーネルモードとユーザモード• ユーザモード:

• 普段使うアプリケーションはここで動く

• よく見る Windows API はここで叩く。

• WoW64 もここ。

• 何かやろうとしたら Windows API やカー

ネルモードドライバを経由して指示を出す

• カーネルモード:

• HAL に直接触れられる

• Windows カーネルに必ずしもお伺いを立て

る必要なし。

• 各ビット用にプログラムを書く

ユーザモード

カーネルモード

ユーザモードドライバ

カーネルモードドライバ

Windows

カーネル

10

つまり

ユーザデータ

ユーザモードのプロセス

カーネルモードのプロセス

11

簡単なOS の知識おさらい

• OSによるアプリケーションの保護

• OS は各アプリケーションに

仮想的な I/O と

仮想記憶による資源を提供する。

• 各アプリケーション毎にアドレスは仮想化されており、

互いに互いの領域に侵入したり値を書き換えたりは出来ない。

• アプリケーションは個別に実行されるので落ちても大丈夫

12

カーネルモードドライバでは

• メモリアドレスは仮想化される:

• でもカーネル含んで全体で一つの仮想化テーブルを共有する

• カーネルモードドライバから

カーネルのメモリ空間にアクセスしたりその逆が出来る

• カーネルモードドライバが落ちるときは

カーネル含めて落ちる。一心同体。

13

つまり

ユーザモードのプロセス

障害発生

カーネルモードのプロセス

障害発生

14

15

16

つまり

ユーザモードのプロセス障害発生 カーネルモードの

プロセス障害発生

17

でもいろいろと出来る

• ハードウェアに直接触っていじれる。

→ハードディスクに直接命令出せる。

• プロセスの起動を阻害する事とかできる。

• ファイアウォールとしてジャッジを下せる。

• ネットワークパケットを回収できる。

→正義の目的にも、悪い目的にもどちらにも使える。18

そんな良さそうな環境にもカーネルならではの障壁が

IRQL のはなし

19

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

つまり

• PASSIVE_LEVEL の例:

• 中島くんによる

カツオの呼び出し。

• クリティカルではない。

• 何してもとりあえずOK

23

つまり

• DISPATCH_LEVEL の例

• 波平によるカツオの呼び出し。

• クリティカル。

• 「勉強しろ」というのに

「遊んでいる」と

(許可されていない動作)

動作を強制停止させられる

(ブルースクリーン)

24

どの状態なら何して良いかわからない• MSDN を見ると書いてある

25

詰まったところ。

• IRQL の問題

• ディスクI/O (ファイル書き込みとかファイル作成とか)が

全部 PASSIVE_LEVEL じゃないと呼び出せない。

• でも仕掛けておいたタイマーは DISPATCH_LEVEL!

26

どう解決したか

• ExQueueWorkItem を DelayedItem を引数にとって動かすと

指定した関数を PASSIVE_LEVEL で呼び出せる!

• やった!

27

コード

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

まとめ

• カーネルモードドライバは慣れると楽しい

• サザエさんのカツオはいつになったら中学生になるのだろう

• IRQL は 波平さんを思い出そう。

• 困ったらサザエさんを使おう

( ExQueueWorkItem )

• プロ生ちゃん is かわいい

31Title : Windows のカーネルモード(ryTwitter : @mimura1133