認証・認可の脆弱性:ログインとIDOR
総仕上げ 認証の穴を見つける
この回でやること
認証の章のまとめです。これまで見た穴を、練習用のショップのログイン周りを1つずつ点検していく手順に組み直し、自分のサービスへ当てられる並びにします。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
認証の点検は、ここまで別々に見てきた穴を、ログイン周りを1つずつ確かめる手順に組み直す作業です。この回は新しい話を足さず、その順番を作ります。
読み終えると、同じ順番を自分が権限を持つサービスにそのまま当てられるようになります。
出発点は4つの段
1本目の地図に戻ります。ログインは受け取る・探す・照合する・配るの4段でした。認証の穴は「ログインが弱い」とひとくくりにせず、どの段の話かに分けて点検します。段が分かれば、送るものと見る場所も決まります。
点検の第一歩は、穴を段に割り当てることです。存在の漏れは探す段、試行の回数は照合する段、合言葉の扱いは配る段。段が決まれば、送るものと見る場所が決まります。ここが曖昧なままだと、対策も曖昧になります。
探す段 存在が漏れていないか
存在しないIDと自分のID(tanaka)に、でたらめなパスワードを送って応答を並べます。
プレーンテキスト
存在しないID → 文言 / ステータス / 本文の長さ / 応答時間
tanaka → この4つが、上の行とすべて揃っているか文言とステータスが違えば列挙できます。揃えても、存在するIDだけ応答が遅ければ時間で漏れます。20回ずつ送って中央値を比べ、差が10ミリ秒以内かを見ます。会員登録とパスワード再設定の画面も、同じ目で確かめます。
照合する段 何度でも試せないか
同じIDに続けて失敗を送り、止まるかを見ます。次に、違うIDへ1回ずつ失敗を送ります。前者だけ止まって後者が素通りするなら、数えている軸が利用者名しかありません。IPと利用者名と全体の失敗率の3本で数え、ロックは利用者名だけで判定していないかを確かめます。他人を狙って締め出せる作りは、可用性への攻撃になります。
配る段 合言葉を正しく扱っているか
ログインの前後で合言葉が変わるかを見ます。変わらなければセッション固定です。ログアウトのあと、古い合言葉を付けたリクエストを送り、401が返るかを確かめます。200ならサーバ側で消えていません。パスワードを変えたあと、別の端末のセッションが切れるかも見ます。
MFAと再設定は横串で見る
MFAを入れているなら、コードを入れずに目的のページへ直接行けないか、コードの検証に回数制限があるか、他人のコードが通らないかを点検します。再設定は、トークンが十分に長く、期限があり、使い捨てで、宛先を入力から取っていないかを見ます。どちらも、2段階目や再設定リンクを「画面を増やすだけ」で済ませていないかが要点です。
自分のサービスに当てる
この順番は、練習用のショップだけのものではありません。手元のサービスで、ログイン・会員登録・再設定・MFAの各画面に、上の点検を上から順に当てます。1つの画面を直したら、隣の画面に同じ穴が残っていないかを必ず見ます。列挙もロックも、ログイン以外の画面に同じ形で現れるためです。
次に読むもの
ここまでは「あなたが本人か」を確かめる認証の話でした。次の章は、本人だと分かったあとの「その人が何をしてよいか」という認可を扱います。tanakaが/api/orders/1043を開けるのか、/admin/usersに触れるのか。認証を固めても、認可が緩ければ他人の注文が読めます。同じ点検の姿勢を、認可にも持っていきます。