エンタープライズ:特集 | 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■通常のシステムコールの流れ通常のシステムコールの流れ
図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をチェックしても「改ざんされていない」という結果しか出てこない。これから紹介するローダブルカーネルモジュールのトロイの木馬も、同様にシステムコールをハイジャックして悪意のある機能をもたらすわけだ。
[TTS,ITmedia]