
phpMyAdmin 5.2.3 - High - リモート - 2FAスキップ - WebAuthnセレモニーをスキップ可能
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
解説記事: https://abraxaslabs.tech/research/phpmyadmin-webauthn
分類: 2FA バイパス 到達範囲: リモート
phpMyAdmin 5.2.3(タグ RELEASE_5_2_3)。デフォルトの tarball。web-auth/webauthn-lib は suggest / require-dev に含まれる。composer install --no-dev ではインストールされない。そのため createServer は CustomServer を使用する。このクラスは response.signature をパースし(フィールドが存在し、デコードできる必要がある)、COSE 検証を一切行わない。保存された credentialPublicKey も一切使用しない。製品自身の CustomServerTest は、公開鍵なしのアサーションを受け入れてしまう。
構造的なチェックは実際に機能している: allowCredentials 内の credential id、clientData.type == webauthn.get、セッションと一致する challenge、origin ホスト、rpIdHash、user-present。署名はパースされるが無視される。MySQL パスワードの後、それらのフィールドに一致しさえすれば、ゴミのような WebAuthn 署名でも完全な phpMyAdmin セッションとなる。すなわちデータベースそのものである。もし実際に web-auth/webauthn-lib をインストールしているなら、WebauthnLibServer を使用しており、このバグの影響は受けない。
| ID | CVE 未割当 |
| 分類 | 2FA バイパス / 署名検証の欠落 |
| 到達範囲 | リモート(Cookie ログイン後、WebAuthn がスキップされる) |
| CWE | CWE-347, CWE-287 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 製品 | phpMyAdmin |
| 影響を受けるバージョン | 5.2.3 タグ RELEASE_5_2_3。デフォルト tarball / composer install --no-dev |
| 認証 | Cookie ログイン(MySQL パスワード)、その後 WebAuthn がスキップされる |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18080 のみ |
攻撃者は依然として MySQL パスワード(Cookie ログイン)を必要とする。そのパスワードの後、一致する challenge、origin ホスト、rpIdHash、user-present、登録済み credential id、そしてゴミのような署名を付けて webauthn_request_response を POST する。すると通常の UI に到達する。2FA は無効化される。これはデータベース(SQL、ユーザー、エクスポート)へのアクセスであり、ホスト上の PHP シェルではない。
もし実際に web-auth/webauthn-lib をインストールしているなら、WebauthnLibServer を使用しており、このバグの影響は受けない。
| 権限 | メソッド / パス | ラボで実証済みか推測か |
|---|---|---|
| 認証器なしで WebAuthn 2FA を完全に突破(第二要素の完全性) | パスワード後に webauthn_request_response を POST、ゴミ署名 | ラボで実証済み。still_2fa=False landed=True |
| その MySQL ユーザーとしての完全な PMA(SQL ボックスの完全性 + 偵察) | 同一セッション | ラボで実証済み。ホーム UI のマーカーが存在 |
| MySQL パスワードのスキップ | 未認証 POST | ラボで実証済み、クローズ。ログイン画面のまま |
web-auth/webauthn-lib インストール時の同一バイパス | WebauthnLibServer | クローズ。この残存バグではない |
| OS RCE / リバースシェル | この残存バグ | クローズ |
この残存バグに関してクローズ済み: 未認証の PMA、ホスト上の PHP シェル、そして実際に web-auth/webauthn-lib をインストールした tarball をこのバグとして扱うこと。
createServer を読み、次に parseAndValidateAssertionResponse を読み、最後に公開鍵を渡さないユニットテストを読んだ。構造的なチェックは実際に機能している。署名はパースされるが無視される。
迷走した点: 事前のパスワードセッションなしで WebAuthn JSON を POST したこと、構造チェックに失敗する署名、Webauthn\Server が依然として存在していたこと(誤ったサーバークラス)、このセッション由来でない challenge、origin ホストの不一致、user-present フラグのクリア、allowCredentials に含まれない credential id。
Dockerfile は 5.2.3 をコピーし、composer install --no-dev を実行した後、vendor/web-auth を削除するため、実際に使用されるのは CustomServer になります。最後の php -r は、Webauthn\Server が存在する場合に終了コード 1 で終了します。init.sql は、ハードウェアキーなしで appuser に WebAuthn 2FA を登録します。PoC は署名 not-a-real-signature-PMA-WEBAUTHN-BYPASS を POST します。
Dockerfile の隣に固定されたリポジトリをクローンし、次を実行します:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
またはそのクローン後のパックルートから:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
ループバックのみ: http://127.0.0.1:18080。Compose プロジェクト pma-webauthn-lab。RELEASE_5_2_3 を固定。src/ を出荷しないこと。PMA-WEBAUTHN-BYPASS を目撃すること。
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
保存された COSE 公開鍵を用いて authenticatorData || SHA-256(clientDataJSON) を検証し、userHandle をバインドし、signCount を強制すること。web-auth/webauthn-lib を実際の依存関係にして CustomServer を削除するか、ライブラリが存在しない場合はフェイルクローズすること。それまでは、WebAuthn 2FA を無効化するか、この phpMyAdmin を公開しないこと。
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。