今回は,以前から深刻な被害をもたらしている「wu-ftpd site execコマンドにおけるセキュリティ・ホール」を考察する。

 毎日のように報告されているセキュリティ・ホールのほとんどは,プログラムのバグに原因がある。「プログラムのバグに基づくセキュリティ・ホール」というと,バッファ・オーバーフローを思い浮かべる読者も多いだろう。

 たしかにバッファ・オーバーフローによるセキュリティ・ホールは後を絶たないが,「wu-ftpd site execコマンドにおけるセキュリティ・ホール」はそれとは異なるセキュリティ・ホールである。どういったプログラミング・ミスがセキュリティ・ホールにつながるのかを知る上で参考になるので,その仕組みを簡単に説明する。

有名なFTPサーバー・ソフトに深刻なセキュリティ・ホール

 「wu-ftpd」とは,「Washington University ftp daemon」の略称で,非常に多くのサイトで用いられてきたFTPサーバー・ソフト(デーモン)である。特に,プログラムなどを配布する,匿名(Anonymous)FTPサーバーとして,広く使われてきた歴史的背景があり,様々なOSにも付属されるようになっている。「ringサーバー」等の著名なFTPサイトのほとんどでは,このFTPデーモンを使っていると言っても構わないだろう。

 しかし,「wu-ftpd-2.6.0」には,「SITE EXEC」というコマンドの実装にセキュリティ・ホールがあり,リモートあるいはローカル・ユーザーからの攻撃を受けて,root(管理者)権限を奪取されてしまうという重大な問題を抱えている。

 この問題への対策はwu-ftpd-2.6.1へのアップグレードか,パッチを適用することで回避できる。

入力値をそのまま関数に渡してしまうことが原因

 この問題は,SITE EXECコマンドが,ユーザーからの入力値を直接 printf()関数(正確にはvsnprintf())の書式文字*1に与えてしまうために発生する。

 SITE EXECとは,FTPサーバーの運営者が新たに追加したコマンドを,ユーザーが実行できるというコマンドである。最近のGUIを駆使したFTPクライアントに頼り切っている場合には使わないだろうが,昔からのユーザーならば,使ったことがあるだろう。欲しいファイル(例えば,X11R5のアーカイブ)を探すために,SITE EXECコマンドを使って,サイト内のファイル一覧を表示させたり,ファイル検索をしたことを懐かしく思うユーザーも多いはずだ。

 さて,wu-ftpd 2.6.0のソースを調べてみよう。すると,SITE EXECコマンドの処理部分では,ユーザーの入力値を,そのままvsnprintf()関数の書式文字に渡してしまっている。vsnprintf()関数は可変フォーマットを指定できるので,悪意があるユーザーがリモートから意図したコードを流し込み,実行させることが可能になる。

 その結果,例えばスタック上のリターン・アドレスの値などといった重要なデータを上書き可能にできる(ただし,これは試行錯誤を必要とし,それほど容易ではない)。そしてさらに,一度上書きができてしまうと,上書きされたEIP*2 とroot権限で実行される意図的な実行コードを示したシェル・コードへ,関数から処理を向かわせることができてしまう。

バッファ・オーバーフローとは異なる

 リターン・アドレスの上書きということで,「バッファ・オーバーフロー」を想像する読者もいるだろうが,この問題はそれとは異なる。

 バッファ・オーバーフローは,プログラマが想定した,ユーザーが入力するであろう文字数を超えた文字列を入力して,バッファ(文字列を格納するために準備した領域)をあふれさせて(フロー),重要なデータ(例えばリターン・アドレス)を上書きしてしまい,プログラムの支配権(制御)を攻撃者が奪う手法である。

 今回の問題は,想定外の文字列を入力された場合(想定内のバッファ範囲で),関数仕様に従って悪意ある行為が可能であるという問題である。これらは,バッファ・オーバーフローとは明確に区別されねばならないだろう。

 現象が異なるとはいえ,バッファ・オーバーフローも今回の問題も,プログラマのミスによるセキュリティ・ホールであることは間違いない。これらの問題は,ユーザーからの入力値を確認していないこと,すなわち,処理できる適切な文字列,適切な文字数であるかのチェックをしていないことに起因している。このような入力チェックは当然考えられるべきものであり,それがないのは単純ミスによるものだ。

 今回と同様の問題は,今後も起こり得る。人間が作成するプログラムにこうしたミスは付き物であり,増えることはあっても,減ることはないからだ。「プログラムのバグに潜むセキュリティ・ホール」を突かれないためにも,システム管理者には,情報収集を怠らず,速やかに対処を施してもらいたい。

*1 printf()関数で使用する書式指定子のこと。例えば,%d,%f,%pなど。

*2 Enhanced Intercept Pointerの略。次に処理が行われる関数へのポインタを格納する場所のこと。そのため,このEIPを書き換えれば,プログラマが意図した処理ではなく,攻撃者が意図した処理を実行させることが可能になる。

【参考URL】

SecurityFocus vulnerability Database 2000-06-22- Wu-Ftpd Remote Format String Stack Overwrite Vulnerability

CERT勧告 (CA-2000-13) 英語

CERT勧告 (CA-2000-13) 邦訳


足利 俊樹(Ashikaga Toshiki)
株式会社ラック 不正アクセス対策事業本部
ashikaga@lac.co.jp


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