
XenForo 2.3.13 より前のバージョンでは、OAuth2 認可コードを、そのコードが発行された際に使用されたリダイレクト URI にバインドしていません。
トークンエンドポイントで、XenForo は送信された redirect_uri がクライアントの許可リスト内にあるかどうかをチェックします。認可リクエストに保存されたリダイレクト URI と値を比較することはありません。コールバック A と B を持つクライアントは、A を通じて認可し、B を主張しながらコードを引き換えることができます。
攻撃者は、有効なコードと、同じクライアントにすでに登録されている別のコールバックを制御または観察する必要があります。このバグはコードを作成したり、新しいリダイレクト URI を追加したりするものではありません。フロントチャネルの認可とトークン交換の間のバインドを弱めます。
XenForo 2.3.12(ビルド 2031270)で不一致を再現しました: コールバック A がコードを発行し、コールバック B がそれを交換し、結果として得られたトークンは認可ユーザーとして認証されました。XenForo 2.3.13 には修正が含まれています。
python poc.py https://xenforo.example CLIENT_ID AUTHORIZATION_CODE https://client.example/callback-b --code-verifier VERIFIER
機密性の高いテストクライアントの場合のみ --client-secret を追加してください。スクリプトは返されたトークンをハッシュ化し、/api/me がそれらを受け入れたかどうかのみを報告します。
2 つのコールバックと、自分が所有する使い捨ての OAuth 付与を使用してください。脆弱なインストールではコールバック B を受け入れます。修正されたインストールでは不一致を拒否します。
発見者: Marco Paciaroni (BomboBombone)。