アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » なぜPHPアプリにセキュリティホールが多いのか? » 第25回 PHPのアキレス腱 ── セッション管理

なぜPHPアプリにセキュリティホールが多いのか?

第25回 PHPのアキレス腱 ── セッション管理

PHPにはHTTPセッション管理モジュールが標準で付いてきます。このセッションモジュールには非常に重大なセキュリティ上の脆弱性が修正されずに残っています。その脆弱性とはセッションアダプションです。

セッションアダプションとは,セッション固定化攻撃に利用される脆弱性です。PHPのセッション管理モジュールがセッションアダプションに脆弱であることは,かなり以前,何年も前から知られています。しかし,開発者の理解不足より脆弱性が放置されたままになっています。

セッションアダプションとは

セッションアダプションとは,ブラウザ等から送信された未初期化セッションIDをそのまま利用してセッションを初期化してしまう脆弱性です。ユーザが送信してきたIDでも第三者に予想できない文字列であれば大丈夫なのでは?と考える方もいると思います。その通りで第三者に予想できなければ問題ないですし,仮に予想できてもログインする際に別のセッションIDに変更できれば問題にはなりません。

セッションアダプションを理解するためにもっとも分かりやすい例は,URLやフォームに埋め込んだセッションIDを有効にしている場合の攻撃手順です。

URLベースのセッションアダプション攻撃

攻撃者はURLにセッションIDを埋め込んだメールやページを作成して,被害者にクリックさせます。セッションIDはURLに埋め込んであるので,セッションIDがランダムな文字列であっても攻撃にはとっては既知のセッションIDとなります。

  • http://target.example.com/?PHPSESSID=1234567890

セッションアダプションに脆弱なセッション管理機構は,URLに記載されたセッションIDによって初期化します(※1)。このため,攻撃者は有効なセッションIDを知るためにランダムなセッションIDを試さなくても,攻撃者が発行したセッションIDの中から有効なセッションIDを探すことができます。

※1

セッションアダプションに脆弱なセッション管理なので,存在しないセッションIDであれば新規に初期化すべきところを既知のセッションIDで初期化していまうのです。

(攻撃用の)セッションIDはメールごとやリクエストごとに別々のIDを使ってもよいですし,WebページならクリックのたびにJavaScriptを利用してユニークなセッションIDを与えても構いません。

Webページであれば,XMLHTTPRequestを利用してJavaScriptに一手間かければ,同じユーザには常に同じセッションIDで初期化するようにもできます。どのセッションIDが有効であるのか,データベースで管理することも可能です。

このように有効なセッションIDが分かれば,攻撃者は他人に成りすましてWebアカウントを利用できるようになります。

セッションアダプション対策

一般的にはセッションアダプション対策には,ログイン時にセッションIDを再生成すればよい,と解説されています。ログイン処理の前に,セッションIDを作り直す関数を呼び出すだけです。

例:セッションIDの再生成
session_regenerate_id();

PHPの場合,URLベースのだけのセッション管理をしていれば,PHPのセッション管理モジュールを使っていても,セッションIDの再生成によりセッションアダプション攻撃はできなくなります。

注意:URLベースのセッション管理はセッションID漏洩の問題をどうしても回避できないので,通常は使うべきではありません。URLベースのセッションIDのほうが安全ということではありません。

筆者が執筆した「Webアプリセキュリティ対策入門」でも,ログイン時にセッションIDを再生成するよう記載しています。実はこの対策だけでは不十分であることは,筆者が「Webアプリセキュリティ対策入門」を執筆した時点(2005年末)でも知っていました。筆者がこの本を書いている時点では,近い将来リリースされるPHPでセッションアダプション脆弱性が修正されると考えていたため解説を省略していました。

しかし,実際には現在に至るまでPHPのセッションモジュールのセッションアダプション脆弱性は修正されないままになっています。このために,本来はsession_regenerate_id関数をログイン処理を行う前に呼び出すだけでよいはずのログイン処理に,脆弱性に対応するための余計な手間が必要となっています。

脆弱性への対応法は最後に紹介します。まずはより現実的な脅威であるクッキーベースのセッション管理がなぜ(セッションアダプションに関して)危険であるのか解説します。筆者は個別のブラウザとアプリケーションやその構成に対して,どの攻撃方法が有効であるか知っています。しかし,この連載は攻撃方法を指南するための連載ではないので,個別かつ具体的な攻撃方法は解説しません。筆者が解説しないから,安全であるかというとそうではありません。

