認証・認可の脆弱性:ログインとIDOR
IDORとは IDを変えて他人の情報を見る
この回でやること
前回見た水平の権限漏れに名前を付ける回です。リクエストに現れたIDを差し替えて他人の資源を指す形をIDORと呼び、IDを推測しにくくするのが対策ではなく緩和にすぎない理由を扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
IDORは、リクエストに現れたIDを差し替えると他人の資源を指せてしまう形の名前で、直訳は「安全でない直接オブジェクト参照」です。この回は名前を付けたうえで、よくある勘違いの対策を1つ潰します。
読み終えると、IDを探す場所と、差し替えて反応を見る手順が自分の中で定まります。
名前が付くと、探し方が決まる
IDORは、リクエストの中に資源を名指しするID、注文なら1043、利用者なら57が現れていて、そのIDを別の値に変えると別の持ち主の資源を指せてしまう形を言います。
プレーンテキスト
GET /api/orders/1043 自分の注文
GET /api/orders/1044 数字を変えると sato の注文
GET /api/users/57 利用者のIDも同じ形で狙える名前が付くと、探す場所が決まります。URL、クエリの文字列、リクエストの本文、Cookieの中まで、資源を名指ししているIDを探し、それを別の値に差し替えて応答が変わるかを見る。前章までで身につけた「反応の差を読む」手が、そのまま使えます。
推測しにくいIDは、対策ではなく緩和
番号が連番だと次の値を当てやすいので、推測しにくいランダムな文字列にすればよい、と考えたくなります。手間は確かに増えますが、これは対策ではありません。
理由は、IDORの穴が「IDを当てられること」ではなく「持ち主を確かめていないこと」だからです。推測しにくいIDでも、共有されたURL、送信の記録、以前のやり取りなどから漏れます。漏れたIDを1つ手に入れて開けば、判定していないという事実は何も変わらないので、そのまま通ります。
ランダムなIDは、総当たりで片端から探す手間を上げます。多層防御の1枚としては意味があります。しかしそれは緩和で、根本の直しは前回のとおり、資源を引いた後に持ち主を突き合わせることです。緩和と対策を取り違えないでください。
手を動かす
練習用の環境で/api/orders/1043を開いたあと、番号を1044に変えて応答を並べてください。次に、直したつもりで番号をランダムな文字列に置き換えた版でも、他人のIDを1つ渡せば同じように読めてしまうことを確かめます。読めてしまうなら、変えたのはIDの見た目だけで、判定は入っていません。