エンタープライズ:特集 2003/06/10 15:23:00 更新

rootkitによるハッキングとその防御
第5回 kernel rootkitの概要 (2/4)

ローダブルカーネルモジュールによるシステムコール乗っ取り

 一例として、mkdirのシステムコールをハイジャックし、zdnetというディレクトリを作成しようとするとエラーとなる、ローダブルカーネルモジュールを利用した例を見てみよう。

 《図2》は通常のシステムコールの流れだが、《図3》はハイジャックされたときの例だ。このモジュールが読み込まれると、通常のディレクトリは作成できるものの、「zdnet」という名前のディレクトリのみ作成できなくなる。つまり、「ユーザーがzdnetというディレクトリを作成しようとした時」のみに、オリジナルのシステムコール「sys_mkdir()」ではない、ハイジャックされたシステムコール「hijack_mkdir()」が利用される。もちろん、mkdirのバイナリでは改ざんなどのすり替えは一切行われていない。

 mkdirのような実行プログラムは、必ずカーネルのシステムコールを必要とするため、システムコールがハイジャックされてしまうと、プログラム自体に改ざんを加えなくとも、意図しない動作を導き出すことができてしまうわけだ。

図2■通常のシステムコールの流れ

図2

通常のシステムコールの流れ


図3■ローダブルカーネルモジュールを利用した例

図3

ローダブルカーネルモジュールに乗っ取られた例


 ではサンプルモジュールをロードさせ、どのようにハイジャックされるのかを見ていこう。

○サンプルモジュールをコンパイルしてロードする
# gcc -c mkdir_hack.c
# insmod mkdir_hack.o
# lsmod
Module Size Used by
mkdir_hack 576 0 (unused)←モジュールがロードされていることを確認
autofs 11264 1 (autoclean)
sis900 11264 1 (autoclean)
usb-uhci 20720 0 (unused)
usbcore 49664 1 [usb-uhci]

○テストディレクトリを作成
# mkdir test
# ls
test←ディレクトリが作成されている

○zdnetディレクトリを作成
# mkdir zdnet
mkdir: cannot create directory `zdnet': メモリを確保できません
# ls
test←zdnetというディレクトリは作成できていない

 当たり前ではあるが、この時点でファイルの整合性チェックなどを行い、mkdirをチェックしても「改ざんされていない」という結果しか出てこない。これから紹介するローダブルカーネルモジュールのトロイの木馬も、同様にシステムコールをハイジャックして悪意のある機能をもたらすわけだ。

前のページ | 1 2 3 4 | 次のページ

[TTS,ITmedia]