〜rootkitを検出するために〜

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

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

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

今回のindex
代表的なLKM rootkit
不要な情報を隠す仕組み
プロセスの隠ぺい
新たなるrootkitの誕生も考えられる?
 「第3回 侵入者の不利な情報を隠すLKM rootkitの仕組み」ではLKMの仕組みについて解説を行い、LKM rootkitがそれをどのように利用してシステムに“うそをつかせる”かについて解説を行った。今回は現在インターネット上に出回っており、実際に侵入者(攻撃者)により仕掛けられることのある代表的なLKM rootkitをいくつか紹介しよう。また、それらが侵入者にとって不利となる情報を隠すために用いる手法について解説したいと思う。

※ご注意

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

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

 代表的なLKM rootkit

 現在、LKM rootkitと呼ばれるカーネルレベルで動作するrootkitにはさまざまな種類のものが存在している。これらはインターネット上でパッケージとして公開されているものもあれば、侵入者が自己のニーズに合わせてツールを詰め込んでカスタマイズしたパッケージもいろいろと存在する。その中でも代表的なLKM rootkitとしてheroin、Synapsys、adore、Knark、KISといったものを挙げることができる。今回は仕組みが比較的理解しやすいheroinと有名なadoreを取り上げて解説する。

●heroin

 heroinは1997年10月にコンピュータセキュリティの問題を取り扱うメーリングリストの1つであるBugTraqにRunar Jensen氏によって投稿されたLinux環境で動作するLKM rootkitである。このLKM rootkitは同年4月にhalflife氏 によって発表されたPhrack 50-05を基に作成されている。この資料には、システム上の仮想端末の活動をモニタしてキーストロークを取得するLKMが紹介されていた。

 しかし、heroinの登場以前に悪意あるLKMが表舞台に出ることはほとんどなかったため、人々のLKM rootkitに対する認知度は低くそれが脅威であるとは考えられていなかった。Runar Jensen氏は悪意あるLKMがすでに開発されシステムへの攻撃に利用されている可能性があることや、今後ユーザーに重大な影響を与える可能性があることを考慮し、悪意あるLKMの一例としてheroin.cという名のコードを公開したのだ。LKM rootkitの存在が公になったのはこれが最初であるといわれている。

 このコードはLKM rootkitが登場した初期の段階に発表されたため、その後登場するLKM rootkitに多大な影響を与えることになった。コードは非常にシンプルながら以下の重要な機能を備えている。

  • カーネルに組み込んだLKM rootkit自身の隠ぺい
  • ファイルやディレクトリの隠ぺい
  • プロセスの隠ぺい

 heroinの特徴として、デフォルトで“heroin”という文字列を含むファイル、ディレクトリ、モジュールをユーザーの目から隠ぺいすることが挙げられる。また、指定したプロセス番号を持つプロセスをpsコマンドなどから隠ぺいする機能も持っている。これらの情報の隠ぺいには第3回で紹介したシステムコールのフックの手法が用いられている。具体的にどのようにして情報の隠ぺいを行っているかについては次章で解説を行う。では、このLKM rootkitをシステムに組み込んだ場合の挙動を見ていこう。

 以下はheroinの組み込み後に、LKM rootkit自身が隠ぺいされている様子を表すものである。lsmodコマンド、および現在システムに組み込まれているモジュール情報が格納されている/proc/modulesファイルからもLKM rootkit自身が表示されていないことを確認することができる。また、隠ぺいされたモジュールはrmmodコマンドを実行してもシステムから取り外すことができない。

# ls -l
total 3
-rw-r--r-- 1 root root 2832 Jun 23 13:27 heroin.o
# insmod heroin.o
# lsmod | grep heroin
# cat /proc/modules | grep heroin
# rmmod heroin
rmmod: module heroin not loaded

 以下はファイル、ディレクトリの隠ぺいの様子を表すものである。ファイル名またはディレクトリ名に“heroin”という文字列が含まれる場合、lsやstatなどのファイル情報を取得するためのコマンドを実行しても画面に表示されない。ただし、ファイル名を直接指定した場合にはファイルへのアクセスが行えることに注目してほしい。

# ls -l
total 0
# echo "I'm invisible" > ./heroin_test
# ls -l
total 0
# cat ./heroin_test
I'm invisible

 以下はプロセスの隠ぺいの様子を表すものである。シグナル番号31を指定してkillコマンドを実行した場合にのみこの仕掛けが作動し、指定したプロセス番号を持つプロセスがpsコマンドなどで表示されなくなる。この方法で指定したプロセスは停止したのではなく、実際には稼働している。プロセス番号を直接指定した場合にはプロセスを確認することができる。