この連載を読まれているWeb開発者くらいの,通常のWebアプリケーション開発者のスキルがあれば,ここに書いてある攻撃方法は理解できます。開発者以外の方がこの記事を読まれていることは少ないと思いますが,条件が整っていれば攻撃は非常に簡単に行えると理解してください。

セッションアダプションとクッキー

先ほど「URLベースのセッション管理であれば,session_regenerate_id関数でセッションIDを再生成すれば,セッションアダプションの影響を受けない」と解説しました。実際に,URLベースのセッション管理“だけ”を利用し,適切なログイン処理を行っていれば,これから解説する脆弱性の影響を受けません。しかし,現在のPHPのデフォルト設定では,別のセキュリティ上の理由から,URLベースのセッション管理はデフォルトでは無効に設定されています。

通常のセッション管理はクッキーを利用して行われます。ブラウザのクッキーの取り扱いの仕様により,セッションアダプションに脆弱なセッション管理機構ではsession_regenerate_id関数を呼び出してもセッションアダプション脆弱性を回避できない状態が複数存在します。

クッキーの仕様

セッションアダプションがクッキーベースのセッション管理の場合にセキュリティ上の問題となる原因は,クッキーの仕様にあります。クッキーの仕様により,同じURLであっても複数のクッキー値を持つことができます。

例えば,

  • http://blog.ohgaki.net/2009/

であれば,最大4つのクッキー値 ── 同じ変数名(クッキー名)で4つの値 ── を持つことができます。

  • blog.ohgaki.net ドメインに対して“/”パスと“/2009/”パスの2つのクッキー
  • ohgaki.net ドメインに対して“/”パスと“/2009/”パスの2つのクッキー

これは,PHPのsessionモジュールのデフォルトのセッション名であるPHPSESSIDに4つの異なるクッキーを与えられることを意味します。

すべてのブラウザでどのクッキーが優先されるのか決まっており,一つのクッキーだけが送信されればよいのですが,現実は違います。ブラウザは同じクッキー名が複数ドメインや複数パスで設定されている場合,すべてのクッキーをWebサーバに送信します。ブラウザはクッキー名と値のペアを設定されている数だけ送信します。分かりやすくいうと,どのクッキーがどのドメインのどのパス用に設定されたのか,サーバ側では分からない形で,ブラウザの好き勝手な順序で送信します。

この仕様がセッションアダプションに脆弱なセッション管理機構に致命的なセキュリティ問題の原因となっています。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

  • Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

    Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

  • [改訂版]PHPポケットリファレンス

    [改訂版]PHPポケットリファレンス

トラックバック

  • PHPのSession Adoptionは重大な脅威ではない

    なぜPHPアプリにセキュリティホールが多いのか?:第25回 PHPのアキレス腱にて、大垣靖男氏がPHPのSession Adoption問題について取り上げている。大垣氏は度々この問題を取り上げているが、今のところ氏の主張に同調する人を見かけない。それもそのはずで、大垣氏の主張は間

    Tracked : #1  ockeghem(徳丸浩)の日記 (2009/05/15, 09:06)

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

読むウェブ ~本とインタラクション

ディスプレイで読む活字とそのインタラクション(interaction:相互作用)について,最新Webを紹介しながら読み解いていく。

いま,見ておきたいウェブサイト

この連載では,国内外の最新のウェブサイトを隔週更新で取り上げ,これら最新サイトの特徴や素晴らしい部分を,さまざまな角度から解説していきます。

Windows phoneアプリケーション開発入門

Windows Marcketplace for Mobileがサービス開始され,作成したアプリケーションを個人でも世界をターゲットに公開できる環境が整ってきました。これを機にWindows phoneアプリケーションの開発をしてみませんか?

ここは知っておくべき!Windows Server 2008技術TIPS

5年ぶりのサーバOSとなったWindows Server 2008が出荷されて早2年。2009年にはR2が出荷され,再び注目を集めています。発売前から実施したトレーニングによって感じた,インフラエンジニアの方々に知っておいていただきたい機能を中心にご紹介します。

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス