FlawOpen

flawopen.com/Incidents/bricksforge-pro-forms-upload-metadata-october-2026

● Bricksforge WordPress plugin · CVE-2026-85097 · 2026-10-07 · CVSS 9.8 · Crítica
Investigación · FlawOpen

CVE-2026-85097 en Bricksforge: fallo de carga en Pro Forms

CVE-2026-85097 permitía que solicitudes sin autenticación aprovecharan la diferencia entre el contenido validado de un archivo temporal y los metadatos de destino controlados por el cliente en Bricksforge Pro Forms. Patchstack informa de intentos de explotación; actualice el complemento e investigue los sitios expuestos.[1], [2], [3], [4], [5]

💡 Explicación en Lenguaje Sencillo (ELI5)

Imagine una sala de correo que comprueba que un paquete contiene una imagen inofensiva y luego permite al remitente cambiar la etiqueta antes de enviarlo a una oficina que abre ciertas etiquetas como programas. Bricksforge comprobaba la carga temporal, pero el envío posterior del formulario podía indicar otro nombre de destino. La defensa consiste en mantener la identidad y el destino del archivo bajo control del servidor durante todo el almacenamiento.[3], [2]

Conceptos Clave y Términos

Carga temporal
Archivo almacenado provisionalmente antes de completar el formulario. La validación en esta fase no vuelve fiables los metadatos que el cliente envía después.[2], [3]
CWE-434
Carga sin restricciones de archivos de tipo peligroso: el sistema acepta un archivo que puede interpretarse o ejecutarse de forma peligrosa.[1], [2]
Límite de confianza de metadatos
Punto en el que la aplicación decide si un nombre, URL, tipo MIME o ruta procede de un registro fiable del servidor o de un cliente no fiable.[2], [3]
Puntuación CVE y explotación
El registro CVE de la CNA Wordfence asigna CVSS 3.1 9.8 y el enriquecimiento de CISA indica que no hay explotación. Patchstack asigna 10.0 e informa de telemetría observada por primera vez el 7 de octubre de 2026. Son registros atribuidos por separado; ninguno confirma la inclusión en CISA KEV.[1], [2], [3], [4]
Código ilustrativo
La comparación PHP siguiente modela de forma genérica el límite de validación. No es código de Bricksforge ni una reconstrucción de su parche; el changelog citado no publica esos detalles.[2], [3], [5]

Mapeos de marcos

  • Referencia CWE para la debilidad descrita en esta guía: CWE-434

Estado de versiones reportado y acción para operadores

Fuente de evidenciaQué indicaAcción defensiva
Registro CNA de Wordfence / CVEDescribe la carga arbitraria de archivos sin autenticación; el intervalo afectado registrado termina en 3.1.8.9.Tómalo como el alcance registrado por la CNA, no como prueba de que una instalación está limpia.
Patchstack (8 oct 2026)Informa de intentos de explotación observados por primera vez el 7 de octubre e identifica 3.1.8.10 como versión corregida.Trátalo como el límite de corrección indicado por Patchstack; verifica la versión realmente instalada en cada sitio.
Registro público de cambios de BricksforgeLa versión 4.0.1 incluye una corrección de seguridad de carga en Pro Forms, pero no identifica el límite de 3.1.8.10.No deduzcas solo del registro de cambios que 4.0.1 fue la primera versión corregida ni que una versión 3.x concreta sea segura.
Sitio expuesto o con posible compromisoLas fuentes describen intentos de explotación, no demuestran que todos los sitios objetivo fueran comprometidos.Actualiza a una versión con soporte vigente; revisa los registros de cargas y del servidor web e investiga archivos inesperados antes de declarar la recuperación.

Cronología del Incidente

2026-10-07

Wordfence indica el 7 de octubre como fecha de publicación pública del aviso. Patchstack afirma que su telemetría observó los primeros intentos ese día a las 21:47 UTC; la publicación del aviso y la observación de telemetría son hechos distintos.[2], [3]

2026-10-08

