nonceを用いた検証の目的
リプレイアタックの防止。
事例
仮想通貨DAOの不正送金
https://coin-media.jp/18208
攻撃例
サービス:S
Sのバックエンドサービス:SB
攻撃ユーザー:X
被害ユーザー:Y
- Sにおいて、YがSBの認可が必要なサービス(画面など)へアクセスする。
- Sは、SBへYをリダイレクトさせる。
- SBにおいて、Yが認証する。
- SBにおいて、認可コードを発行し、YへSへのリダイレクトURLを返却する。
- SBは、Sからの認可コードによるIDトークンの払い出しを受け付ける準備をする
- Yは認可コードを用いて、IDトークンを得る。
- 何らかの方法で、XがIDトークンを窃取する。
- Xは、正規のリクエストとして、窃取したYのIDトークンを用いて、不正アクセスを行う。
攻撃防止の流れ
- Sにおいて、YがSBの認可が必要なサービス(画面など)へアクセスする。
- Sは、SBへYをリダイレクトさせる。この時、SはリダイレクトURLにnonceを付加する。加えてYのセッション情報にこのnonceを保存する。
- SBにおいて、Yが認証する。
- SBにおいて、認可コードを発行し、YへSへのリダイレクトURLを返却する。
- SBは、Sからの認可コードによるIDトークンの払い出しを受け付ける準備をする
- Yは認可コードを用いて、IDトークンを得る。このとき、トークンに含まれるnonceと2.でセッションの保存したnonceを比較し、一致しているか検証する。一致していたら、セッション情報のnonceを破棄する。
- XがIDトークンを窃取する。
- Xは悪意をもって、IDトークンを用いたアクセスをSBへ行う。
- Sは、渡されたIDトークンのnonceとYないしXのセッション情報で管理していたnonceと比較しようとするが、Yのセッションでアクセスされた場合は、nonceが削除済みもしくは不一致、Xのセッションでアクセスされた場合は不一致となる。
※ここはユーザ特定方法によるが、cookieを用いたセッション管理をしているなら、不正アクセスをしてきたXのセッション情報に含まれるnonceとクエリパラメータのnonceの同一性検証になる。
ポイント
- nonceは一回限り、ということ。
- nonceは衝突可能性の低いランダムな値。UUIDとか。
nonceの語源
number used once
悪意のある攻撃から身を守るには?