〜rootkitを検出するために〜

連載:インシデントレスポンスはじめの一歩

第4回 侵入者が仕掛けるLKM rootkitの実情

新町久幸
ラック
2003/7/3

 不要な情報を隠す仕組み


 では、LKM rootkitが実際にどのようにして情報を隠ぺいするのかについて解説していきたい。ここではファイル、ディレクトリ、プロセスを隠ぺいする仕組みについて解説を行うことにする。

●ファイル、ディレクトリの隠ぺい

 ファイルやディレクトリを隠ぺいする仕組みを解説する前に、システム内部でファイルがどのように管理されているのかを知る必要がある。Linuxシステムではシステムコールのsys_readdir( )関数、sys_getdents( )関数、sys_getdents64( )関数のいずれかを呼び出してディレクトリ情報を取得している。システムでは、同一ディレクトリ内に存在するファイル情報をまとめたものをそのディレクトリが持つ情報として管理している(図1)。

図1 システムが管理するディレクトリ情報

 lsコマンドやstatコマンドなどでファイル情報を取得する場合、ファイルの情報は先頭のファイル情報が格納された箱から順次参照されていく。この際、次のファイル情報が格納されている箱の場所は、いまのファイル情報が格納された箱の場所に自分の箱の大きさを加算して割り出される(図2)。

図2 ファイル情報の参照

 従って、図2のファイルAの箱の大きさに次に参照されるファイルBの箱の大きさを加算し、ファイルAの箱の大きさを偽ることで、システムは次のファイルを参照する際にファイルBをスキップしてファイルCにアクセスすることになる(図3)。

 システムがファイル情報を取得する際に利用するこのアプローチでは、ファイルBを発見することができないことが分かる。

図3 Bをスキップしてファイルが参照される様子

 プロセスの隠ぺい

 プロセスの隠ぺいもファイルの隠ぺいと同様の方法を用いて実現することができる。プロセスが生成される場合、/procディレクトリ以下にそのプロセス番号と同じ番号を持つディレクトリが作成される。各プロセスに関する情報はそのディレクトリ内に保存され、システムが管理を行っている。ユーザーがpsコマンドなどでプロセスの情報を取得する場合、このディレクトリを参照して情報の取得が行われる。従って、ファイルの隠ぺいと同様/procに格納されているプロセス番号を持つディレクトリを隠ぺいすることでプロセスを隠ぺいすることが可能となる。

 前章で紹介したheroinもadoreもこれらの方法を用いて、ファイルやディレクトリ、プロセスの隠ぺいを行っている。また、adoreの「ネットワークサービスの隠ぺい」で紹介したように、最終的に出力される情報を改ざんすることでこれらの情報の隠ぺいはするという方法もある。

 上記以外にも情報を隠ぺいするための方法をいくつか挙げることができる。以下にその例を挙げてみた。いずれの場合もシステムコールをフックするという基本的な仕組みは同じである。

  • 直接該当するシステムコールをフックして処理を変更する。
  • ファイルの呼び出しをリダイレクトして、別のバイナリを実行させる。
  • 最終的に出力される情報のみを変更する。
 実現するための過程は異なるが、どの方法でも最終的にユーザーの観点から見た場合に正しい情報を出力しないようにすることが可能である。このように1つの機能を実現するのにもいくつかの手段があり、その方法もLKM rootkitの種類によって異なっている。

 新たなるrootkitの誕生も考えられる?

 これまでに、バイナリ置き換え型のrootkitやLKMの仕組みを利用したrootkitを紹介してきた。しかし、2001年に従来のrootkitとは異なる、新しいテクニックを用いたSucKITが登場した。SucKITは1998年11月にSilvio Cesare氏によって考案された[Runtime Kernel Kmem Patching]というテクニックを応用して作成されている。[Runtime Kernel Kmem Patching]はメモリ内に読み込まれたカーネルの内容を直接変更することにより、任意のコードの挿入、システムコールテーブルの変更、新規システムコールの追加などを動的に行う新しいテクニックである。SucKITはこの手法を利用して作成されており、LKMのサポートを受けることなくシステムの挙動を変更することが可能である。

 このようにrootkitに用いられるテクニックは、より巧妙化することが予想され、新たなるrootkitの誕生も考えられる。

 Runtime Kernel Kmem PatchingやLKMについての詳細な技術情報については以下のサイトを参照していただきたい。

Runtime Kernel Kmem Patching
http://www.big.net.au/~silvio/runtime-kernel-kmem-patching.txt
http://packetstormsecurity.nl/9901-exploits/runtime-kernel-kmem-patching.txt

(nearly) Complete Linux Loadable Kernel Modules
http://www.thc.org/papers/LKM_HACKING.html

 今回まで4回にわたり、攻撃者の侵入で仕掛けられることの多いバックドアやトロイの木馬、rootkitについて解説を行ってきた。rootkitを中心に取り扱ってきたが、その仕組みはご理解いただけたであろうか。次回から執筆をPort139の伊原氏に交代して、攻撃者にシステムに侵入されてしまった場合にどのように対処すればよいのかについて実践的なオペレーションワークを解説していただく予定である。

第5回」へ

index
第4回 侵入者が仕掛けるLKM rootkitの実情
  Page1
代表的なLKM rootkit
Page2
不要な情報を隠す仕組み
プロセスの隠ぺい
新たなるrootkitの誕生も考えられる?

関連記事
連載:Webアプリケーションに潜むセキュリティホール
特集:クロスサイトスクリプティング対策の基本
連載:不正侵入の手口と対策

「連載 インシデントレスポンスはじめの一歩」


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間