El registro CVE indica datePublished el 8 de octubre, un día después de la fecha de publicación pública de Wordfence, el 7 de octubre. El informe de campaña de Patchstack también indica que se publicó el 8 de octubre; son fechas de registros y publicaciones distintos.[1], [2], [3]

2026-10-08

El análisis de Patchstack del 8 de octubre describe la discrepancia de validación y los intentos observados, e identifica la versión 3.1.8.10 como corregida. El changelog de Bricksforge enumera por separado una corrección de seguridad de carga de Pro Forms en 4.0.1, pero no establece el límite exacto corregido de la rama 3.x.[3], [4], [5]

Flujo de Ataque Paso a Paso

Paso 1

Un archivo temporal supera una comprobación inicial

La CNA describe una carga temporal previa que supera la validación MIME. Eso no autoriza cambios posteriores arbitrarios en el nombre o destino del archivo.[2], [1]

Paso 2

El envío del formulario aporta otros metadatos

Patchstack informa de que el procesamiento posterior confiaba en metadatos temporaryFileUploads enviados por el cliente, incluida una URL que podía no corresponder al archivo ya validado. El fallo está en confiar en el contenido comprobado y no validar los metadatos del destino.[2], [3]

Paso 3

El archivo recibe un nombre peligroso

Si el servidor usa ese destino controlado por el cliente para finalizar la carga, una extensión peligrosa puede provocar interpretación en el servidor cuando el destino permite ejecutar archivos. Esta descripción explica el fallo a alto nivel; no hacen falta formatos de solicitud ni cargas útiles.[2], [3]

Paso 4

La exposición puede comprometer el servidor

La CNA indica que el problema puede permitir ejecución arbitraria de PHP. Patchstack informa de intentos y recomienda actualizar. Sus observaciones no prueban que todos los sitios atacados fueran comprometidos ni identifican a un actor.[2], [3]

Código Fuente: Vulnerable vs. Seguro

Este ejemplo genérico muestra una identidad de carga administrada por el servidor, una consulta por usuario, una nueva comprobación del tipo de contenido, nombres generados y almacenamiento privado. No es código de Bricksforge ni su parche real. El código de producción también debe imponer límites de tamaño, permisos seguros, transiciones de estado atómicas y una entrega adecuada al contexto; la corrección directa para los sitios afectados es actualizar Bricksforge a una versión corregida compatible.[2], [3]

IMPLEMENTACIÓN VULNERABLE
function finalize_upload( array $item, string $stagedPath, string $uploadDir ): string {
    // Los metadatos del cliente eligen el nombre final después de una comprobación MIME previa.
    $name = basename( (string) parse_url( $item['file']['url'], PHP_URL_PATH ) );
    $destination = $uploadDir . DIRECTORY_SEPARATOR . $name;
    if ( ! rename( $stagedPath, $destination ) ) {
        throw new RuntimeException( 'Could not finalize upload' );
    }
    return $destination;
}
PARCHE SEGURO Y ROBUSTO
function finalize_upload( string $uploadId, UploadRegistry $registry, string $privateDir ): string {
    // Obtenga el propietario y la ruta de un registro del servidor, nunca de una URL del cliente.
    $upload = $registry->findPendingForCurrentUser( $uploadId );
    if ( $upload === null || ! is_file( $upload->path ) ) {
        throw new RuntimeException( 'Unknown pending upload' );
    }
    $types = [ 'image/jpeg' => 'jpg', 'image/png' => 'png' ];
    $mime = ( new finfo( FILEINFO_MIME_TYPE ) )->file( $upload->path );
    if ( ! isset( $types[ $mime ] ) ) {
        throw new RuntimeException( 'Unsupported file type' );
    }
    $destination = $privateDir . DIRECTORY_SEPARATOR . bin2hex( random_bytes( 16 ) ) . '.' . $types[ $mime ];
    if ( ! rename( $upload->path, $destination ) ) {
        throw new RuntimeException( 'Could not finalize upload' );
    }
    $registry->markConsumed( $uploadId );
    return $destination;
}

Lista de Verificación de Seguridad para Ingeniería

Fuentes