Debian サーバ侵入の調査報告

2003 年 12 月 2 日

Debian 管理チームとセキュリティエキスパートは、ようやくプロジェクトマシン 四台への不法侵入に使用された方法を突き止めることができました。 しかし、誰がこれを行ったのかはまだわかっていません。

パッケージアーカイブが侵入者によって変更されることはありませんでした。

Debian の管理、セキュリティチームは調査と再インストールを行う過程の、 かなり早い段階でこれらのアーカイブ (security, us, non-us) をチェックしました。そんなわけで、 プロジェクトは再びセキュリティアーカイブを調査し、安定版の更新 (3.0r2) が汚染されなかったことを確認することができました。

安定版の更新と同時に侵入されることをプロジェクトが予測していれば、 関係者はそれを延期したでしょう。しかし、更新されたパッケージは、 不法侵入が発見された時間には既に安定版アーカイブとミラーサーバに入っていたので、 それを取り消すことはもうできませんでした。

異なる制御データを基にして複数の方法によりパッケージを確認しました。 するためとアーカイブが攻撃者によって変更されなかったことを保証します:

時系列

以下は、侵入されたマシンの発見、復旧を時系列で挙げたものです。 時刻はすべて UTC です。会話には正確な時間は入らないので、 時刻は推定でしかないものがあります。

発見

11 月 20 日、木曜日の夕方 (GMT)、管理チームはカーネル oopses が master にいくつかあることに気付きました。 そのシステムは長期にわたり問題なく動作していたので、 システムは、ハードウェア問題の可能性について、 より詳細に調査しようとしていました。 しかし、同時に二台目のマシン、murphy で全く同じ問題が発生していたことで管理者たちは不審に思いました。

また、klecker, murphy 及び gluck に "Advanced Intrusion Detection Environment" (パッケージ aide) をインストールしてファイルシステムの変更を監視するとほぼ同時に /sbin/init が置き換えられていると警告が始まり、 /usr/lib/locale/en_US の変更時刻と作成時刻が変わっていました。

さらなる調査によりこれらの問題の原因が両方とも SucKIT root-kit (1.3b) であることが明らかになりました。これには、パスワードを探ったり、 検出を回避する機能 (つまりプロセスやファイルを隠すツール) があり、 これがカーネルに直接インストールされました。そのことが oopses に気付かせることになりました。

詳細な攻撃分析

11 月 19 日、水曜日、午後五時頃、探り出したパスワードを使用してホスト klecker (.debian.org) 上の特権がない開発者アカウントにログイン。 攻撃者はそれから HTTP を通してソースコードを取得し、(当時は) 未知であったローカルに対するカーネルの弱点を突き、そこから root 権限を獲得しました。その後、SucKIT root-kit がインストールされました。

同じアカウントとパスワードデータが、マシン master へのログイン、 同じ弱点をついた攻撃、SucKIT root-kit のインストールに使用されました。

攻撃者はそれから、同じアカウントでホスト murphy の権限を得ようとしました。 これは murphy が制限されたマシンであったことから失敗しました。 このマシンは目的がメーリングリストのサーバだけで、 一部の開発者しかログインできなかったのです。 最初の試行がうまくいかなかったので、master の root 権限を使って、バックアップ目的で使用される管理アカウントの権限を獲得、 murphy の権限も獲得しました。

翌日、攻撃者は master で探り出したパスワードを使用して gluck にログイン、 root を獲得して、さらに SucKIT root-kit をインストールしました。

分析の結果、/sbin/init プログラムの上書きとルートキット のインストールが行われた日時、時刻が明らかになりました。 アナリストはさらに、マシン上で root 権限を得るのに使用された実行ファイルを発見しました。これは Burneye により保護され、暗黒化されていました。 セキュリティエキスパートは、弱点を細かく調べ、 どのカーネルバグが利用されたかを突き止めました。

brk システムコールにおける整数オーバフローが、カーネルメモリ (ページ変更保護ビット) の上書きに利用されました。 そうすることで、攻撃者はカーネルのメモリ空間を制御を掌握し、 メモリのどの値でも変更することが可能になりました。

このカーネルコードは九月に Andrew Morton により改善され、十月以降のリリース前カーネルにコピーされたのですが、 この改良がセキュリティとして考慮されることはありませんでした。 なので、セキュリティ報告はどのベンダからも出されませんでした。 しかし、それがローカル root 不正使用に使われることが発見されると、 Common Vulnerabilities and Exposures project プロジェクトは CAN-2003-0961 をこの問題に割り当てました。これは先週リリースされた Linux 2.4.23 で修正されています。Debian の勧告は DSA 403 です。

Linux 2.2.x ではこの前に境界チェックが行われるので、この弱点はありません。Sparc や PA-RISC のアーキテクチャではユーザとカーネルのアドレスが異なるアドレス 空間にあるため、それらカーネルにはこの弱点は無いものとも思われます。

使用された弱点を私たちが知らない誰にでも知らせるということはできない、 いうことをわかってください。そして、それを聞かないでください。

復旧

マシンのシャットダウン後に侵入されたハードディスクのイメージが作成され、 別個のマシン上に保存されました。それらは分析をしている人に分配されました。 米国にある三台のマシン (master, murphy, gluck) はその後再インストールされ、 サービスは調査の後に適切なサービス管理者により一つずつ復旧されました。

しかし、klecker では、定期保守のためにこれは延期されたので、 セキュリティアーカイブは他のサービスよりも早くオンラインにすることができました。 その時、klecker に対してコンソールアクセスもできなかったので、 復旧はリモートから行う必要がありました。ファイアフォールで分離された ネットワーク上でシリアル経由でローカルマシンにコンソールログインし、 ディスクイメージの作成後にルートキットの削除、カーネルの交換、hardened 、 バイナリの再確認、 複数の異なる外部ソースによるセキュリティアーカイブの確認が行われました。 このマシンは次の数週で再インストールされます。

セキュリティの防止策として、全開発者アカウントの LDAP の無効化、さらに重要なマシンからの SSH 鍵の削除が行われたので、 これ以上マシンに侵入することができなくなりました。しかし、これは事実上、 ファイルのアップロードや CVS リポジトリへのアクセスを伴う公開型の Debian の作業をすべてできなくすることになりました。

quantz (つまり Alioth, arch 及び subversion) で使用されていたパスワードもすべて同様に無効にされました。 SSH authorized keys もすべて同様に削除されました。 lost password system を使用して新しいパスワードを受け取ってください。

サービスがすべて再始動すると、マシンは十分に安全になり、LDAP はリセットされます。開発者は新しいパスワードを再び作成することができます。 これがいつ起こるものなのかは現在予測することができませんが。

復旧において、SSH は侵入されたマシンに再インストールされました。 そのため、これらのホストでは RSA host keys 及びそのフィンガープリントが新しくなっています。鍵は、作成されると同時に LDAP に含められます。また、ここから取得することができます。

結論

パスワードを更新してください!

侵入されたホストにおいてパスワードが探り出されたということは、 パスワードが関係する発信接続についてもすべて探り出されたと考えられる、 つまり、パスワードは攻撃者に知られていると考えるべきです。 したがって、パスワードはすぐに変更すべきです。

さらに、Debian マシンにアクセス可能で、 他のマシンや鍵に同じパスワードやパスフレーズを使っている場合は、 それぞれのパスワードやパスフレーズをできるだけ早く変更することを強く勧めます。

これらのマシンのどれかで SSH 鍵を生成または保存していて、 他のマシンへのログインに使われている (つまり、.ssh/authorized_keys にインストールしている) 場合は、それも同様に削除すべきです。

debian.org のマシンにあった GnuPG/PGP の秘密鍵は Debian キーリングから除去、使用停止されます。

自分のマシンについて心配する開発者は少なくとも chkrootkit を実行し、その出力を確認すべきです。Matt Taggart が、以下のアドレスで現行バージョンの woody へのバックポートを保守しています:

さらに、Wichert Akkerman と Matt Taggart により、問題予防措置 の詳細なリストが提供されています。

SucKIT Root-Kit

SucKIT は Phrack 58 号の記事 0x07 ("Linux on-the-fly kernel patching without LKM", by sd & devik). で公開されているルートキットです。これは、/dev/kmem を通してロードされる完全に機能するルートキット、つまり、 カーネルがカーネルモジュールのロードに対応している必要がありません。 これは偽装されたパケット (ほとんどのファイアウォール設定を迂回する)によって開始された再接続シェルへの、 パスワード保護されたリモートアクセスを提供し、 プロセスやファイル、接続を隠蔽することができます。

通常、SucKIT はシステム起動時に /sbin/init として開始され、 フォークして自分自身をカーネルにインストールし、バックドアを起動して、 元の "init" バイナリのコピーを親プロセス (pid 1) から開始させます。 以降の /sbin/init の実行は元の init にリダイレクトされます。

TESO's Burneye 防護

Burneye は、Phrack 58 号の記事 0x05 ("Armouring the ELF: Binary encryption on the UNIX platform", by grugq & scut) で公開されている、UNIX プラットフォーム上の ELF バイナリを暗黒化する方法です。 TESO's Burneye のようなツールを使って攻撃者は実行可能プログラムを変更し、 その真の目的を隠し、ファイアウォールフィルタ、侵入検出システム、 アンチウィルスソフトウェア、及び調査者の詮索から逃れます。

謝辞

報道の反応

連絡先

より詳しい情報を希望する場合は、Debian のウェブページ http://www.debian.org/ を参照するか、 press@debian.org にメールを送ってください。