-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 = helium.ruby-lang.orgの侵害についての報告 既報の通り、Rubyに関連する各種サービスを提供していたサーバの一つである helium.ruby-lang.org が何者かによる攻撃を受けました。 この侵害の詳細と、我々が行った対応について報告いたします。 == 時間経過 今回の侵害の時間経過を以下に示します。時刻はすべてUTCです。 5/19 今回の攻撃に使われたと推測される、CVSの脆弱性(CAN-2004-0396) が公表される 5/20 02:46 ruby-lang.org管理者が、cvs pserverサービスを提供しているホス トheliumの、Debianのcvsパッケージをアップグレード(ただし実際 にpserverサービスで利用されていた、chroot環境内のcvsパッケー ジは、手違いによりアップグレードされなかった) 5/23 11:15 (確認できた中で最も古い侵入の痕跡のタイムスタンプ) 5/27 19:03 (侵入者により設置されたと思われるバックドアの起動時刻) 5/28 09:26 ruby-lang.org管理者が、侵入された形跡を発見する 5/28 09:35 heliumをネットワークから隔離する 5/28 11:53 heliumを再起動後、メーリングリストサービスを再開する 5/29 07:28 侵害についての最初のアナウンスを公表する == 侵害時のマシンとサービスの構成 侵害当時、Ruby関連のサービスは、以下の二台のマシンによって提供されてい ました。 : helium.ruby-lang.org helium.ruby-lang.orgでは、以下のサービスを提供していました。 * CVS (cvs.ruby-lang.org) * WWW (www.ruby-lang.org/raa.ruby-lang.org) * FTP (ftp.ruby-lang.org) * RSYNC (ミラーサイト向け) * ML (@ruby-lang.org) : hydrogen.ruby-lang.org hydrogen.ruby-lang.orgでは、以下のサービスを提供していました。 * WWW (www.rubyist.net) * NFS (heliumに/homeをexport) == 侵害の詳細 heliumでは、chroot環境上でanoncvsユーザ権限により、pserverのサービスが 提供されていました。 このCVSレポジトリはRubyの開発に使用されていたもので、複数のコミッタが アカウントを持っていました。 また、コミット権限を持たないanonymousアカウントにより、ソースコードが 一般に公開されていました。 5月19日にCVSの脆弱性が公表されたため、5月20日にDebianパッケージによる CVSのアップグレードが行われていましたが、chroot環境のCVSは更新されてい なかったため、この脆弱性は修正されていない状態でした。 このような状況のもと、5/28 09:26(UTC)に、heliumの管理者により、anoncvs ユーザ権限で動作する不審なプロセスが発見されました。 侵入者によって設置された実行ファイルが複数発見されていますが、そのうち の一つはtcpの54320ポートで待機するバックドアであることがわかっており、 最初の発見時にこのプロセスは動作している状態で発見されました。 「時間経過」の時刻は、psの出力と、実行ファイルのタイムスタンプによって 判断されたものです。 ただし、linuxカーネルのフィルタリング機能によって、バックドアに対する 外部からの接続は阻止されていたことが確認されています。 また、通常pserverが作成する一時ディレクトリ(/tmp/cvs-serv<プロセスID>) はセッションの終了時には削除されているはずですが、heliumのchroot環境の /tmpには複数の一時ディレクトリが残された状態になっていました。 これは何らかの理由、おそらくは侵入者の攻撃によって、CVSプロセスが異常 終了したことを示唆しています。 この一時ディレクトリのうち、もっとも古いもののタイムスタンプは5/23 11:15(UTC)で、「時間経過」の「確認できた最初の攻撃の痕跡」はこの時刻を 指します。 また、これらの一時ディレクトリのタイムスタンプと、pserverの接続を照ら しあわせた結果、攻撃時の接続元のIPアドレスは複数であったと考えられます。 以上のような証拠から、侵入者はCVSの脆弱性を利用し、anoncvsユーザの権限 で任意のコマンドを実行できる状況を作り出したと思われます。 この状況で想定される被害は、anoncvsユーザ権限で参照できるchroot環境内 の情報の取得、および、anoncvsユーザ権限で更新可能なchroot環境内情報の 改竄および破壊です。 侵入者がanoncvsユーザ以外のアカウントを乗っ取ったり、特権ユーザへの昇 格や、chroot環境の外に対する侵害に成功した証拠は今のところ見つかってい ません。 == chroot環境外への影響の可能性 侵入者がchrootを破るためには、特権ユーザへの昇格が必要となります。 当時、heliumで利用していたLinuxカーネルは、2.4.24に2.4.25で修正され た脆弱性に対するパッチを適用したものでした。 しかし、2.4.26で修正されたsetsockopt(2)の脆弱性の修正は適用されていま せんでした。 この脆弱性を利用したDoS攻撃についてはコードも公開されていますが、実際 に特権ユーザへの昇格を行うのは困難であると考えられています。 この脆弱性を利用した特権ユーザへの昇格は、対象となる環境のカーネルイメー ジを入手できなければ、不可能と思われます。 しかし、heliumではバイナリパッケージではなく、パッチを適用したソースコー ドからビルドされたカーネルを使用していました。 したがって、この脆弱性を利用した特権ユーザへの昇格の可能性は極めて低い と考えられます。 == サービスの復旧 発見当初、侵害されたのがchroot環境のみである可能性が高いと判断し、バイ ナリパッケージの改竄がないことや、設定ファイルに問題ないことを確認の上、 もっともユーザの利便性の面で影響が大きいと考えられるメーリングリストサー ビスをhelium上で再開しました。 その後、他のサービスをheliumで再開するための確認作業を始めましたが、膨 大なファイルのすべてが影響を受けていないことを確認することは困難である と判断し、最終的に、OS環境をすべて再構築し、問題がないことが確認された サービスから順次再開することを決定しました。 再構築にあたって、heliumの代替となるマシンが必要になりましたが、リソー スの都合上、www.rubyist.netを運用していたhydrogenを利用することにしま した。 hydrogenではpserverは運用しておらず、侵害の形跡もありませんでしたが、 heliumに/homeをNFSで提供していました。 このため、念のためOSの再インストールを行い、ホスト名をlithiumとしまし た。 そして、heliumから、wwwのアナウンスページと、メーリングリストサービス を、lithiumに移行しました。 その後、heliumもOSの再インストールを行い、ホスト名をberylliumとしまし た。 外部向けのサービスについては、将来的にはすべてberylliumに移行する予定 です。 == 現在のマシンとサービスの構成 現在、Ruby関連のサービスは、以下の二台のマシンによって提供されています。 : lithium.ruby-lang.org lithium.ruby-lang.orgでは、以下のサービスを提供しています。 * CVS (開発用・非公開) * メーリングリスト (berylliumへの移行を予定) : beryllium.ruby-lang.org beryllium.ruby-lang.orgでは、以下のサービスを提供しています。 * WWW (www.ruby-lang.org/raa.ruby-lang.org/www.rubyist.net) * FTP (ftp.ruby-lang.org) * Anonymous CVS (cvs.ruby-lang.org) == 各サービスのコンテンツの検証 以下では、各サービスのコンテンツに侵入者による改竄がなかったかどうかを 検証した結果について、ご説明します。 === 前提条件 発見された侵入の痕跡の中で最も古い痕跡は5/23のものですが、この痕跡は侵 入者により乗っ取られたユーザの権限で削除可能なものであったため、我々は この日の侵入を最初の侵入であると断定することができませんでした。 CVSの脆弱性を利用した侵入の痕跡が見つかっており、heliumには、当時、侵 入に利用されうる既知の脆弱性は他になかったことから、侵入の手段はCVSの 脆弱性を利用したものだと考えられます。 このことから我々は、最初の侵入が、CVSの脆弱性(CAN-2004-0396)が公表され た5/19以後であるとの前提で、各サービスのコンテンツに改竄がないかどうか の検証を行いました。 === CVS 侵入者はCVSレポジトリの操作権限を獲得していたと思われるため、もっとも 被害が懸念されているのが、CVSレポジトリです。 侵害当時、以下の4つのCVSレポジトリがありました。 : /src ソースコード : /www WWWのデータ : /doc ドキュメント : /admin CVS用の管理ファイル このうち、/wwwと/docについてはすでに利用されていなかったため、検証を 行っていません。 また、/adminについても検証を行っておらず、現在は利用しておりません。 以下では、/srcに含まれていた、Rubyのソースコードとそれ以外の各モジュール の検証内容について説明します。 ==== Rubyのソースコード 改竄の方法としては、以下の二通りのケースが想定されます。 (1) 5/19以前の過去のcommit内容の改竄 (2) 5/19以降の通常のcommitを偽装した改竄 (1)については、外部に安全に保存されていた5/19以降のcvsupのログにより、 過去のcommit内容の改竄はなかったことが確認されています。 また、(2)については、19日以降のすべてのcommit内容に問題がないことを、 一つずつ確認いたしました。これについては、commit内容に悪意のあるコード が含まれていないこととともに、確かに正規のcommitterによってcommitされ たものであることを、commitを行った各committerに確認していただいていま す。 検証に使用した資料は、以下のURLで公開しています。 * cvsupのログ * 5/19から5/28までのcommit内容 また、上記の判断材料に加えて、以下の作業により、補足的な検証を行いまし た。 * heilium上のCVSレポジトリと、5/21に外部にcvsupによりコピーされ、以 後安全に保管されていたCVSレポジトリとを比較し、矛盾がないことを確認 しました。 * heilium上のCVSレポジトリと、2003/11/02から2004/05/27までの一日毎の スナップショットをそれぞれ比較し、矛盾がないことを確認しました。 以上のような検証結果から、我々は、CVSレポジトリの改竄はなかったと判断 いたしました。 ただし、残念ながら、上記の検証が行われたのは、今のところRubyのソースコー ドのモジュールのみについてであり、他のモジュールについては、管理グルー プによる検証は行われていません。 現在、committerのアカウントを順次回復していますので、他のモジュール については、committerによる確認が取れ次第、anonymous CVSサービスによっ て提供してまいります。 ==== Rubyのソースコード以外のモジュール /srcには、Rubyのソースコード以外に、以下のモジュールが含まれていました。 * app * lib * rough * rubicon * ruby-parser * shim * vms * pocketruby * oniguruma * mod_ruby * eruby まず、外部にCVSupによりコピーされていたレポジトリのファイルのctimeにより、 5/19以降に変更があったのは以下のファイルのみであることがわかりました。 * lib/csv/lib/csv.rb,v * lib/csv/tests/csv_ut.rb,v * lib/soap4r/lib/wsdl/xmlSchema/parser.rb,v * lib/soap4r/lib/wsdl/xmlSchema/complexContent.rb,v * lib/soap4r/lib/wsdl/parser.rb,v * mod_ruby/lib/apache/eruby-run.rb,v * mod_ruby/lib/apache/erb-run.rb,v * mod_ruby/ChangeLog,v また、このCVSレポジトリとhelium上のCVSレポジトリを比較し、それらの間に 矛盾がないことを確認しました。 ただし、pocketrubyに含まれていたバイナリファイルについては確認が取れて いません。 ruby本体にすでにwinceが取り込まれているため、pocketrubyに関してはそれ 以上の確認は行っておらず、公開もしていません。 以下では、5/19以降に変更のあった上記の各ファイルについて 説明します。 : lib/csv/lib/csv.rb,v : lib/csv/tests/csv_ut.rb,v : lib/soap4r/lib/wsdl/xmlSchema/parser.rb,v : lib/soap4r/lib/wsdl/xmlSchema/complexContent.rb,v : lib/soap4r/lib/wsdl/parser.rb,v これらのファイルについては、現在のところ確認作業が済んでいません。 lib/csv,lib/soap4rはすでにruby本体に取り込まれており、これらの モジュールはメンテナによる開発のためのみに利用されていました。 現在、cvs.ruby-lang.orgのAnonymous CVSレポジトリからは削除されて います。 今後は、別の場所にレポジトリを移動して開発が続けられる予定です。 : mod_ruby/lib/apache/eruby-run.rb,v : mod_ruby/lib/apache/erb-run.rb,v これらのファイルについては、ブランチも含むすべてのリビジョンを チェックし、問題のないことが確認されました。 また、過去にリリースされたmod_rubyのソースパッケージとの比較を 行い、矛盾のないことが確認されています。 : mod_ruby/ChangeLog,v ChangeLogに対する変更は基本的に追加のみであるため、以下の方法 により、確認を行いました。 (1) 最初のリビジョンに問題のないことを確認。 (2) 最新のリビジョンに問題のないことを確認。 (3) それ以外の各リビジョンについて、追加以外の変更があったもの のみを確認。 また、過去にリリースされたmod_rubyのソースパッケージとの比較を 行い、矛盾のないことが確認されています。 なお、mod_rubyとerubyについては、開発はSubversionに移行しているため、 モジュール名はmod_ruby-oldとeruby-oldに変更されています。 === WWW(www.ruby-lang.org) http://www.ruby-lang.org/{ja,en}/は、tDiaryによって運用されていました。 そのため、まずtDiaryの実行に問題がないことを確認するため、以下のような 作業を行いました。 * CGIプログラムに不当なコードがないことの確認 * コンテンツに不当な