flawopen.com/Incidents/bricksforge-pro-forms-upload-metadata-october-2026
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]
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]
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 evidencia | Qué indica | Acción defensiva |
|---|---|---|
| Registro CNA de Wordfence / CVE | Describe 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 Bricksforge | La 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 compromiso | Las 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
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
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]
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]
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]
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;
}
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
- ✓Inventaríe las versiones de Bricksforge en producción, pruebas y sitios de clientes gestionados; actualice las instalaciones afectadas a la versión compatible más reciente. Patchstack identifica 3.1.8.10 como corregida, mientras que el changelog del proveedor documenta la corrección en 4.0.1 sin indicar el límite exacto de la rama 3.x.[1], [2], [3], [4], [5]
- ✓Recomendación operativa de FlawOpen: Considere no fiables todos los nombres, URL, rutas y etiquetas MIME enviados por el cliente al finalizar; derive el nombre y la ruta almacenados de un registro del servidor y de una lista permitida basada en el contenido inspeccionado.
- ✓Recomendación operativa de FlawOpen: Almacene las cargas fuera de raíces web ejecutables siempre que sea posible; si no, configure el servidor web para denegar la ejecución de scripts en todos los directorios temporales y de carga.
- ✓Recomendación operativa de FlawOpen: Vincule cada registro de carga pendiente a la sesión del formulario que lo creó, permita usarlo una sola vez y rechace identificadores ausentes, caducados, repetidos o incompatibles.
- ✓Recomendación operativa de FlawOpen: Si un sitio vulnerable estuvo expuesto públicamente, revise los registros web y de aplicación en busca de actividad de carga inusual y archivos recién creados; conserve pruebas y siga el proceso de respuesta a incidentes del proveedor antes de limpiar.
- ✓Recomendación operativa de FlawOpen: Añada pruebas de regresión para metadatos discordantes, contenido no permitido e identificadores de otras sesiones, caducados o repetidos; compruebe que se rechazan y que no se escribe ningún archivo en una ubicación ejecutable.
Fuentes
- CVE-2026-85097 — registro CNA de Wordfence
- Wordfence — aviso sobre carga arbitraria sin autenticación en Bricksforge
- Patchstack — vulnerabilidad crítica de carga sin autenticación explotada en Bricksforge (2026-10-08)
- Patchstack — detalles de la vulnerabilidad y versión corregida de Bricksforge
- Bricksforge — historial de versiones