
Kit de herramientas de detección, verificación y respuesta a incidentes para CVE-2026-85097: evaluación remota de Bricksforge, búsqueda de IOC en registros, auditoría de implantes en el sistema de archivos, además de reglas Sigma y WAF.
Carga arbitraria de archivos sin autenticación → RCE en el plugin de WordPress Bricksforge
Kit de herramientas de detección, verificación y respuesta a incidentes para CVE-2026-85097, una carga arbitraria de archivos sin autenticación con CVSS 10.0 en el plugin Bricksforge para WordPress que está siendo explotada activamente en la naturaleza.
Un solo script, tres modos: evaluar un objetivo de forma remota, rastrear registros históricos en busca de explotación y auditar una raíz web en busca de implantes dejados atrás.
____ _ _ _ __ ___ _ _
| __ ) _ __(_) | _| | __/ _| ___ _ __ __ _ / _ \ ___| | _| | ___ _ __
| _ \| '__| | |/ / |/ / |_ / _ \| '__/ _` | | | / __| |/ / |/ _ \| '_ \
| |_) | | | | <| <| _| (_) | | | (_| | |_| \__ \ <| | (_) | | | |
|____/|_| |_|_|\_\_|\_\_| \___/|_| \__, |\___/|___/_|\_\_|\___/|_| |_|
|___/
CVE-2026-85097 | Unauthenticated Arbitrary File Upload -> RCE
CVSS 10.0 CRITICAL | Bricksforge <= 3.1.8.9 | Fixed 3.1.8.10
| Campo | Valor |
|---|---|
| CVE | CVE-2026-85097 |
| Producto | Bricksforge (plugin de WordPress, complemento para Bricks Builder) |
| Tipo | Carga arbitraria de archivos sin autenticación → Ejecución remota de código |
| CWE | CWE-434: Carga sin restricciones de archivos de tipo peligroso |
| CVSS | 10.0 CRÍTICO: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (vector inferido, véase Limitaciones) |
| Autenticación | Ninguna |
| Afectados | <= 3.1.8.9 |
| Corregido | 3.1.8.10 (línea de versión del proveedor referenciada en la prensa: 4.0.1) |
| Explotación | ACTIVA EN ESTADO SALVAJE |
| Primera observación | 2026-10-07 21:47:17 UTC |
| Instalaciones | ~6.000 |
| IPs de origen observadas | 63 únicas (las 6 principales ≈ 46% de las solicitudes) |
| Endpoint principal | POST /wp-json/bricksforge/v1/form_submit |
| Endpoint alternativo | POST /wp-admin/admin-ajax.php (action=bricksforge_form_submit) |
| Nomenclatura del implante | login_admin_*.php |
[!CAUTION] Solo para uso autorizado. Esta herramienta está destinada a evaluaciones de seguridad permitidas, validación defensiva y respuesta a incidentes. Ejecutar cualquier prueba activa contra un sistema que no le pertenezca o para el que no tenga permiso por escrito para probar es ilegal en la mayoría de las jurisdicciones. Véase SAFETY-AND-LEGAL.md.
Bricksforge amplía Bricks Builder con formularios avanzados, animaciones y datos dinámicos. Su función Pro Forms acepta cargas de archivos. El plugin valida correctamente el tipo MIME de un archivo cuando se carga por primera vez, pero cuando el formulario se envía posteriormente, confía en los metadatos del archivo que envía el cliente y nunca valida el campo url dentro del parámetro temporaryFileUploads.
Esa única comprobación ausente convierte una carga de imagen benigna en ejecución remota de código sin autenticación. Un atacante no necesita cuenta, ni un token CSRF que no pueda generar por sí mismo, ni interacción del usuario. Patchstack observó explotación a partir de 2026-10-07 21:47:17 UTC desde 63 IPs de origen únicas que abarcan infraestructura de centros de datos, nube, VPN y residencial.
file (la ruta del lado del servidor cuyo MIME se verificó) y url (el destino en el que el plugin escribirá) están desacoplados. El plugin vuelve a leer el url proporcionado por el cliente en el momento del envío y escribe allí los bytes preparados.
{
"temporaryFileUploads": [
{
"field": "form-field-file",
"file": {
"file": "/var/www/example.com/wp-content/uploads/bricksforge/tmp/img_example.gif",
"url": "https://example.com/wp-content/uploads/bricksforge/tmp/img_example.php",
"type": "image/gif"
}
}
]
}
La firma es la discrepancia: la ruta del lado del servidor es un .gif, la URL de destino es un .php. En el 95% de las solicitudes capturadas, la ruta del lado del servidor terminaba en .gif o .png.
| Archivo | Rol |
|---|---|
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/init.php | Punto de inyección: los metadatos proporcionados por el cliente (incluida url) se fusionan en el contexto de la acción del formulario sin validación. |
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/base.php | Sumidero: los metadatos confiables impulsan la escritura final del archivo, por lo que el atacante controla el nombre de archivo de destino en disco y la extensión. |
| # | Paso | Observable |
|---|---|---|
| 1 | Obtener un nonce no autenticado: POST /wp-admin/admin-ajax.php con action=bricksforge_regenerate_nonce. No se requiere autenticación; devuelve un nonce válido. | Solicitud a admin-ajax.php con action=bricksforge_regenerate_nonce |
| 2 | Subir un polyglot GIF/PHP: una imagen válida que también contiene código PHP. La validación MIME sí se realiza aquí, por lo que pasa y aterriza en wp-content/uploads/bricksforge/tmp/. | Carga multipart que escribe en /wp-content/uploads/bricksforge/tmp/ |
| 3 | Enviar el formulario con metadatos discrepantes: file apunta al .gif validado, url termina en .php. | Solicitud form_submit que contiene temporaryFileUploads |
| 4 | El plugin escribe el contenido en la ubicación PHP → RCE. Solicitar esa URL ejecuta el código incrustado: web shells, modificación de contenido, robo de datos, persistencia. | GET HTTP a un archivo .php recién creado bajo un directorio de uploads |
Los atacantes sondean activamente formas de eludir el filtrado de extensiones. Cuatro familias: