------------------------------------------------------------------------
The Debian Project http://www.debian.org/
Debian Investigation Report press@debian.org
December 2nd, 2003
------------------------------------------------------------------------
Debian サーバクラック後の調査報告
(敬称略)
Debian administration team とセキュリティ専門家が協力して、四台のプロジェクトマシンに対する侵入で用いられた方法を特定できました。ただし、この侵入を行った人はまだ特定できていません。
パッケージアーカイブは侵入者によって変更されてはいませんでした。
The Debian administration and security teams では、これらアーカイブ (security, us, non-us) を監査のごく初期の段階でチェックし、再インストールを行いました。これがプロジェクトがセキュリティアーカイブを早期に立ち上げられ、安定版のアップデート (3.0r2) が不正操作されていないことを確認できた理由です。
プロジェクトで安定版の更新中にクラックされることを予想していたなら、関係者は更新を延期したでしょうが、今回は侵入時点では更新されたパッケージが安定版のアーカイブとミラーにインストールされた後でしたので、元に戻すわけにはいきませんでした。
パッケージの検証、つまり攻撃者によってアーカイブが変更されていないことの確認には、複数の制御データを用いた複数の手法が使われました。
時系列での事件の経過
以下では、クラックされたマシンの発見と修復に関する経過を記します。全ての時刻は UTC です。一部の時間については、正確な時間を口頭で確認していなかったため概算です。
発見
11/20 (木) の午後に、管理チームが master で kernel oops が複数出ていることに気づきました。このシステムは長期にわたってなんの問題もなく動いていましたので、ハードウェア障害の可能性を詳細に調べるためシステムの保守作業に取りかかろうとしていたところ、同時に二台目のマシンの murphy でも同じ問題が起きていることが判明し、管理者が疑いを持ちました。
同時に、ファイルシステム変更の監視のため "Advanced Intrusion Detection Environment" (package aide) をインストールしてあった klecker, murphy と gluck で/sbin/init が置き換えられていること、および /usr/lib/locale/en_US の mtime と ctime が変化していることの警告があがりはじめました。
引き続く調査で、これら両方の問題の原因が SucKIT root-kit であることが判明しました。この rootkit にはカーネルに直接インストールされるパスワードを盗む機能と、監視を回避する機能 (プロセスとファイルを隠蔽する機能) が含まれており、その副作用で発覚の原因になった oops が起きていました。
詳細な攻撃の分析
11/19 (水) の 5pm GMT ごろ、盗んだパスワードを用いて非特権開発者アカウントのログインが klecker (.debian.org) に行われました。攻撃者はその後 HTTP を用いて (この時点では) 未知のカーネル攻撃用ソースコードを送り込み、その攻撃コードを用いて root 権限を奪取しました。そのあと SucKIT rootkit がインストールされました。
同じアカウントとパスワードがマシン master にログインするのにも使われました。同じ攻撃コードで root 権限を奪われ、同じように SucKIT rootkit がインストールされました。
攻撃者は次にホスト murphy への侵入を同じアカウントで試みました。これは失敗しました。というのは murphy は制限されたマシンで、リストサーバとしてのみ動作し、限られた開発者のみがログイン可能であったためです。最初のログインの試行がうまくいかなかったため、この人物は master の root 特権を用いてバックアップのための管理者用アカウントでアクセスし、そのアカウントで murphy へアクセスしました。ここでも同様に SucKIT rootkit がインストールされました。
次の日に攻撃者は master で盗聴した結果のパスワードを用いて gluck にログインし、ここにもSucKIT rootkit がインストールがされました。
不正アクセス解析により、プログラム /sbin/init が書き換えられて rootkit がインストールされた正確な日時が明らかになりました。解析チームにより、root 権限をこれらマシンで得るのに用いられたコードが発見されましたが、これは Burneye で暗号化され、ガードされていました。この暗号化を解除し、攻撃コードにディスアセンブルをおこなったことで、セキュリティ専門家はどのカーネルバグが使われたのかを発見することができました。
カーネルメモリの上書きを行うため、brk システムコール (ページプロテクションビットが変更されます) の整数オーバフローが攻撃されていました。この攻撃により攻撃者はカーネルメモリ空間の全制御を得ることができ、メモリをいかようにも変更することができます。
このカーネルバグは Andrew Morton により9月に発見され、最近のプリリリースのカーネルについては、10月以降では修正されていましたが、そのセキュリティに対する影響は緊急なものであるとは考えられてはいませんでした。したがって、この件に関するセキュリティ勧告はどのベンダからも出されてはいませんでした。しかし、これがローカルの root 権限奪取に使えると分かったわけですから、the Common Vulnerabilities and Exposures project ではこの問題を CAN-2003-0961 として採番しました。これは先週末にリリースされたカーネル 2.4.23、および Debian セキュリティ勧告 DSA 403 で修正されています。
Linux 2.2.x ではバウンダリチェックはこれより前に行われていますので、この攻撃に対する脆弱性はありません。また Sparc と PA-RISC 向けのカーネルでは、この両アーキテクチャではユーザとカーネルアドレスは異なったアドレス空間に配置されているため、脆弱性がないと考えられています。
ここで、今回使われた攻撃コードをよく知らない人に提供するわけにはいかないことを御理解ください。また、そのことに対する問い合わせも行わないでください。
回復
マシン群をシャットダウンした後、クラックされたハードディスクのイメージが作成され、別のマシンに保存されました。これらは不正アクセス解析を行った人たちに配布されました。米国にあった三台のマシン (master, murphy, gluck) はそのあと再インストールされ、そのマシンのサービスは当面の対策管理者により確認の上一つ一つ立ち上げられました。
Klecker では、定期保守のため再インストールは延期されました。このため、セキュリティアーカイブは他のサービスより早く再度オンラインにすることができました。この時点では私たちは klecker に対するコンソールからのアクセスができなかったため、回復はリモートで行わざるを得ませんでした。ディスクイメージの作成後、Firewall ごしにネットワーク接続されたローカルマシンからのシリアルコンソール経由で rootkit を削除し、カーネルを交換して強化、バイナリの二重チェックを行い、セキュリティアーカイブを複数の外部ソースを用いて検証しました。このマシンは数週間以内に再インストールの予定です。
セキュリティ面での用心のため、LDAP の開発者アカウントは全て停止され、重要なマシンでの SSH キーは削除されました。このため、これ以上のマシンのクラックはできません。但し、これは実際上ファイルアップロードや CVS レポジトリへのアクセスといった Debian の公開サーバ上での作業を停止させてしまっています。
quantz (i.e. 全 Alioth, arch と subversion パスワード) も停止されており、SSH 認証キーも同様に削除されています。パスワード紛失システム
https://alioth.debian.org/account/lostpw.php
を使ってください。
全サービスが再度実行され、マシンが十分に安全となった時点で、LDAP をリセットして開発者が再度新規にパスワードを作成できるよう (<http://db.debian.org/password.html>) にする予定ですが、現時点ではそれがいつになるかは予測できません。
回復後、クラックされたマシンに SSH が再インストールされています。このため、これらのホストでは RSA キーとキーフィンガープリントが新しくなっています。これらのキーは作成後速やかに LDAP に含め、かつ <http://db.debian.org/machines.cgi> から入手できるようにする予定です。
影響について
!! パスワードを更新してください !!
クラックされたマシンでパスワードの盗聴がおこなわれたため、パスワードを含む外向きのコネクションもクラックされたと考えられます。つまり、それらのパスワードは攻撃者に知られてしまっています。従って、それらは直ぐに変更する必要があります。
さらに、もし誰かが Debian マシンにアクセス権限を持っていて、同じパスワードやパスフレーズやキーを他のマシンでも使っていた場合、それらをできるだけ速やかに変更することを強く推奨します。
もし、これらのマシンのどれかで SSH キーを作成して保存しており、他のマシンに対してログインするためにそれらを用いていた場合 (すなわち、.ssh/authorized_keys にインストールしていた場合) それらを直ぐに削除してください。
debian.org マシン上で発見された GnuPG/PGP 秘密鍵も Debian keyring から削除され、無効化されています。
自分のマシンのことが心配な Debian 開発者は、少なくとも chkrootkit を実行して出力結果を見てください。Matt Taggert により、最新版が woody 向けにバックポートされ、以下で提供されています。
deb http://lackof.org/taggart/debian woody/chkrootkit main
deb-src http://lackof.org/taggart/debian woody/chkrootkit main
さらに、Wichert Akkerman と Matt Taggart 両名による、用心のための詳細なリストが以下に記載されています。
http://www.wiggy.net/debian/developer-securing/
SucKIT Root-Kit
SucKIT は Phrack issue 58, article 0x07 ("Linux on-the-fly kernel patching without LKM", by sd & devik) で紹介された rootkit です。これは完全に動作する /dev/kmem を使ってロードするタイプの rootkit です。このため、カーネルにローダブルカーネルモジュールのサポートの必要はありません。これはスプーフパケットで起動される (大抵のファイアウォールをすり抜けます) パスワードで保護された逆接続をおこなうリモートアクセスシェル機能をもち、プロセス、ファイル、コネクションを隠蔽できます。
通常は、SucKIT はシステムのブート時に /sbin/init から起動され、fork してカーネルに自分自身を組み込み、バックドアをスタートし、元の init のバイナリのコピーを親 (プロセス id 1) から起動します。それ以降の /sbin/init の実行は元の init に渡されて実行されます。
Team TESO の Burneye プロテクション
Burneye は UNIX プラットフォームで ELF バイナリの解析を困難にするためのツールで、Phrack issue 58, article 0x05 ("Armouring the ELF: Binary encryption on the UNIX platform", by grugq & scut) で公表されました。 TESO の Burneye のようなツールを使うことで、攻撃者は実行形式を目的を隠すよう暗号化し、ファイアウォールをすり抜けたり、侵入監視システムのフィルタやアンチウィルスソフトウェア、そして監視者の詮索の目から目的を隠すことが可能です。
謝辞
以下の方々に、下記の各作業を行っていただきました。
連絡先
追加情報については <http://www.debian.org/> の Debian web pages を見るか、<press@debian.org> にメールをお願いします。
コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell