このコラムで何度も述べているように,いかにシステムの守りを固めても,不正侵入される可能性をゼロにすることはできない。このため,管理者は不正侵入された際の対応策を普段から用意しておく必要がある(関連記事)。侵入された場合の脅威の一つが「rootkit」を仕掛けられることである。rootkitとは,侵入したシステムを悪用しやすいように改変するツールの総称であり,いくつかのプログラムを組み合わせて作られている。いくら対応策を施しても,このrootkitが残ったままでは,システムは悪用され続けることになるのだ。そこで今回のコラムでは,典型的なrootkitの動作や特徴とともに,その脅威を解説したい。

rootkit の機能

 rootkit はある特定のツールを指す言葉ではない。あくまでもツールの総称である。「lrk(Linux RootKit)」や「t0rnkit」といった有名なrootkitパッケージは存在するが,これら以外のパッケージも多数存在する。自作のものもあれば,既存のパッケージに,あるコマンドを追加したものも存在する。複数のrootkitを組み合わせて使われることもよくある。

 そのため,侵入後調査の結果,仕掛けられたrootkitパッケージを特定できたとしても安心はできない。オリジナルのパッケージにはない機能が追加されていたり,他のパッケージが同時に使われていたりする可能性があるからだ。

 一般的にrootkitには以下の機能を持つプログラムが含まれている。

  1. ローカル・バックドア機能
  2. リモート・バックドア機能
  3. ネットワーク・スニファ機能
  4. 隠ぺい機能
  5. その他,侵入者にとって有益な機能

 管理者にとって直接セキュリティ上の脅威となるのは1と2のバックドア,そして3のネットワーク・スニファである。加えて,4の隠ぺい機能により,rootkitの存在やrootkitによるシステム改変を見つけることが困難になる。

 その他,rootkitによっては,DDoS(分散サービス拒否)攻撃用のクライアントや,IRC(Internet Relay Chat)クライアントなど,侵入者にとって有益なプログラムをインストールする場合もある。

権限の昇格や再度の侵入を許すバックドア

 バックドアとは,権限がないユーザーのアクセスなどを可能にするプログラムあるいは機能のことである。rootkitによりいったんバックドアが作成されれば,rootkitを仕込まれたときに使われた侵入口をふさいだとしても,再び侵入されてしまう。しかも,通常バックドアは複数個仕掛けられるので,すべてを見つけ出して取り去ることは困難である。

 バックドアには,ローカル・バックドアとリモート・バックドアがある。ローカル・バックドアは,一般ユーザーが勝手にroot権限を取得できてしまうプログラムである。/bin/login や /usr/bin/passwd など,rootのsuidビットが設定されているコマンドを改変して仕込まれることが多い。

 ローカル・バックドアが仕込まれるのは,ログインに関係するコマンドだけではない。例えば chsh(Change login shell)コマンドに仕込まれる場合もある。chshを使ってシェルを変更する際に,秘密の“rootkit password”を入力するとroot 権限を取得できてしまうのだ。

 ローカル・バックドアを“仕込む”といっても,ローカル・バックドア機能を追加したコマンドを正規のコマンドと置き換える場合もあれば,バックドアの機能以外の処理は本来のコマンドに“丸投げ”するプログラムを置く場合もある。後者の場合,ユーザーが確認できる処理は本来のコマンドによって行われているので,その挙動からバックドアが仕込まれているかどうかを判断することは難しい。

 リモート・バックドアは,リモートから直接rootとしてログインできるようにするプログラムである。デーモン・プログラムとして動作し,一般的にはTCPプロトコルの特定ポートで攻撃者からのアクセスを待ち受ける。ただ,UDPやICMPを使用するバックドア・プログラムも存在する。リモート・バックドアは,独自のデーモン・プログラムである場合もあるが,tcpdやinetd,sshdといった,既存のデーモン・プログラムを改変したものである場合もある。

ネットワーク・スニファで内部LANを盗聴

 内部ネットワークに流れるトラフィックを盗聴するために,ネットワーク・スニファをインストールするrootkitもある。

 インターネットに接続したサーバーなどについては守りを固めている組織でも,内部ネットワークではPOPやTelnetなど,パスワードを平文で流すプロトコルを利用している場合が多い。これらの情報を取得されることで,rootkitを仕込んだシステム以外への攻撃も可能としてしまう恐れがある。

