
XenForo 2.3.13 より前のバージョンでは、空文字列がトークンエンドポイントに到達した場合に、OAuth2 のクライアントシークレットと PKCE の検証をスキップできます。
エンドポイントは client_secret と code_verifier キーが存在するかどうかをチェックし、その PHP 文字列値が truthy の場合にのみ比較を実行します。したがって、空の値は存在チェックを満たしますが、比較はバイパスされます。
パブリック OAuth クライアントの場合、攻撃者は依然として有効な認可コードを必要とします。このバグにより、コードだけでは不十分であるという PKCE の保証が取り除かれます。コードはベリファイアなしで交換でき、ユーザーが承認したスコープを持つトークンが生成されます。同じ falsey 値パターンが機密クライアントのチェックにも影響しました。
私はこの問題を、認可されたローカルインストール環境の XenForo 2.3.12 (ビルド 2031270) で再現しました。XenForo 2.3.13 には修正が含まれています。
このスクリプトは、空の code_verifier を使用してトークン交換を 1 回実行し、返されたアクセストークンをハッシュ化して、認証されるかどうかを確認します。トークンやアカウントの ID を出力することはありません。
python poc.py https://xenforo.example CLIENT_ID AUTHORIZATION_CODE https://client.example/callback
脆弱なインストール環境では、トークンエンドポイントから HTTP 200 が返され、/api/me から認証済みの応答が返されます。修正済みのインストール環境では、交換は拒否されます。
テストを許可されたシステム上で、使い捨てアカウント用に作成された認可コードのみを使用してください。
発見者: Marco Paciaroni (BomboBombone)。