Open1
ウェブ・セキュリティ基礎試験(徳丸基礎試験)⑨
徳丸基礎試験勉強まとめ⑨
「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」の5章を自分なりにまとめる
アドバイスや間違い指摘など歓迎です
5章 「代表的なセキュリティ機能」
5.1 認証
認証に対する攻撃って?
- ログイン機能に対する攻撃
- パスワード保存方法
- 自動ログイン
- ログインフォーム
- エラーメッセージ
- ログアウト機能
ログイン機能に対する攻撃って?
- SQLインジェクションによる、誰でもログイン、パスワード入手
- パスワード入手攻撃(アカウントロックで対策可能)
- 辞書攻撃: 頻度の高いパスワード候補から順に試す
- ブルートフォース攻撃: ユーザーID固定してパスワードを試す
- パスワード入手攻撃(アカウントロックで対策不可)
- ジョーアカウント探索: ユーザーIDとパスワードが同じアカウントを探す
- ソーシャルエンジニアリング: 画面のぞき見や、管理者を装った電話などでログイン情報を盗む
- フィッシング: 本物そっくりの画面の偽サイトで重要情報を盗む
- リバースブルートフォース攻撃: パスワードを固定してユーザーIDを試す
- パスワードスプレー攻撃: IDもパスワードも固定せず、少数のパスワード候補をIDを変えながら試す
- パスワードリスト攻撃: 別サイトから漏洩したIDとパスワードの一覧を用いて試す
対策
- SQLインジェクションなどセキュリティバグをなくす
- パスワードを予測困難なものにする
- 文字種の数(英数字、記号など)× 桁数
- アカウントロック
- パスワード間違い10回で30分ログインできなくなるなど
- 二段階認証
- 積極的なパスワードチェック
- ありがちなパスワードや、IDと同じパスワードを拒否
- ログイン失敗率監視
- 一定時間内のログイン失敗率の急激な上昇を監視
パスワード保存方法を狙った攻撃って?
- パスワードリスト攻撃
- SQLインジェクションやWeb管理者が直接DBでパスワード情報を取り出して攻撃
対策
- メッセージダイジェスト(ハッシュ値)によるパスワード保護
- ハッシュ値でDBに保存し、照合もハッシュ値で行う
- オフラインブルートフォース攻撃: ハッシュ値でパスワードを保存してあるDBの場合に、複数文字列のハッシュ値を計算し、元のパスワードを見つける攻撃
- レインボーテーブル: 有名なハッシュアルゴリズムのハッシュ値をあらかじめ表にしておき、その表と照らし合わせてパスワードを見つける(逆引きする)攻撃
- 攻撃者が複数のアカウントを作り、DB上にパスワード辞書を作る攻撃:未知のハッシュ値を使った場合でも、攻撃者の複数アカウントと同じパスワードを使用したユーザーを見つけることができる
- ソルト
- ハッシュ値に、ユーザー毎に異なるソルトを追加する
- ストレッチング
- ハッシュ計算の速度を遅くするため、ハッシュ計算を複数行うか、パスワード専用の速度の遅いハッシュ関数(PHPの場合password_hash)を使用する
- ハッシュ値でDBに保存し、照合もハッシュ値で行う
自動ログインを狙った攻撃って?
- クッキーにパスワードやIDが入っている場合、それを盗む
- 自動ログインがない場合は、頻繁にログインログアウトするので、単純なパスワードを付けがち
対策
- 自動ログインのユーザーのセッションの寿命を伸ばす
- デメリット1、自動ログインを希望しないユーザーにも影響が出ること
- デメリット2、複数端末からログインしている場合、一斉にログアウトできない
- デメリット3、管理者が特定ユーザーのログイン状態をキャンセルできない
- トークンによる自動ログイン(セッションID格納用クッキーのセッション寿命を変更できない場合)
- クッキーにトークンを格納し、トークンの寿命を伸ばす
- 認証チケットによる自動ログイン
- サーバーをまたがって認証情報を共有する場合
ログインフォームを狙った攻撃って?
- ソーシャルエンジニアリングでパスワードを盗みみる攻撃
- フォームが改竄され、送信先が別のサイトになっている攻撃
- 公共Wifiなどで偽のアクセスポイント経由で偽サイトを表示している可能性
対策
- パスワード入力欄はマスク表示する
- HTTPSを利用する
エラーメッセージを狙った攻撃って?
- IDとパスワードのどちらが間違っているかわかるエラーになっているせいで、ブルートフォース攻撃されやすくなる
対策
- IDとパスワードのどちらが間違っているかわからないエラーにする
- 二段階認証にする
ログアウト機能を狙った攻撃って?
- セッションIDがクッキーに残ってしまい、クッキーを盗まれる
- GETメソッドでユーザーの情報をパラメータで送ってログアウトすると、パラメータが盗まれる
対策
- ログアウト処理ではセッションを破棄
- ログアウト処理はPOSTメソッドでリクエスト
5.2 アカウント管理
アカウント管理に対する攻撃って?
- ユーザー登録
- パスワードの変更
- メールアドレスの変更
- パスワードリセット
- アカウント停止
- 管理者が特定のアカウントを停止できるようにする
- アカウント削除
- 削除前に再認証
ユーザー登録に対する攻撃って?
- 同じユーザーIDで複数登録できる(同じユーザーIDのユーザー情報閲覧できてしまう)
- botによるユーザー登録
対策
- SQLのユニーク制約
- CAPTCHAによるbot認識
パスワードの変更に対する攻撃って?
- セッションハイジャックなどによって、パスワードを変更する
対策
- 現在のパスワードを確認してから、新しいパスワードを変更
- パスワード変更時にメール通知
- 管理者が設定した初期パスワードは初回ログイン時に変更するように誘導
メールアドレスの変更に対する攻撃って?
- セッションハイジャックなどによって、メールアドレスを変更する
対策
- メールアドレス変更時にメール通知(新旧メアド両方にメール通知)
- メールアドレス変更前に再認証
- 新規メールアドレスに対する受信確認
パスワードリセットの変更に対する攻撃って?
- なりすまし
対策
- 管理者向けのパスワードリセットの場合、本人確認、管理者が他の管理者の仮パスワード発行、初回ログイン後パスワード変更
- 利用者向けのパスワードリセットの場合、仮パスワード発行か、直接パスワード変更画面に遷移するのが望ましい
5.3 認可
認可の脆弱性の原因って?
- URLを知っていると認証なしで情報が閲覧できる
- 情報リソースのIDを変更すると権限外の情報が参照できる
- メニューの表示、非表示のみで、認可制御している
- hiddenパラメータやクッキーに権限情報を保持している
対策
- セッション変数に格納したユーザーIDを基準に権限をチェックする
- 権限情報をクッキーやhiddenパラメータなどに保持しない
5.4 ログ出力
ログ出力の脆弱性の原因って?
- エラーログに攻撃者のヒントになる情報が表示される
- アクセスログを取得していないため、攻撃されたときの履歴が残らない
- デバッグログを本番環境で取得しており、機密情報が漏洩したりパフォーマンスが落ちたりする
対策
- 下記ログに残すべきイベントを、アクセスログに残す
- ログインログアウト
- アカウントロック
- ユーザー登録と削除
- パスワード変更
- 重要情報の参照
- 重要な操作
- ログの出力項目
- 日時
- リモートIPアドレス
- ユーザーID
- アクセス対象
- 操作内容
- 操作対象
- 操作結果
- ログの保護
- ログに対する不正アクセスができないよう、管理する
- 万が一不正アクセスがあった場合に備えて、クレジットカード情報などはマスクする
- ログ出力先
- ログ専用サーバーを用意することが望ましいが、費用面を考慮して対応する
- ログの保管期間
- 無期限で保存が望ましいが、定期的に長期保管用メディアに移すなどで対応する
- サーバー時刻合わせ
- NTPを用いて、サーバー間の時刻を同期し、ログ追跡しやすくする