
🌐 También en: English · Deutsch · Français
Me topé con este artículo – aviso: está en alemán; por lo visto, la prensa tecnológica anglófona aún no se había hecho eco cuando lo leí. En resumen: una cadena de vulnerabilidades apodada «WP2Shell» encadena dos bugs distintos de WordPress – una inyección SQL en el parámetroauthor__not_in de WP_Query (CVE-2026-60137, CVSS 9,1) y un fallo de validación en el endpoint REST /wp-json/batch/v1 (CVE-2026-63030, CVSS 7,5) – hasta convertirlos en una ejecución remota de código totalmente sin autenticar. Por separado, cada bug es simplemente «preocupante». Encadenados, un atacante sin ninguna credencial puede abrirse una shell en cualquier instalación de WordPress 6.8 o superior. Justo el tipo de hallazgo que te arruina un viernes. 🔥 Así que, como es lógico, fui a parchear mi propio blog, ya que uso exactamente ese rango de versiones. Pero resulta que: todavía no había imagen de Docker actualizada. wordpress:7.0.2-php8.3-fpm – la etiqueta que de verdad contiene el parche – sencillamente aún no existía en Docker Hub. Genial. Una RCE sin autenticar confirmada y circulando por ahí, y el único artefacto que necesito para cerrarla no se ha publicado. 😅 Y aquí viene lo que realmente me ha hecho escribir este artículo: ni siquiera llegué a proponer yo mismo una solución provisional. Claude – una IA, no un desarrollador humano, no un script escrito por mí – analizó la situación, se dio cuenta de que la cadena del exploit se podía bloquear en la capa del proxy inverso sin tocar siquiera el contenedor de la aplicación, y escribió por iniciativa propia la mitigación en mi ConfigMap de nginx, sin que nadie se lo pidiera. Yo no había pedido ningún apaño. Había preguntado por la vulnerabilidad. Sin ticket, sin copiar y pegar de Stack Overflow, sin ningún humano de por medio: solo un modelo de IA razonando sobre mi infraestructura real y decidiendo actuar. Simplemente… se encargó. 🤖 La solución en sí es una pequeña y bonita pieza de defensa en profundidad: bloquear la ruta REST vulnerable en nginx antes de que llegue siquiera a PHP-FPM. Pero – y este es el detalle que me impresionó – un único bloque location no bastaba. El router REST de WordPress acepta peticiones de dos maneras: en forma de enlace permanente «bonito» (/wp-json/batch/v1) y mediante un fallback por query string (/?rest_route=/batch/v1) que la mayoría de las reglas ingenuas de nginx no tienen en cuenta. Claude probó ambas rutas en directo contra el sitio en marcha, confirmó que la variante con parámetro se colaba sin problema por delante de un bloque location basado solo en la ruta, y entregó ambas mitigaciones a la vez:location ~* ^/wp-json/+batch/v1 { deny all; }
if ($arg_rest_route ~* "batch") { return 403; }
Dos líneas. Cero caídas de la aplicación. Cero cambios de código en el propio contenedor de WordPress. Solo un proxy que se niega discretamente a reenviar la única forma de petición que acaba convirtiéndose en una shell. 🛡️ 
wordpress:7.0.2-php8.3-fpm aterrizó en Docker Hub. Subí la versión fijada, la desplegué y – como el parche real de upstream ya estaba dentro – volví a quitar el apaño de nginx. Limpio al entrar, limpio al salir, sin cicatrices en la configuración. ✅ Mira, escribo y reviso un montón de código de infraestructura para ganarme la vida, y no suelo repartir cumplidos a las herramientas a la ligera. Pero hay algo realmente sexy en un agente de programación que (a) entiende una cadena de exploits lo bastante bien como para razonar en qué capa de tu stack se puede bloquear, (b) verifica por sí mismo que su solución funciona de verdad contra el bypass real en lugar de darlo por hecho, y (c) hace todo eso sin que se lo pidan, en vez de limitarse a responder a la pregunta que le había planteado. Eso no es autocompletado. Eso es criterio. Estaba, de forma poco razonable, la verdad es que encantado. 😍




