〜rootkitを検出するために〜

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

第3回 侵入者の不利な情報を隠すLKM rootkitの仕組み

新町久幸
ラック
2003/5/29

今回のindex
LKMとは何か
LKMのrootkitへの応用
 「第2回 侵入者が仕掛けるrootkitの特徴を知る」では、侵入者が何を意図してシステムにrootkitを仕掛けようとするのかという観点からrootkitが備える機能を分類し、それによって何ができるのかについて解説を行った。これまでrootkitのサンプルとして紹介してきたものは、コマンドを置き換えることによって侵入者にとって不利な情報を隠すという「バイナリ置き換え型」であった。今回は、これまで紹介してきた方法とは異なる手法で侵入者にとって不利な情報を隠す、LKM rootkitについて解説したいと思う。

 LKM rootkitについての解説を始める前に、まず「LKMとは何か」ということについて理解しておく必要がある。LKMの仕組みを理解することで、LKM rootkitがどのようにして侵入者にとって不利な情報を隠しているのかを理解しやすくなるだろう。

※ご注意

他社および他組織のWebサイトなどへのポートスキャンおよびデータの取得などの行為で得た情報を侵入などに悪用するか、または同じ目的を持つ第三者に提供した時点で違法となります。ご注意ください。

本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。また、本稿を利用した行為による問題に関しましては、筆者、筆者の所属先企業、および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。

 LKMとは何か

 LKMとはLoadable Kernel Moduleの略語であり、日本語にすると「取り付け可能なカーネルモジュール」と表現することができる。この段階で多くの人が“カーネルモジュールとは何か”と疑問に思うのではないだろうか。LKMの仕組みを理解するためにも、その前提としていくつか知っておかなければならないことがある。そこで、基本的な事柄から順に確認していきたいと思う。

●コンピュータシステムにおけるカーネルの役割

 人間と機械とがコミュニケーションを行うためには、その間に入って双方とのやりとりを行う橋渡し役が必要である。コンピュータシステムにおいては、この役目をOS(オペレーティングシステム)というソフトウェアが担当しており、メモリの管理、キーボードやマウスからの入力、ディスプレイへの出力といったシステムが実装している基本的な機能から、グラフィカルユーザーインターフェイス、管理用ソフトウェアといったユーザーがコンピュータを使いやすくするためのさまざまな機能を提供している。OSが持つ機能の中でもシステムの中核となる基本機能に当たるものがカーネルと呼ばれている。カーネルには、プロセスの管理、メモリの管理、ファイルシステムの管理、デバイスの制御、ネットワークの管理といったシステムを構成するための根幹となる重要な機能が含まれている。

図1 システムモデル

 カーネルはハードウェア資源へのアクセスやシステムの制御を行うために、特権モードといわれる特別な権限で動作している。反対に、通常のプログラは非特権モードといわれる権限で動作しており、ハードウェアやシステムに対して直接アクセスできないような仕組みになっている。これがコンピュータシステムにおけるカーネルの役割である。続いて、カーネルモジュールの説明を行う。

●カーネルモジュールとは?

 カーネルモジュールとは、前述したカーネルを構成する要素(プロセス管理、メモリ管理、ファイルシステム管理、デバイス制御、ネットワーク管理など)を、機能ごとに分割した小さなプログラムの集まり(モジュール)のことである。カーネルモジュールには、メモリの管理をするためのモジュールやファイルシステムを管理するためのモジュールといったシステムの中核となる機能を提供するものから、USBが利用できるようにするモジュール、A社のBというハードウェアを利用するためのモジュールといった特定のデバイスを対象とするものなど多様なカーネルモジュールが存在している。それらが、互いに連携し合い1つのシステムを構成しているのである。

 システムに新しい機能を追加する場合や、新規のハードウェアを利用するためにはその制御を行うためのプログラムがカーネルに組み込まれている必要がある。カーネルにその処理を行うためのプログラムが存在しない場合、通常はカーネル全体を再構築しなければならない。カーネルを再構築することで、モジュール間の結び付きを見直し、連携が正確に行われるようにしているのである。

 とはいえ、一部のシステムの機能の変更や、新規のデバイスを利用するたびにカーネル全体を再構築しなければならないのは効率的ではない。かといって、システムで必要となる可能性のあるモジュールをすべてカーネル内部に組み込もうとすると、カーネルが肥大化してしまう。そこで、必要なときにモジュールをカーネルに組み込み、必要でなくなったら取り外すという動的な仕組みがカーネルに採用されるようになった。この仕組みのことを LKMというのである。カーネルモジュールはカーネルに組み込まれることによって、初めてカーネルと同様の特権モードとして動作するようになり、ハードウェアへのアクセスやシステムの制御を行うことが可能となる。

図2 LKMの仕組みによりカーネルにモジュールが追加される

 Linuxシステムにおいては、変更の頻度の低いシステムの基礎となる働きをするモジュールを静的にカーネルに組み込んでおき、変更の頻度の高いハードウェアの制御を行うモジュールをLKMとして動的にカーネルに組み込んで使用する場合が多い。LKMの仕組みが最も利用されているのは、ハードウェアのデバイスドライバとしてではないだろうか。異なるハードウェア環境においてもシステムが同じように動作するのも、新規のハードウェアを利用する際にカーネルを再構築する必要がないのもこの仕組みによるものである。

 LKMの説明が長くなってしまったが、ここまでで重要なポイントは次の3点である。

●カーネルはシステムの中核となる基本機能を提供する。
●LKMの仕組みを利用することでモジュールを動的にカーネルに組み込むことが可能である。
●カーネルに組み込んだモジュールは特権モードとして動作する。

 システムに組み込まれているカーネルモジュールは、lsmodコマンドで確認することができる。

# /sbin/lsmod
Module Size Used by
mousedev 3792 0 (unused)
hid 11648 0 (unused)
input 3200 0 [mousedev hid]
autofs 9456 1 (autoclean)
lockd 45424 0 (autoclean) (unused)
sunrpc 61520 0 (autoclean) [lockd]
pcnet32 11008 1 (autoclean)
usb-uhci 19040 0 (unused)
BusLogic 86032 2

 システムにモジュールを組み込む場合はinsmodコマンドやmodprobeコマンドを使用する。また、カーネルからモジュールを取り外す場合にはrmmodコマンドを使用する。これらのコマンドを実行するためには、root権限が必要である。カーネルモジュールに関する情報を取得する場合にはmodinfoコマンドを利用すればよい。それぞれの使用方法についてはmanコマンドなどを利用して各自で調べていただきたい。

第2回」へ LKMのrootkitへの応用

index
第3回 侵入者の不利な情報を隠すLKM rootkitの仕組み
LKM(Loadable Kernel Module)とは何か?
LKMのrootkitへの応用

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

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


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間