# ps -aux | grep gpm
root 826 0.0 0.0 1360 72 ? S May28 0:00 gpm -t ps/2 -m /d
# kill -31 826
# ps | grep gpm
# ps 826
PID TTY STAT TIME COMMAND
826 ? S 0:00 gpm -t ps/2 -m /dev/mouse
# ls -l /proc | grep 826
# ls -l /proc/826
total 0
-r--r--r-- 1 root root 0 Jun 23 13:18 cmdline
lrwxrwxrwx 1 root root 0 Jun 23 13:18 cwd -> /
-r-------- 1 root root 0 Jun 23 13:18 environ
lrwxrwxrwx 1 root root 0 Jun 23 13:18 exe -> /usr/sbin/gpm
dr-x------ 2 root root 0 Jun 23 13:18 fd
-r--r--r-- 1 root root 0 Jun 23 13:18 maps
-rw------- 1 root root 0 Jun 23 13:18 mem
-r--r--r-- 1 root root 0 Jun 23 13:18 mounts
lrwxrwxrwx 1 root root 0 Jun 23 13:18 root -> /
-r--r--r-- 1 root root 0 Jun 23 13:18 stat
-r--r--r-- 1 root root 0 Jun 23 13:18 statm
-r--r--r-- 1 root root 0 Jun 23 13:18 status

※補足

前述したとおり、heroinはシステムコールのフックの手法を用いてファイルやディレクトリ、プロセスの隠ぺいを行っている。しかし、現在主流となっているLinuxカーネルバージョン2.4系を利用するLinuxディストリビューションでは、heroinを組み込んでもこれらの情報を隠ぺいすることができない。

カーネル2.4系ではheroinが情報を隠ぺいする際にフックするシステムコールが拡張され、ファイルやディレクトリ情報の取得、プロセスの取得に新しいシステムコールを使用するように変更されたからだ。

そのため、このLKM rootkitをお試しいただくには、カーネルバージョン2.2系の環境で実行するか、ソースプログラムに修正を加える必要がある。

●adore

 adoreは1999年team tesoのStealth氏によって作成されたLKM rootkitである。adoreは侵入者にとって不利となる情報を隠すための機能をいくつも備えている。現在でも更新が行われており、公開されている最新のバージョンはadore-0.42となっている。

 adore (version 0.42) は以下の機能を備えている。

  • カーネルに組み込んだLKM rootkit自身の隠ぺい
  • ファイルやディレクトリの隠ぺい
  • プロセスの隠ぺい
  • ローカルバックドア(root権限でのコマンド実行)
  • ファイルのリダイレクト
  • ネットワークサービスの隠ぺい

 それぞれの機能の解説については「不正侵入の手口と対策 第4回 攻撃者が侵入後に行うバックドアの設置例 - Page2」をご覧いただきたい。adoreはheroinが実装する機能のほかにもいくつかの機能を持っている。このうちのネットワークサービスの隠ぺいに関して、興味深い手法が用いられているのでここで紹介したい。

 adoreはnetstatコマンドの出力結果から、事前に設定しておいたサービス名、またはポート番号が含まれる行を除去することでネットワークサービスの隠ぺいを行っている。システム内部では正規の処理が行われるのだが、その結果を出力するために最終的に呼び出されるシステムコールをフックして出力情報を改ざんするのである。そのため、ユーザーからは一見してポートが空いていないように見えるのだ。

 adoreがシステムに組み込まれた場合、デフォルトでサービス名が“hell”であるサービス、およびサービスポートとして2222番を使用する通信はnetstatコマンドを実行しても対象となる接続を確認することができない。

# nc -vv -l -p 2222 -e /bin/sh
listening on [any] 2222 ...


# /bin/netstat -an --inet
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN

 このように、2222番ポートで待機しているはずのサービスが表示されていないことを確認することができる。ここで注目していただきたいのは、adoreがネットワークサービスの隠ぺいを行うために使用する手法である。そこでこの仕組みを実現しているコードをadoreのソースファイルから探すと、それはadoreパッケージ内に含まれるadore.cファイルのn_write( )関数内の次の一文であることが分かる。

if (strcmp(current->comm, "netstat") == 0 ) {

 current->commは現在実行中のプロセス名が格納されたカーネル変数であり、この一文は「現在実行しているプロセスの名前が“netstat”である場合〜」という意味を表している。adoreは上記条件が成立し、出力しようとしている行の中に事前に設定された文字列が含まれる場合は、何も出力しないようにするという処理を行っている。では、実行するプロセス名が“netstat”でない場合はどのような出力結果になるのであろうか。そこで、netstatコマンドのバイナリ名を別の名前に変更して出力結果の比較を行った。

# cp /bin/netstat /bin/hoge
# /bin/netstat -an --inet
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
# /bin/hoge -an --inet
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN

 netstatコマンドを実行した場合の出力結果とは異なり、hogeコマンドを実行した場合には2222番ポートで待機しているサービスが表示されていることがお分かりいただけるであろうか。当然netstatもhogeもバイナリは同一のものである。この方法で情報の隠ぺいが行われている場合、プロセス名を変更するだけで正しい情報を得ることができる。

第3回」へ 「不要な情報を隠す仕組み」

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

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

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


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

注目のテーマ

Security & Trust 記事ランキング

本日 月間