表題の書籍を読んだ。
An Introduction to Kernel Hacking との副題の通り、悪いことをするための本というよりはそれをネタにしたFreeBSDカーネルへのいざないという感じの本。以下に紹介するようにカーネルコードに密着した話題だけが扱われている。
カーネルのソースコードに手を出してみたい気持ちはあるものの、難しそうだとか先に知らないといけない事が多そうで敷居が高そうだと感じて先へ進めない読者(筆者のことです)のハードルを下げるには丁度具合のいい本だと思う。130ページ程度と薄く、考え込むほど難しいところもなく(5章は例外)気軽に読めた。
内容は次のよう。トピック毎に内容に即した短いプログラムが提示されていて、自分で実際に試してみることができるのは非常に大きい。ただしどこか間違えると大体リブートする破目になるので、qemu上に環境を作って試す方がいい(特に5章以降)。 下心なくとも、ルートがあればこんなことも可能なのかというだけでも単純に面白い。
- 1章
カーネルローダブルモジュール(KLD)の作り方。 システムコールやキャラクタデバイスを登録するモジュールも。 - 2章
システムコールのフック。システムコールのテーブル(sysent[]
)で関数ポインタを差し替える。カーネルには他にも関数ポインタが登録されたテーブルがあり応用可能。 - 3章
カーネル内のデータを直接書き換え、実行中のプロセスを隠蔽。proc
構造体とそのリスト、またカーネル内のデータを操作する際に必要なロックについて説明してくれる。同様にしてオープンしているTCPポートの隠蔽も。 - 4章
デバイスのエントリポイントをフック。2章、3章の応用で、新しいことは何もない。たったの4ページ。 - 5章
実行中のカーネルのコードを書き換え、システムコールを乗っ取る。直接上書きする他、カーネル空間で確保したメモリに置いたコードへジャンプさせる手も。libkvmによるカーネル空間へのアクセス方法について説明してくれる。 この章では、公開されているソースコードをコンパイルして実行するだけなら簡単だが、説明された手順を自分で追体験すると多少厄介。 - 6章
tripwireのようなホストベースIDSに検出されないことを目指して5章までの手法を適用。execve
システムコールをフックして特定のプログラムの実行を別の不正なプログラムにすり替え。そのプログラムの発見を防ぐためにgetdirentries
システムコールをフック。またタイムスタンプからファイルのインストールが露見するのを防ぐため、タイムスタンプを変更するコードを一時的に無効化。 - 7章
6章までで扱ったようなルートキットをどう検出するか。検出する側も同じ技術で立ち向かう。著者の結論としては、検出は必要であるが容易ではなく、そもそも侵入されるなということらしい。この章だけは主に説明のみ。
扱われているOSのバージョンはFreeBSD 6.2 Release。
この手の本は対象とされるバージョンと現行のソースコードが乖離してきたり、そうでなくともバージョン番号が離れてくるとなんとなく読む気が失せてくるので、興味があるなら旬を逃す前に手を伸ばすのがいいと思う(6.xの間は大丈夫だろうが)。
C言語の知識と、基本的な命令が読める程度の初歩的なx86アセンブリの知識が必要。
あくまでいざないなのでカーネル内のデータなどについては題材の即した部分しか扱われず、物足りなさを感じるかも知れない。尤もそれならしめたもので次は悪魔本なりソースコード自体なりへGo!ということだろう。
関連リンク
- 書籍の公式ページ (出版社のサイト): 掲載ソースコードのダウンロード、サンプルとして2章のPDFがある。
- 著者のインタビュー (onlamp.com)
- 著者のインタビュー (bsdtalk)
- FreeBSD Developers' Handbook
Designing BSD Rootkits: An Introduction to Kernel Hacking
posted with amazlet on 07.06.29
Joseph Kong
No Starch Pr (2007/04)
No Starch Pr (2007/04)