第 6 章 実装
6.3 検出システムのアーキテクチャ
6.3.2 カウンタの開始
カウンタの開始をする関数名は,count start とする.この関数では,以下のよ うな処理を行う.
• システムコール監視の判定
図 6.6: システムコールリダイレクトのルーチン
• システムコール引数の判定
• レジスタの初期化
• カウンタの初期化
• カウンタのセットアップ
• カウンタの開始
システムコールが発行されると,count start 関数が呼び出される.count start 関数では,はじめに発行されたシステムコールが監視の対象であるかどうかの判 定を行う.監視対象のシステムコールが発行された場合,count execution フラグ を立てる.発行されたシステムコールが監視の対象でなかった場合,以降の処理は 行われない.
ここでのシステムコール監視の判定は,システムコール番号によって判断する.
カウント対象のシステムコール番号を保持することで,事後処理でしきい値を読 み込む際にも利用する.
count executionフラグが立っている場合,システムコール引数の判定を行う.シ
ステムコールの引数が監視対象である場合,dir flag フラグを立てる.
count execution フラグ,dir flag フラグのフラグが共に立てられているときに,
レジスタの初期化,カウンタの初期化,カウンタのセットアップ,カウンタの開始 をそれぞれ行う.レジスタの初期化,カウンタの初期化はそれぞれに 0 を書き込 むことによって行う.カウンタのセットアップ,カウンタの開始は,6.2.1, 6.2.2に 記した手順で行う.
6.3.3 カウンタの停止と読み取り
カウンタの停止とカウンタの読み取りをするための処理の関数名はcount read and stop とする.この関数では,以下のような処理を行う.
• カウンタが開始されているかどうかの判定
• カウンタの停止
• カウンタの読み取り
システムコール実行後,count read and stop関数が呼び出される.count read and stop 関数では,はじめに発行されたシステムコールがカウントされていたかどうかの 判定を行う.システムコールがカウントされていた場合,カウンタの停止を行う.
カウンタの停止を行なったのち,カウント値保存用の変数に取得した値を代入す る.システムコールがカウントされていなかった場合,これらの処理を行わない.
6.3.4 カウンタ読み取り後の処理
カウンタ読み取り後の処理をするための関数名は after operationとする.この 関数では,以下のような処理を行う.
• カウンタの読み取りが行われたかどうかの判定
• 取得した値としきい値の比較
• 警告の発行
count read and stop関数の後に,after operation関数が呼び出される.after operation
関数では,はじめにカウンタの読み取りが行われたかどうかの判定を行う.カウン タの読み取りが行われていた場合,カウンタで取得した値とシステムコール番号 に応じたしきい値を比較する.しきい値を超えていた場合に,コンソールへアラー トを表示する.しきい値を超えていなかった場合,何もしない.
6.3.5 有害プログラム検出に使用するしきい値
カウントした値を比較するために利用するしきい値は,システムが正常である ときにあらかじめ取得しておく必要がある.本研究では,システムが正常である
ときに,監視対象とするシステムコールを呼び出すプログラムを実行することで 値を取得した.
表6.4,表6.5にシステムが正常時に取得した値を記す.表の値はシステムコール
を 100回実行した時の平均と分散である.また,getdents64システムコール,read システムコールを実行する場合,はじめに引数のファイルを open システムコール で開いた上で実行している.なお,ここでの実行命令数は回数,実行時間はクロッ ク数であらわされている.
表 6.4: 総実行命令数のしきい値
システムコール 引数 総実行命令数 分散
open /dev/kmem 1465 1
open /etc/passwd 1482 0
getdents64 / 9208 553676
getdents64 /proc 33951 1
read /dev/kmem 1305 10354
read /proc/net/tcp 1705496 824609
read /proc/net/udp 1286 0
表6.4の結果より,/etc/kmemを引数としたopenシステムコール,/etc/passwd を引数とした openシステムコール,/proc を引数としたgetdents64システムコー ルが発行される場合,分散が小さく,総実行命令数カウントによるシステムの汚染 検出にしきい値として利用できる.しかし,それ以外のシステムコールと引数の 組み合わせは分散が大きいため,総実行命令数カウントによるシステムの汚染検 出の指標とすることができない.
以下では,/etc/kmem を引数とした open システムコール,/etc/passwd を引 数とした open システムコール,/proc を引数とした getdents64 システムコール が発行される場合に,総実行命令数カウントによるシステムの汚染検出を行う.
表 6.5: 実行時間のしきい値
システムコール 引数 実行時間 分散
open /dev/kmem 4242 44
open /etc/passwd 3770 279
getdents64 / 30941 18134216
getdents64 /proc 110759 1496591
read /dev/kmem 10845 4652095
read /proc/net/tcp 3349358 17965741669
read /proc/net/udp 3070 1972331
また,表 6.5 の結果より,/etc/kmem を引数とした open システムコール,
/etc/passwd を引数とした open システムコールが発行される場合,分散が小さ
く,実行時間カウントによるシステムの汚染検出にしきい値として利用できる.し かし,それ以外のシステムコールと引数の組み合わせは分散が大きいため,実行 時間カウントによるシステムの汚染検出の指標とすることができない.
以下では,/etc/kmem を引数とした open システムコール,/etc/passwd を引 数としたopenシステムコールが発行される場合に,実行時間カウントによるシス テムの汚染検出を行う.