
第4回 安全なセッション管理を実現するために
安西 真人三井物産セキュアディレクション株式会社
テクニカルサービス事業部
技術グループ Webセキュリティチーム
エンジニア
2006/8/1
ログイン前とログイン後でセッションIDが変化しない
セッション固定攻撃が成立する最後の条件はログイン前とログイン後でセッションIDが変化しないことだ。セッションIDを変化させるためには明示的な実装が必要となるから、意識して実装されていない限り条件が成立する可能性は高いといえるだろう。
ほかの条件については、独自に機能拡張されたアプリケーションサーバやフレームワークを使用するなど、複雑な対策が必要となるが、最後の条件だけは、容易な実装で対策することが可能である。
対策:
・ログイン成功時にセッションIDを再発行する
セッションIDを変化させるには、ログインが成功したらセッションIDを再発行させればよい。再発行の時点でセッションIDは攻撃者にとって未知の値となるため、セッション固定攻撃は成功しなくなる。具体的には以下のような実装となる。
| /** ログイン処理を実行して成功したらセッションを再発行 */ if (login(userId, password)) { request.getSession(true).invalidate(); HttpSession session = request.getSession(true); // sessionにログイン情報をセット } |
・認証Cookieを別途用意して、セッション情報と関連付ける
ショッピングサイトなどにおいては、ログイン前に選択した商品購入情報をセッション変数に格納し、ログイン後にも継続して使いたいという要件もあるだろう。この場合、ログイン時にセッション情報をクリアすることはできない。
このような問題は、セッション管理用のCookieのほかに、認証用のCookieを別途用意することで柔軟に解決することが可能である。具体的には、下の実装のように、ログイン成功の段階で認証用のCookieを別途発行し、セッション情報と関連付けるようにすればよい。
| /** ログイン処理を実行して成功したら認証Cookieを発行 */ if (login(userId, password)) { HttpSession session = request.getSession(true); // 充分な強度を持つ認証IDを生成する String authId = 認証ID生成処理; Cookie authCookie = new Cookie(“Auth”, authId); // 認証Cookieをセッションに結びつける session.setAttribute(“AuthId”, authId); response.addCookie(authCookie); } |
| /** 認証状態のチェック処理 */ Cookie[] cookies = request.getCookies(); Cookie authCookie = null; String authId = null; for (int i = 0; i < cookies.length; i++) { if (cookies[i].getName().equals("Auth")) { authCookie = cookies[i]; authId = authCookie.getValue(); } } HttpSession session = request.getSession(true); if (authId != null && authId.equals(session.getAttribute("AuthId"))) { // 認証チェック成功 } else { // 認証チェック失敗 } |
いずれかの対策を取っていれば、セッション固定攻撃が成功することはなくなる。
攻撃者がセッション固定攻撃のわなをしかける際には、攻撃者が知り得るセッションIDを正規ユーザーに使用させなければならない。WebサイトやWebブラウザにセキュリティホールが存在しない限り、ほかのユーザーのCookie値を操作することはできないが、任意のURLへのリクエストを発行させることは容易である。
URLによってセッションIDの指定が可能なStrutsでは任意のセッションIDを付加したリクエスト発行のわなを仕掛けられる可能性が高い。問題が起こり得る実装となっている場合、対策することを検討していただきたい。
◆ ◇ ◆
以上、4回にわたってStrutsでWebアプリケーションを作成する際の注意点を、検査業務の中で検出されることの多い問題を中心に解説してきた。
本連載で取り上げた問題以外にも、ロジックの実装手法によって発生し得る問題はまだまだ残されている。「すべてのパラメータは書き換え可能であり、意図しない画面遷移を実行される可能性がある」ということを認識し、細心の注意を払って安全なアプリケーションを開発してもらいたい。
|
3/3
|
| Index | |
| 安全なセッション管理を実現するために | |
| Page1 セッション固定攻撃とは何か セッションID発行のタイミング |
|
| Page2 任意のセッションIDを付加したリクエスト発行のわな |
|
| Page3 ログイン前とログイン後でセッションIDが変化しない |
|
Strutsで作るセキュアWebアプリケーション バックナンバー
- 第1回 適切なエスケープ処理でXSSに備える
- 第2回 サーブレットコンテナが抱える問題を認識する
- 第3回 Validatorを利用した入力値チェックの注意点
- 最終回 安全なセッション管理を実現するために
| Profile |
| 安西 真人(あんざい まさと) 三井物産セキュアディレクション株式会社 テクニカルサービス事業部 技術グループ Webセキュリティチーム エンジニア Webアプリケーションのシステム開発経験を活かし、セキュリティコンサルタントとして主にWebアプリケーションのセキュリティガイドライン策定業務などに従事している。大手保険会社、出版社などへの導入実績を持つ。 |
| Security&Trust記事一覧 |
TechTargetジャパン
- 実録、「Hardening Zero」の舞台裏 (2012/5/25)
コラムの更新頻度を落として何をやっていたかって? 「守る技術」に焦点を当てたこんなイベントを開催しました - 複雑化、巧妙化する脅威への対策は? (2012/5/23)
データ保護や標的型攻撃対策、クラウドセキュリティ……「第9回 情報セキュリティEXPO」の会場で見つけた製品を一挙に紹介 - 仮想化がはらむ新たなリスク (2012/5/17)
仮想化に伴って生じるセキュリティやパフォーマンスへの影響を慎重に考慮し、うまく制御していく方法を紹介します - 新入生も新入社員も勉強会に寄っといで! (2012/5/14)
週末ともなれば至るところでセキュリティ系勉強会やCTFなどのイベントがあり、ツイートも盛り上がりました
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
