2001年4月上旬,深刻なセキュリティ・ホールが相次いで発見された。FTP サーバー・プログラム「ftpd」と,時刻情報を提供するサーバー・プログラム「ntpd」のセキュリティ・ホールである。このホールが発見された頃,東京は桜が絶好の見頃であった。花見の最中に会社からの呼び出しを受けたシステム管理者もいるのではないだろうか。

 いずれも,バッファ・オーバーフローが原因でリモートからの攻撃を可能にしてしまう深刻なセキュリティ・ホールである。今回のコラムでは,この2件のセキュリティ・ホールについて解説する。

ftpd のバッファ・オーバーフロー

 まず ftpd のセキュリティ・ホールについて解説しよう。このセキュリティ・ホールは,米Network Associates の COVERT 研究所により2001年4月9日に発表された。同研究所のアドバイザリ(「Globbing Vulnerabilities in Multiple FTP Daemons」 )によれば,複数のOSに含まれている ftpd にはバッファ・オーバーフローが発生する問題があるという。悪用されるとリモートから管理者権限で侵入されてしまう恐れがある。このセキュリティ・ホールは ftpd の中で使われている「glob()関数」に原因がある。そこで,まずはこの関数について簡単に説明しよう。

ファイル名を展開する「glob()関数」

 ユーザーにファイル名などの入力を求めるプログラムの中には,省略した入力を展開する機能を持つものがある。ftpd もその一つだ。

 例えば,FTP サーバーにログインした後,

MGET a*
とコマンド入力して実行すると,カレント・ディレクトリ中の「a」から始まるファイルすべてをFTP サーバーからダウンロードできる(「MGET」は複数のファイルをダウンロードするコマンド)。「a*」というファイルをダウンロードするわけではない。すなわち,「a*」という文字列は「a で始まるすべての文字列」を表しているのである。このように,省略したファイル名から完全なファイル名に展開する処理を「グロビング(globbing)」と呼び,これを行うのが glob() 関数である。そして,「*」のように特殊な意味合いを持つことができる文字を「メタ・キャラクタ」と呼ぶ。

 入力の手間が省けるので,ユーザーにとっては便利な機能(関数)だが,今回発見されたセキュリティ・ホールは,この関数の実装に問題があるために発生した。

glob() 関数による展開で入力文字数が制限を超える

 通常,ftpd はそのプロンプトに対してユーザーが一度に入力できる文字数を制限している。さもないと,ftpd が文字列を処理するために用意している領域,すなわち「バッファ」を超えるような文字数を入力されて,バッファ・オーバーフローを引き起こす恐れがあるからだ。

 しかし,入力そのものはある特定の文字数以下であっても, 上述のグロビングが行われるとそれ以上の文字列が ftpd 内部へ渡されてしまう可能性がある。

 メタ・キャラクタの一つである「 ~ 」(チルダ)を例にとって考えてみよう。チルダは,通常は指定されたユーザーのホーム・ディレクトリを指し示すように glob() 関数により展開される。例えば,「~itpro」と入力すると「/usr/home/itpro」とフル・パス表記に展開されるのだ。すなわち,「~itpro/xxxx.....」(xxxx.....は任意の文字列)が制限数以下でも,「/usr/home/itproxxxx.....」と展開された後ではバッファ・オーバーフローを引き起こす可能性がある。

 もしもバッファからあふれる文字列を巧妙に操作できれば,ftpd が実行されている権限で任意のコードを実行することが可能となる。実際には,問題のある ftpd は大抵の場合「inetd」から実行されているため,管理者権限を奪取されることになる。

 上記ではチルダを例にとったが,この問題は *, ?, [, ], {, } といったほかのメタ・キャラクタでも発生させることが可能である。

 さらに,メタ・キャラクタの問題以外にも,特定の glob() 関数の実装に問題がある。詳細は割愛するが,内部ユーティリティ機能にバッファ・オーバーフローを生じさせてしまう問題がある。この問題もメタ・キャラクタの問題と同様に,入力した文字列が異常に長い文字列に展開されてしまい,バッファ・オーバーフローが発生する。

 対策はパッチを適用することなど。ベンダーごとの情報が米CERT/CCのアドバイザリ(「CA-2001-07 File Globbing Vulnerabilities in Various FTP Servers」)にまとめられているので参照してほしい。なお,このアドバイザリの邦訳版は弊社 Web ページで公開中である。また,これを機に 「wu-ftpd」 や 「proftpd」 に代表されるような,保守がきちんと続けられている ftpd へ移行することも,この問題の回避策の一つだ。

