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

【スクリプトインジェクション対策04】不正なセッションIDの利用がないか記録する

この記事を読むのに必要な時間:およそ 0.5 分

デフォルトのPHPセッションモジュールは,未初期化のセッションIDが送信された場合,送信されてきたセッションIDを用いてHTTPセッションを初期化してしまう問題※1があります。このため,不正なセッションIDの利用を記録するには独自のセッション管理の仕組みを利用しなければなりません。幸いPHPにはユーザ定義セッションセーフハンドラが利用できます※2)。

session_set_save_handler関数
bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )

ユーザ定義セッションセーブハンドラであれば未初期化のセッションIDを検出することも可能です。

不正なセッションIDの利用を検出するためにIPアドレスが利用できるのではないかと考える方もいるかも知れません。しかし,残念ながらリクエストを送信してきたクライアントのIPアドレスは常に同じとは限りません。

  • ダイアルアップ・公衆無線LANなどを利用し別のアクセスポイントからアクセスした場合
  • 負荷分散のため,ゲートウェイやプロキシが複数設定されており利用するゲートウェイ・プロキシが動的に変更される場合
  • Tor(トーア: 匿名性を保つためのネットワーク)などを利用した場合

身近な例では,携帯電話からWebサイトにアクセスする場合が挙げられます。携帯電話キャリアのプロキシプロキシサーバは複数台用意されているので,特定のIPアドレスからのアクセスは期待できません。しかし,携帯電話キャリアや大規模なネットワークで利用されるプロキシサーバなどのアドレスは頻繁に変更されません。不正アクセスの可能性がある接続をログし,これらの情報と併せて監視することによりいち早く問題を検出できるようになります。

対策のまとめ

  • セッションアダプションに脆弱でないセッションセーブハンドラを作成する
  • ソースIPアドレスの所有者情報などを利用して不正利用の可能性がある利用者ログを作成する
  • 上位ドメインのクッキーを削除してもよい場合は削除する
※1
セッションアダプション(Session Adoption)と呼ばれる脆弱性
※2
セッションアダプション問題の危険性はPHPの開発者に正しく理解されていないと思われます。この問題については別の記事で解説します。

著者プロフィール

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

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

URLhttp://blog.ohgaki.net/

著書

コメント

コメントの記入