認証・認可の脆弱性:ログインとIDOR
総当たり攻撃とレートリミット
この回でやること
パスワードを片端から試す攻撃と、回数で止めるレートリミットの考え方。何を数えるかを間違えると、制限があっても素通りされます。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
総当たり攻撃は、絞り込んだIDに対してパスワードを片端から試す攻撃で、それを回数で止める道具がレートリミットです。この回は攻撃の3つの形と、制限が効くかどうかを分けるものを扱います。
読み終えると、制限が入っているのに素通りされる作りを、2種類の送り方から見分けられるようになります。
3つの試し方
同じ総当たりでも、形が3つあります。
- 1つのIDに多数のパスワード。狙いを定めた古典的な総当たりです
- 1つのパスワードに多数のID。
Password123!のようなよくある1つを、全利用者に順に当てます。IDごとの失敗は1回ずつなので、IDで数える制限には引っかかりません - 他所で漏れた組み合わせを試す。別のサービスから流出した利用者名とパスワードの対を、そのまま送ります。使い回している人だけが通ります
2つ目と3つ目は、1つのIDから見れば「1回だけ失敗した」ようにしか見えません。ここが設計を間違える入口です。
何を数えるか
レートリミットは、一定時間あたりの回数に上限を置く仕組みです。効くかどうかは、上限そのものより数える軸で決まります。
プレーンテキスト
IPアドレスごと → 多数のIPから来られると分散して効かない
利用者名ごと → 1つのIDへの集中は止まる。多数IDへの1回ずつは止まらない
サービス全体の失敗率 → 上の2つをすり抜けた形も、総量として見える3本とも要ります。どれか1本では、上に挙げた3つの形のどれかが必ず抜けます。
数えるのは失敗だけ
成功したログインまで数に入れると、正しく使っている人が締め出されます。数えるのは失敗の回数で、成功したら利用者名側の数はその場で0に戻します。
止め方は3段ある
上限に触れたときの応答も、いきなり全部を拒むだけではありません。
- 遅らせる。失敗のたびに1秒、2秒、4秒と待たせます。人間はほとんど困らず、機械は困ります
- 追加の確認を挟む。画像認証や、登録済みの端末かの確認を出します
- 拒む。
429を返して一定時間受け付けません
段を踏むほど、正しい利用者を巻き込む被害が減ります。
手を動かす
練習用の環境で、同じIDに10回、違うIDに1回ずつ10回、それぞれ失敗を送ってみてください。前者だけ止まって後者が素通りするなら、数えている軸が利用者名しかありません。