ntpd のバッファ・オーバーフロー

 次に,ntpd のバッファ・オーバーフロー問題を紹介する。この問題は 2001 年 4月4日に Przemyslaw Frasunek 氏によって Bugtraq メーリング・リストに報告されたものである。

 NTP とは「Network Time Protocol」の略称であり,インターネットのような広域ネットワークにおいて,ネットワーク上に存在するホスト同士の時刻を同期させるためのプロトコルである。一般的に,ネットワーク上の時刻情報を提供するサーバーを NTP サーバーと呼ぶ。この NTP サーバーによく利用されるソフトウエア・パッケージが Dave Mills 氏が中心となって開発が進められている「ntp」である。ntpにはntpクライアント・ソフトとntpd(サーバー・ソフト)などが含まれる。

 ntp クライアントは ntpd が稼働しているサーバーに時刻情報を要求して取得し,クライアントが実行しているシステムの時刻情報をこれに合わせる。トランザクション処理などを行うために正確な時刻が必要なシステムにとっては不可欠のネットワーク・サービスといえよう。

 そんな ntpd にバッファ・オーバーフローの問題が発見された。ntp クライアントから,異常に長い文字列を引数としたあるコマンドが送られると,ntpd はこの要求に対する応答を作成しようする。その際に ntpd 内部ではバッファ・オーバーフローが発生する。ntpd は通常管理者権限で実行されているので,これを悪用すれば管理者権限で任意のコードを実行できてしまう。

 このセキュリティ・ホールの影響を受けるのは「ntp-4.x」系。また,「xntpd 3.x」系「CISCO IOS 11.x」でも,この問題が発生する可能性があると報告されている。これら以外のNTPサーバー・ソフトにも問題がある可能性があるので,各ベンダーに確認をすることを筆者は推奨したい。

 なお,「ntp-4.x」系 および「xntpd 3.x」系を使用している場合には,「ntp-4.0.99k23」 へアップグレードすることでこの問題を解消できる

再現性を確認

 筆者が所属する「ラック SNS(Secure Net Service)」チームは,この ntpd の問題を再現することに成功した。前述の Bugtraq メーリング・リストでは,「FreeBSD 4.2-STABLE + ntp-4.0.99k」用と「RedHat Linux 7.0 + ntp-4.0.99k-RPM 」用の再現ツールが公開されている。筆者が調査したところでは,これらのツールはローカルから ntpd にバッファ・オーバーフローを発生させ,/tmp ディレクトリに作成したシンボリック・リンクを利用して,シェルに setuid root ビットを付加できることを再現するものだ。

 今回我々が再現のために作成したツールは,ローカルからシェルに setuid root ビットを付加するのに加え,リモートからバッファ・オーバーフローを発生させ,任意のTCP ポートにバックドア *1 を作成することができるもので ある。

 再現に成功した各オペレーティングシステムと ntp のバージョンの組み合わせは以下の通りである。

  • RedHat Linux 6.2 + ntp-4.0.99f (ソースからビルドしたもの)
  • RedHat Linux 6.2 + ntp-4.0.99g (ソースからビルドしたもの)
  • RedHat Linux 6.2 + ntp-4.0.99j (ソースからビルドしたもの)
  • RedHat Linux 6.2J + ntp-4.0.99f (ソースからビルドしたもの)
  • RedHat Linux 6.2J + ntp-4.0.99g (ソースからビルドしたもの)
  • RedHat Linux 6.2J + ntp-4.0.99j (ソースからビルドしたもの)
  • Slackware Linux 7.0 + ntp-4.0.99i (ソースからビルドしたもの)
  • Debian Linux 2.2 + ntp-4.0.99i (ソースからビルドしたもの)
  • FreeBSD 2.2.8-RELEASE + ntp-4.0.99f (ソースからビルドしたもの)

 今回使用したツールを一般に公開する予定はない。しかし,我々のツール同様,より多くのオペレーティング・システムと ntp のバージョンの組み合わせに適用可能なツールが今後公開される可能性がある。十分注意が必要だ。

 また,ntp クライアントは UDP を利用して要求を行うため, 単にセキュリティ・ホールを突くだけではなく,IP Spoofing *2 を組み合わせた攻撃も考えられる。事態は深刻である。システム管理者は ntp ソフトをアップグレードするなどして,今すぐに対策をとることをお勧めする。

 なお,この再現についての詳細情報は,LAC SNS チーム セキュリティホールテストのWebページで公開中である。

◇ ◇ ◇ ◇ ◇ ◇

*1 バックドアとは,通常,プログラムの作成者や維持管理を行う人物,あるいはシステム管理者が意図的に作成してしまったセキュリティ・ホールを指す。狭義では侵入者が再侵入のために用意する,無認証でコンピュータの資源へアクセス可能な侵入口のことを指す場合がある。今回,我々が作成したツールで再現した手法では,この再侵入のために用いる侵入口を,任意の TCP ポートに作成することができたのである。

*2 IP Spoofing とは,IP アドレスを偽装し,ターゲットのホストに攻撃を行う手法のことをいう。例えば,「信頼できるホスト」として設定された IP アドレスを偽装することで,信頼できるホストになりすますことが可能である。また,攻撃元を隠蔽するために利用されることもある。


新井悠 (ARAI Yuu)
株式会社ラック コンピュータセキュリティ研究所
y.arai@lac.co.jp


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