CVE-2026-44166 のラボ + 解説: 未検証の createData.email を介した PocketBase OAuth2 アカウントの事前乗っ取り
OAuth2 が有効な PocketBase 認証コレクションでは、サインアップ時にクライアントが createData オブジェクトを渡すことができます。createData 内のメールアドレスは、OAuth2 プロバイダーが検証したメールアドレスと照合されません。設定されたプロバイダーのアカウントを持つ誰でも、他人のメールアドレスを持ち、自分の OAuth2 ID にリンクされたレコードを登録できます。
1つのプロバイダーが設定されている場合、実際の所有者はロックアウトされます。2つ以上のプロバイダーがある場合、所有者は後日別のプロバイダーを通じてログインし、攻撃者とアカウントを共有することになります。
影響を受けるバージョン: < 0.22.42 および >= 0.30.0, < 0.37.4。0.22.42 および 0.37.4 で修正されました。
アドバイザリ: GHSA-pq7p-mc74-g65w。CWE-287。CVSS 4.0 6.1。
詳細な解説: WRITEUP.md
python fetch_binaries.py # pulls vulnerable 0.37.3 + patched 0.37.4 for your OS
python poc.py # pre-claim and lockout against the vulnerable build
python verify_fix.py 0.37.4 # same steps on the patched build, attacker gets evicted
Python 3.8+、標準ライブラリのみ。PoC はバンドルされたモック OAuth2 プロバイダーに対してオフラインで実行されるため、実際の IdP やネットワークターゲットはありません。
脆弱な 0.37.3:
[1] Attacker token issued for: [email protected] (verified=False)
[2] Victim login: HTTP 400 -- Failed to authenticate.
[3] Attacker re-auth: [email protected] -- same record: True
修正済み 0.37.4:
[1] Attacker pre-claims: [email protected] verified=False id=...
[2] Victim login: SUCCESS verified=True id=... => victim owns the account
[3] Attacker re-auth: [email protected] id=... same-as-victim=False
| ファイル | 目的 |
|---|---|
WRITEUP.md | 根本原因分析、両方の攻撃バリアント、修復、検出 |
fetch_binaries.py | OS/アーキテクチャ向けの 0.37.3 / 0.37.4 バイナリをダウンロード |
mock_oauth2_server.py | オフライン用の小さなモック OAuth2 プロバイダー (トークン + ユーザー情報) |
poc.py | 脆弱なビルドに対するエクスプロイト |
verify_fix.py | 任意のビルドで同じ手順を実行し、結果を報告 |
教育および許可されたセキュリティテスト(自身のラボ、CTF や HTB のボックス、対象範囲内のバグバウンティターゲット)のみ。ラボはオフラインであり、自分で実行しないものには一切触れません。