バッファオーバーフローは乗り越えられるか? JPNIC/JPCERT/CCセミナー(1/2 ページ)

JPNICとJPCERT/CCが開催したセキュリティセミナー「知っておくべき脆弱性の基礎知識」では、発見される頻度が高く、しかも深刻な脆弱性の解説が行われた。

» 2004年10月06日 16時39分 公開
[高橋睦美,ITmedia]

 10月4日と5日にわたってJPNICとJPCERT/CCが開催したセキュリティセミナー「知っておくべき脆弱性の基礎知識」では、さまざまに存在する脆弱性の中でも数が多く、しかも深刻度の高い脆弱性について、やや掘り下げた解説が行われた。

今後注目の「HTTPレスポンス・スプリッティング」

 その1つは、Webアプリケーションを中心に、Webシステムに存在している脆弱性である。講師の塩月誠人氏(中央大学研究開発機構専任研究員)は、Web Application Security Consortium(WASC)がまとめた技術文書をベースに、大きく7つに分けてWebシステムを取り巻く脆弱性を紹介した。これによると、Webシステムの脆弱性の分類は次のとおりだ。

脆弱性 主な対策方法(一部のみ抜粋)
認証(認証設定の不備や安易なパスワードリカバリ機能など) 認証設定、連続しての認証要求の拒否
承認(セッションID管理の不備やセッション終了処理の不備など) アクセス制御設定、適切な形でセッションIDを用いる、SSLなどで経路を暗号化する
クライアントサイド・アタック(クロスサイトスクリプティングなど) 入力データとして不適切な文字列を受け付けない、パッチの適用
コマンド実行(SQLインジェクションなど) 入力データとして不適切な文字列を受け付けない、エスケープ処理の実施
情報取得(パス・トラバーサルなど) パッチの適用、入力データとして不適切な文字列を受け付けない、不要なテスト/サンプルコンテンツの削除
ロジカル・アタック(DoS攻撃など) パッチの適用、パラメータのチェック
その他 -

 塩月氏が興味深い攻撃手法として挙げたものの1つに、その他に分類される「HTTPレスポンス・スプリッティング」がある。これは、ヘッダー情報などを元に、たとえば言語に基づいて異なるページにリダイレクトさせるようなつくりのWebサイトで悪用される恐れがある手法だ。

 攻撃者は不正なリクエストを送り込み、サーバから1つではなく2つのレスポンスを受けるよう仕向ける。この2つめのレスポンスにさらに細工を施すことで、サイトのなりすましを行ったり、被害者のWebブラウザのキャッシュを汚染させたり、クロスサイトスクリプティングを仕掛けたりと、多様な攻撃が可能になるというものだ。今はまだあまり知られていない手法だが、「WASCがまとめる報告書の次のバージョンでは、独立した分類になる予定」(塩月氏)といい、注意が必要そうだ。

 同氏はこうした脆弱性を紹介した上で、Webアプリケーションの脆弱性ならではの特質にも触れた。つまり、「Webサービスの脆弱性は広く調査され、一般にも公開されている。Webアプリケーションの脆弱性はそうはいかない。基本的には個々のサイトの問題であり、皆さん自身が脆弱かどうかを調査する必要がある」という点だ。自社サイトに対する客観的なリスク判断を抜きにして、適切な対策はありえないと言う。

 なお、Webアプリケーションのセキュリティ対策としてしばしば言及される「入力文字列のチェック」だが、会場からは、実際にはシステム構成によって、どのデータにどういったチェックやサニタイジングを実施すべきかの判断が難しいという質問も挙がった。

 これには塩月氏も、「実際問題、文字列のサニタイジングは難しい」と述べ、その文字列がどういう目的で、どのように使われるのかを照らし合わせながら判断すべきとした。また、次のセッションで講師を務めたNECの古賀洋一郎氏は、入力時のチェックが原則だが、たとえばクロスサイトスクリプティングでは出力場所ごとに異なるサニタイジングをしなければならないため、出力時チェックも必要だとコメントしている。

プログラマは全知全能ではない

 Webアプリケーションの脆弱性と並んで指摘されることが多いのが、おなじみ(?)のバッファオーバーフローである。続くセッションでは、古賀氏とラックの新井悠氏がそれぞれ、バッファオーバーフローのメカニズムとその対策について紹介した。

 古賀氏は、スタックオーバーフロー/ヒープオーバーフローのほか、ダブルフリーバグやフォーマットストリングバグといった、Cで書かれたプログラムで発生しやすい脆弱性の原理や動作を説明した。

 バッファオーバーフローは、意訳的に表現すれば、バッファ(サイズ固定のメモリ領域)の容量を超えてデータを書き込むことで、本来プログラムが指し示すものとは別のアドレスを指定させるように仕向け、プログラムの挙動を捻じ曲げてしまうことだ。このとき「別のアドレス」として攻撃用コードの置かれている場所を指定し、処理を飛ばせることができれば、攻撃は成功する。このとき、一時的に確保されるメモリ領域(スタック)をあふれさせるのがスタックオーバーフロー、動的に確保されるメモリ領域(ヒープ)をあふれさせるのがヒープオーバーフローだ。

 フォーマットストリングバグの脆弱性が存在するfprintf関数もそうだが、こうした脆弱性は、規格上未定義の部分の処理に潜むことが多いという。「プログラマは全知全能である」という基本哲学に基づいてCの処理系は実装されている。しかし、プログラマが全知全能であるはずもなく、そのズレがぜい弱性の原因となっているというのが同氏の見方だ。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