Runbook inmediato para administradores
1. Contención preferente: sacar PHP de la ruta pública
Para servicios no esenciales, detenga PHP-FPM o el contenedor PHP y configure Nginx/Apache para entregar una página HTML estática. Esta es la medida temporal de mayor confianza porque evita que la solicitud sea procesada por PHP.
systemctl stop php-fpm
# El nombre real puede ser php8.x-fpm según la distribución.
Antes de detenerlo, confirme que la página de contingencia no depende de PHP. El modo mantenimiento de WordPress, Magento u otro CMS no sirve como aislamiento porque el intérprete se ejecuta antes que la lógica de la aplicación.
2. Nginx: bloquear multipart/form-data
Agregue la regla en cada bloque server que envía solicitudes a PHP:
if ($http_content_type ~* "multipart/form-data") {
return 403;
}
Valide la sintaxis y recargue sin reiniciar el servidor:
nginx -t && systemctl reload nginx
Impacto esperado: se bloquearán cargas de archivos y también formularios legítimos que utilicen multipart, incluidos paneles administrativos, checkout, formularios de contacto e importadores.
3. Apache: bloquear multipart/form-data
Con mod_rewrite habilitado, aplique en el VirtualHost o directorio que sirve PHP:
RewriteEngine On
RewriteCond %{HTTP:Content-Type} multipart/form-data [NC]
RewriteRule ^ - [F]
Valide la configuración y recargue Apache mediante el comando apropiado para su distribución. No aplique el cambio sin identificar previamente formularios críticos.
4. Alternativa de continuidad: modo solo lectura
Si el sitio debe continuar disponible, bloquee temporalmente todos los métodos excepto GET y HEAD en la capa web:
if ($request_method !~ ^(GET|HEAD)$) {
return 503;
}
Esta configuración conserva páginas de consulta, pero interrumpe autenticación, compras, comentarios, formularios, APIs y cualquier operación que modifique estado. Es defensa en profundidad, no una garantía frente a rutas aún no documentadas.
5. Cloudflare y protección del origen
- Active el proxy y los conjuntos de reglas WAF de emergencia disponibles para los vectores conocidos.
- Restrinja los puertos 80 y 443 del origen a los rangos IPv4 e IPv6 oficiales de Cloudflare.
- Revise balanceadores, puertos alternativos y registros DNS históricos que puedan revelar la IP real.
- Compruebe que una conexión directa a la IP del origen sea rechazada; de lo contrario, el WAF puede evadirse.
- Conserve el bloqueo local de multipart si la operación lo permite.
6. Pruebas mínimas después de mitigar
- Ejecute la validación de configuración de Nginx o Apache antes de recargar.
- Confirme que una solicitud multipart de prueba recibe 403.
- Compruebe que páginas públicas mediante GET continúan funcionando.
- Pruebe autenticación, checkout, formularios y administración para documentar funciones deliberadamente suspendidas.
- Verifique que la IP de origen no acepte tráfico directo desde Internet.
- Registre hora, activo, responsable, cambio aplicado y procedimiento de reversión.
7. Hunting y respuesta ante posible compromiso
- Busque procesos
sh, bash, curl, wget o intérpretes iniciados por PHP-FPM, Apache o el usuario del servidor web.
- Revise archivos PHP nuevos o modificados en webroots, directorios de carga, temporales y cachés.
- Inspeccione tareas cron, servicios, usuarios, claves SSH y mecanismos de persistencia creados recientemente.
- Correlacione solicitudes multipart inusuales, errores 4xx/5xx, tamaños anómalos y conexiones salientes del servidor web.
- Preserve registros y una copia forense antes de limpiar. Si existe sospecha fundada, aísle el equipo y active respuesta a incidentes.
- Rote secretos de aplicaciones, bases de datos, APIs y sesiones después de contener y evaluar el alcance.
8. Aplicación del parche
- Instale únicamente versiones corregidas publicadas por PHP, su distribución o un proveedor con backport documentado.
- Reinicie PHP-FPM, Apache o los contenedores para eliminar procesos que sigan ejecutando binarios antiguos.
- Verifique la versión desde el runtime activo, no solamente desde el gestor de paquetes.
- Reconstruya imágenes de contenedor y evite reutilizar capas con PHP vulnerable.
- Retire las reglas temporales solo después de comprobar la actualización y completar el hunting inicial.
Controles que no bastan por sí solos
No considere como corrección completa session.upload_progress.enabled=Off, memory_limit=-1, file_uploads=Off, un plugin de seguridad, el modo mantenimiento del CMS o una regla WAF genérica. Pueden modificar la exposición de una ruta, pero no reemplazan la actualización oficial.