はじめに
最近、会社で徳丸本(体系的に学ぶ 安全なWebアプリケーションの作り方 第2版)の勉強会が始まりました。
毎週持ち回りで発表していく形式で、僕の発表するパート(クッキー出力にまつわる脆弱性)についてまとめたので、ブログにも載せようと思います。
会社での勉強会の雰囲気などはこちらの記事をご覧ください。
ちなみに、徳丸本というのはWebアプリケーションのセキュリティに関するめちゃくちゃ有名な本です。
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版[リフロー版] 脆弱性が生まれる原理と対策の実践
- 作者: 徳丸浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/09/20
- メディア: Kindle版
- この商品を含むブログを見る
サマリー
- Webアプリケーションではクッキーによるセッション管理が広く使われている
- クッキーにまつわる脆弱性
① クッキーを利用すべきでない目的でクッキーを使っている
【対策】クッキーはセッションIDの保管場所として利用すべきで、それ以外のデータをクッキーに保存しない方が良い
② クッキーの出力時に脆弱性が発生する(クッキーのセキュア属性不備)
【対策】HTTPS通信を用いるアプリケーションのクッキーにはセキュア属性を指定する
クッキーの不適切な利用について
Webアプリケーションで、ページをまたがる情報を保存する方法としては、セッション管理機構が用いられる。
一般的にセッション管理機構は、セッションIDのみをクッキーに保存して、データ自体はWebサーバーのメモリやファイル、データベースなどに保存している。
クッキーはアプリケーション利用者によって書き換えができるため、クッキーに保存すべきでないデータをクッキーに保存すると、脆弱性が発生する場合がある。
クッキーに保存すべきでない情報とは?
ユーザIDや権限情報
これらは書き換えられると困る情報である。
これらの情報をクッキーに保存していると、権限外の操作や情報閲覧ができてしまう場合がある。
クッキーに保存すべきでない情報以外であっても、一般的にクッキーにデータを保存しない方が良い。
クッキーよりセッション変数を使うべき理由
セッション変数の方が便利で安全に使用できるため、通常はセッション変数を利用すべきである。
ただし、クッキーで実現できてセッション変数で実現できないのは、情報の寿命の制御と、異なるサーバーとの情報共有のみであり、これらが必要な場合はクッキーを利用する。
異なるサーバーでの情報共有のクッキーの使用例としては、ログイン画面の「ログイン画面を保持する」という機能がある。この機能はクッキーによりログイン状態が保持される。この時、クッキーに保存される情報はトークンという乱数で、IDやパスワードをクッキーに保存するわけではない。
クッキーにデータを保存する方法とセッション変数を使う方法の比較は下表の通り。
クッキーのセキュア属性不備による脆弱性
クッキーにはSecureという属性があり、これを指定したクッキーはHTTPSの場合のみブラウザからサーバーに送信される。
クッキーにはセッションIDなどセキュリティ上重要な情報が格納されている場合が多いので、クッキーが盗聴されると成りすましの被害に直結する。
クッキーのセキュア属性不備への対策は、クッキーのセキュア属性を設定することである。
脆弱性が生まれる原因(クッキーにセキュア属性をつけない原因)
-
開発者がセキュア属性について知らないケース
-
セキュア属性をつけるとアプリケーションが動かなくなるケース
- HTTPとHTTPSが混在するWebアプリケーションの場合、セッションIDを保持するクッキーにセキュア属性を設定することは困難である。セッションIDのクッキーにセキュア属性をつけると、HTTPのページではセッションIDのクッキーが受け取れないため、セッション管理機構が使えなくなってしまう。サイト全体をHTTPSにするのが難しい場合、トークンを用いて対策する方法もある。
覚えておくべきこと
-
クッキーはセッションIDの保管場所として利用すべきで、それ以外のデータをクッキーに保存しない方が良い
-
HTTPS通信を用いるアプリケーションのクッキーにはセキュア属性を指定する
おわりに
この本は一度通して読んでいるのですが、勉強会で自分が発表するために読み直してまとめると、より理解が深まりました。
会社で勉強会を行なっているように、実務ではセキュリティの知識は必須なので、セキュリティに関して自信が無いという方は是非こちら読んでみることをおすすめしますー!
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版[リフロー版] 脆弱性が生まれる原理と対策の実践
- 作者: 徳丸浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/09/20
- メディア: Kindle版
- この商品を含むブログを見る