痕跡を隠す機能を備える

 管理者にとって厄介なのは,rootkitはバックドアやスニファを仕込んだコマンドを既存のコマンドと置き換えるだけではないということだ。単に置き換えるだけでは管理者に発見される可能性が高い。そのため,rootkitは自身の活動の痕跡を隠す“隠ぺい機能”を備える。

 一番単純なのは,rootkitに関係するファイルを見つからないように隠すことである。通常はファイルを作らないようなディレクトリ(ユーザーがあまりアクセスしないようなディレクトリ)に,「...」や 「. (スペース付きの名前)」といった発見しにくいファイル名をつけて保存しておく。

 バックドアなどを仕込んだコマンドを既存のコマンドと置き換える場合には,同じファイル・サイズにして発見しにくくする。さらにタイプ・スタンプも同じにすれば,目視によるチェックでは,見逃してしまう可能性が高い。「Tripwire」などの整合性チェック・ツールを利用しなければ,こういった置き換えを検出することはまず難しい。

 さらに,バックドアなどを仕込んだコマンドやプログラムを見つけられないように,他の調査用のコマンド(例えば,ls や ps,top,netstat,lsof など)を置き換える場合もある。特定のファイルやプロセス,ネットワーク接続を検出できないように改ざんしたコマンドに置き換えるのだ。これにより,管理者がそのシステムで調査する限り,rootkitの存在は分からない。適切に調査するためには,調査用のコマンド(バイナリ)を,改ざんされる恐れがない場所に保存しておく必要があるのだ。

 加えて,rootkitにはログを消去して管理者の調査を困難にするツールも含まれている。攻撃者はこのツールを使うことで,syslog の出力から特定のパターンの痕跡を消去したり,wtmp/utmp/lastlog といったアカウント情報を含むファイルから特定のアカウント情報を消去したりすることが可能となる。部分的に消去された場合,その部分を回りの情報から推測することは非常に困難である。

カーネル・レベルで隠ぺい

 OSが備える lkm(Loadable Kernel Module)機能を使って,さらに高度な隠ぺいを行うrootkitも存在する。lkm機能とは,システム・カーネルに動的に機能(モジュール)を追加する機能であり,最近のUNIXのほとんどが備える。この機能で追加されるモジュールがlkmである。rootkitがlkmとしてカーネルにロードされれば,rootkitは直接カーネルを操作できてしまうのである。

 lkmとして動作するrootkitならば,隠ぺいのために調査用コマンドなどをわざわざ置き換える必要はない。カーネル・レベルで任意のプロセスやファイル,ネットワーク接続を隠ぺいできてしまう。

 この場合には,他のシステムやメディアから持ち込んだ正規の調査用コマンドを使用しても,rootkitの活動を見つけることはできない。見つけるためには,別のOSから起動して lkmを無効にした上で調査するしかない。

 痕跡を隠すためだけではなく,バックドア用の“rootkit lkm”がシステムに仕込まれる恐れもある。この場合には,任意のプロセスをroot権限に引き上げたり,リモートからシェルを実行したりなど,攻撃者のやりたい放題になってしまう。管理者にとり、どれほどの脅威であるのか,言うまでもないだろう。しかも,仕掛けられている事に気付くことも難しい。システム上より保存した証拠の信頼性にも疑問が出てしまう。

rootkitの検出方法

 あの手この手で見つからないように“工夫”しているrootkitだが,検出できないわけではない。Tripwireなどのツールや,OSの監査機能を利用したサーバー侵入検知システムを用いれば,たとえrootkit自体は検出できない場合でも,rootkitの痕跡――rootkitがインストール時に残したファイルなど――を検出できる。

 バックドアと外部との通信は,ファイアウオールのログを調べたり,ネットワーク侵入検知システムを使用したりすれば検出できる。

 また,「chkrootkit」や「kstat」,「alamo」, 「checkps」といった,rootkitを検出するための専用ツールもある。例えば chkrootkit (http://www.chkrootkit.org/) は,ローカル・マシンに仕掛けられたrootkitを検出するツールである。実行すると,過去に出現したrootkitやワーム,不正なlkmが残す痕跡を順に調べて,それらがシステムに存在するかどうかを調べる。加えて,重要なコマンドが改ざんされていないか,そのシステムがネットワークを盗聴していないか(ネットワーク・インタフェースがプロミスキャス・モードになっていないか)なども調べてくれる。chkrootkitは多くのUNIXで動作する上,インストールや実行も容易である。そのため,日々の調査に利用するには最適である。システムを自動的に調査するように,cronで設定しておくのもよい。

 ただし,専用のツールも万全ではない。rootkitに仕込まれたプログラムをすべて見つけ出すことは難しいのが実情である。rootkitに“汚染”されている事実が分かる程度と考えたほうがよいだろう。

◇     ◇     ◇     ◇     ◇     ◇

 以上のように,一度侵入を許してrootkitを仕掛けられたマシンから,rootkitのすべてを取り去ることは非常に難しい。一見正常に動作しているように見えても,“裏”で何が起きているのか分からない。rootkitが仕掛けられると,そのシステムの信頼性は失われてしまうのだ。

 結局,システムを再構築しない限り,復旧させることは難しいだろう。管理者としては,こういった最悪の事態も考慮して,日ごろから業務データのバックアップを取るとともに,一貫性の保証された状態への復旧手順などを用意しておく必要がある。


若居和直(WAKAI Kazunao)
株式会社ラック セキュアネットサービス事業本部
wakai@lac.co.jp


 IT Proセキュリティ・サイトが提供する「今週のSecurity Check [一般編]」は,その週に起きたUNIX関連およびセキュリティ全般のニュースや動向をまとめた週刊コラムです。セキュリティ・ベンダーである「株式会社ラック」のスタッフの方を執筆陣に迎え,専門家の立場から解説していただきます。