Neutron, nuestro motor de IA, obtuvo un 97.1% en el benchmark CyberGym de UC Berkeley. Más información

Análisis a fondo

Análisis a fondo

Apache OFBiz: RCE previa a la autenticación corregida en 24.09.08 (CVE-2026-68524)

Apache OFBiz anterior a 24.09.08 carga una definición de pantalla desde un descriptor elegido por el atacante y ejecuta código; se corrigen 46 CVE.

Resumen

  • Apache OFBiz carga una definición de pantalla desde una ubicación que una petición JSON no autenticada puede definir. Un atacante apunta la página de acceso a su propio XML y ejecuta código en el proceso del servidor.
  • Todas las versiones anteriores a 24.09.08 están afectadas. El proyecto publicó la corrección en 24.09.08 y anunció 46 CVE en la misma versión el 4 de noviembre de 2026.
  • Apache describe la serie como con problemas críticos y nombra siete fallos de ejecución de código, varios sin autenticación. CVE-2026-68524 no está en el catálogo KEV de CISA al 5 de noviembre de 2026, y no se conoce explotación.
  • Actualice cada instancia de OFBiz a 24.09.08. El proyecto no publica ninguna solución alternativa para la serie; consulte «¿Cómo lo corrijo?» para reducir la exposición mientras programa la actualización.

¿Estoy afectado?

Todas estas condiciones deben cumplirse para que una instancia esté expuesta:

  • La instancia ejecuta una versión de OFBiz anterior a 24.09.08.
  • Su aplicación web es accesible para el atacante. La página de acceso y los puntos de la aplicación bastan; no se necesita una cuenta.
  • La instancia no se ha corregido con la versión 24.09.08. Los componentes personalizados que integran código del framework de OFBiz necesitan la misma corrección.

El proyecto indica que todas las versiones anteriores a 24.09.08 están afectadas. Eso incluye la rama 18.12 y las versiones más antiguas que ya no se mantienen.

Rama Versiones afectadas Versión corregida
24.09 24.09.01 a 24.09.07 24.09.08
18.12 18.12.19 y anteriores 24.09.08
17.12 y anteriores todas las versiones 24.09.08

Compruebe la versión instalada:

basename "$(readlink -f "$OFBIZ_HOME")"
git -C "$OFBIZ_HOME" describe --tags 2>/dev/null

Una instalación binaria imprime un directorio como apache-ofbiz-24.09.08. Una instalación desde código fuente imprime una etiqueta como release24.09.08. Para un contenedor, ejecute el mismo comando dentro:

docker exec <container> sh -c 'basename "$(readlink -f "$OFBIZ_HOME")"'

El archivo VERSION en la raíz del árbol de código fuente dice 24.09 para cada versión de mantenimiento de la serie, así que no distingue 24.09.07 de 24.09.08. Use el nombre del directorio, la etiqueta de git o el nombre del archivo descargado.

¿Cómo lo corrijo?

  1. Haga una copia de seguridad de la base de datos y del directorio runtime/, que contiene la configuración y los secretos de la instancia.
  2. Detenga el proceso de OFBiz. Si se ejecuta con Gradle, detenga el proceso ./gradlew ofbiz o el servicio que lo envuelve.
  3. Descargue apache-ofbiz-24.09.08 desde la página de descargas del proyecto y descomprímalo.
  4. Despliéguelo como cualquier versión de mantenimiento, conservando su configuración runtime/ y sus componentes personalizados. No ejecute loadAll sobre una base de datos existente: el README del proyecto advierte que la tarea puede sobrescribir datos.
  5. Inicie el nuevo árbol con ./gradlew ofbiz y compruebe que la página de acceso se muestra.
  6. Confirme la versión con el comando de «¿Estoy afectado?» y repita en cada instancia e imagen de contenedor.

No se publica ninguna solución alternativa para la serie. Hasta que se programe la actualización, reduzca la exposición:

  1. Ponga la interfaz web de OFBiz detrás de una lista de permitidos de red, para que solo los administradores conocidos puedan acceder.
  2. No exponga directamente la página de acceso ni los puntos de la aplicación a internet.
  3. Si un proxy inverso está delante de OFBiz, rechace los cuerpos JSON que lleven la clave mainDecoratorLocation o cualquier nombre de atributo que coincida con su configuración de decorador.

Esos pasos reducen quién puede alcanzar la ruta vulnerable. No corrigen la fusión de atributos de la petición ni la resolución de ubicaciones de widgets.

¿Cuál es la causa raíz?

OFBiz representa páginas a partir de definiciones de pantalla XML. Una pantalla puede incluir otra con un atributo location, y la ubicación de un decorador suele ser una expresión de cadena flexible como ${parameters.mainDecoratorLocation}. El valor viene del contexto de la petición, así que las fábricas de widgets lo tratan como controlado por el atacante.

La primera mitad del fallo está en WebAppUtil.setAttributesFromRequestBody. Fusionaba cada clave de un cuerpo JSON anónimo en los atributos de la petición:

if (requestBodyMap != null) {
    Set<String> parameterNames = requestBodyMap.keySet();
    for (String parameterName: parameterNames) {
        request.setAttribute(parameterName, requestBodyMap.get(parameterName));
    }
}

Un cuerpo de petición podía por tanto definir mainDecoratorLocation, aunque la aplicación web ya expone ese nombre como atributo ServletContext de confianza, definido en web.xml. El comentario de la corrección describe la consecuencia: el cuerpo podía «ocultar la ubicación de decorador configurada para la aplicación web».

La segunda mitad es el resolutor de ubicaciones de widgets. ScreenFactory, FormFactory, GridFactory, MenuFactory y TreeFactory pasaban la ubicación a FlexibleLocation.resolveLocation y analizaban el XML que devolvía.

La página de acceso se representa antes de la autenticación y usa la ubicación del decorador. Una petición que cambia esa ubicación llega por tanto al analizador de widgets sin sesión. El analizador acepta cualquier URL que FlexibleLocation pueda resolver, incluido el esquema file:. La corrección añade un único guardián, WidgetSecureLocation, y el comentario de la clase nombra el vector usado en la cadena reportada:

/**
 * Any {@code file:} scheme location - single-slash or otherwise, in any letter case - is rejected
 * outright at the protocol layer: it is never a legitimate widget location, and on Linux it is the
 * carrier used to reach live process-descriptor aliases such as {@code file:/dev/fd/N} or
 * {@code file:/proc/thread-self/fd/N}.
 */
public static String sanitize(String location) {
    if (UtilValidate.isEmpty(location)) {
        return null;
    }
    if (isFileScheme(location) || UtilValidate.isUrlInStringAndDoesNotStartByComponentProtocol(location)) {
        return null;
    }
    if (location.startsWith(COMPONENT_PROTOCOL)) {
        String componentRelativePath = location.substring(COMPONENT_PROTOCOL.length());
        if (componentRelativePath.contains("..")) {
            return null;
        }
        // ...
        return COMPONENT_PROTOCOL + normalizedPath;
    }
    if (UtilValidate.isAllowedPath(location)) {
        return location;
    }
    return null;
}

Las pruebas añadidas con la corrección usan file:/dev/fd/292, file:/proc/self/fd/292, file:/proc/thread-self/fd/292 y file:/proc/%73elf/fd/292. Un descriptor de archivo permanece abierto mientras se atiende la petición, así que una ubicación controlada por la petición puede nombrar su propio cuerpo o un archivo temporal subido. El analizador de pantallas lee entonces el XML del atacante desde ese descriptor.

¿Cómo se explota?

  1. El atacante envía una petición JSON anónima a la página de acceso de OFBiz o a otro punto anterior a la autenticación.
  2. El cuerpo JSON define mainDecoratorLocation a una ubicación file: que nombra un descriptor que el atacante puede influir, por ejemplo file:/proc/self/fd/<n>.
  3. WebAppUtil copia la clave en los atributos de la petición, ocultando la ubicación de decorador de confianza.
  4. La página de acceso resuelve el decorador mediante la fábrica de widgets, que lee el XML desde el descriptor en lugar de una ruta component://.
  5. La definición de pantalla del atacante lleva una acción o una expresión de widget que el motor de representación ejecuta.
  6. El código se ejecuta en el proceso Java de OFBiz, con el usuario del sistema operativo que ejecuta OFBiz, antes de que el usuario se autentique.

El segundo fallo de ejecución de código antes de la autenticación de la serie, CVE-2026-83542, se describe como inyección de widget en la página de acceso y se corrige con el mismo guardián de ubicación de pantalla. CVE-2026-73578 es un bypass de autorización de vista guardada, no autenticado, con impacto RCE. No se ha publicado código de exploit para ninguno de los tres.

¿Cómo se desarrolla el ataque?

La página de acceso lee la ubicación de su decorador del contexto de la petición, y la corrección cierra tanto la ocultación del atributo como la ruta por descriptor de archivo.

flowchart LR A["Cuerpo JSON anónimo
define mainDecoratorLocation"] --> B["El cuerpo oculta
un atributo ServletContext de confianza"] B --> C["La página de acceso resuelve
la ubicación del decorador"] C --> D["file:/proc/self/fd/N
nombra el flujo de la petición"] D --> E["La fábrica de pantallas analiza
el XML del atacante"] E --> F["La acción de la pantalla se ejecuta
antes de la autenticación"] F --> G["El código se ejecuta en la JVM de OFBiz
como el usuario de OFBiz"]

¿Qué puede hacer un atacante?

Un atacante no autenticado ejecuta código arbitrario en el proceso Java de OFBiz, con los privilegios del usuario que ejecuta el servidor. Ese usuario puede leer la configuración de la instancia, alcanzar la base de datos con las credenciales configuradas y modificar la aplicación.

El impacto necesita todas estas condiciones:

  • La aplicación web de OFBiz es accesible desde la red del atacante.
  • La instancia ejecuta una versión anterior a 24.09.08.
  • El atacante puede definir un atributo de la petición mediante un cuerpo JSON y nombrar un descriptor de archivo que contiene su XML. Las pruebas de la corrección muestran las rutas de descriptor que usó la cadena.
  • La definición de pantalla que proporciona el atacante contiene una acción ejecutable.

La serie también conlleva otros impactos que no necesitan la ruta del descriptor. CVE-2026-105330 es una clave criptográfica codificada en el código de autenticación JWT que permite acceso administrativo sin autenticación. CVE-2026-109928 es un algoritmo incorrecto de restablecimiento de contraseña que permite tomar el control total de una cuenta. Quince de las 46 CVE son fallos de autorización ausente o de bypass de autorización, incluidos casos entre inquilinos y de solo lectura.

¿Por qué funciona la corrección?

La corrección pasa cada ubicación de widget por WidgetSecureLocation.sanitize antes de resolverla. La función rechaza cualquier esquema file: sin importar el uso de mayúsculas. Rechaza .. dentro de una ruta component://. Deniega cualquier otra ruta del sistema de archivos salvo que un administrador haya configurado la nueva expresión regular security.allowFilePaths. La propiedad está vacía por defecto, lo que deniega las ubicaciones fuera de un componente por defecto.

La corrección también detiene la ocultación en el origen. WebAppUtil ahora omite una clave del cuerpo cuando el ServletContext ya expone un atributo con ese nombre:

ServletContext servletContext = request.getServletContext();
Set<String> parameterNames = requestBodyMap.keySet();
for (String parameterName: parameterNames) {
    // A request body is anonymous, attacker-controlled input. Never let it shadow a name
    // the webapp already exposes as a trusted, application-owned ServletContext attribute
    if (servletContext.getAttribute(parameterName) != null) {
        Debug.logWarning("Ignoring request body attribute [%s]: it shadows an existing"
                + " ServletContext attribute of the same name", MODULE, parameterName);
        continue;
    }
    request.setAttribute(parameterName, requestBodyMap.get(parameterName));
}

Juntos, los dos cambios eliminan las dos mitades de la cadena. El atacante ya no puede sustituir la ubicación del decorador, y una ubicación que nombra un descriptor ya no se acepta.

El commit aplica la comprobación a pantallas, formularios, rejillas, menús y árboles. Añade pruebas unitarias para la lista de permitidos y los casos de esquema file:. Es completo para esas cinco fábricas. Cualquier fábrica de widgets personalizada fuera del framework necesitaría la misma llamada.

¿Cómo compruebo si estuve comprometido?

No se publican indicadores de compromiso para CVE-2026-68524 ni para el resto de la serie. Una petición correcta puede parecer una petición normal de la página de acceso, y el código anterior a la corrección no registraba nada cuando un atributo del cuerpo ocultaba un atributo ServletContext.

Merece la pena ejecutar dos comprobaciones en una instancia que estuvo expuesta a internet:

  1. Busque en el registro de acceso del servidor web las peticiones POST JSON a la página de acceso o a los puntos de control, y después inspeccione los cuerpos que su proxy registró en busca de las claves mainDecoratorLocation, decorator, location o screen. Un cuerpo que define una ubicación de decorador es una pista. Un proxy que no registra cuerpos no puede responder a esta pregunta.
  2. Busque en el registro de OFBiz errores de análisis XML o avisos de widgets alrededor de las mismas peticiones. Una pantalla malformada produce una excepción del analizador. Una pantalla válida puede no dejar ninguna entrada.

Trate una petición inexplicada antes de la autenticación que nombre un decorador o una ubicación file: como una posible compromisión. Reconstruya la instancia desde el árbol 24.09.08, rote las credenciales de base de datos y correo que contiene, y revise las cuentas y las tareas programadas.

Cronología

  • 2026-07-30: el endurecimiento de ubicaciones de pantalla se retroporta a la rama 24.09 en la PR #1528.
  • 2026-08-14: el guardián WidgetSecureLocation y la corrección de la ocultación por cuerpo de petición se fusionan en la PR #1650 (commit 4afb9c9a), y la PR #1654 los retroporta a la rama 24.09.
  • 2026-10-21: se etiqueta la versión 24.09.08.
  • 2026-11-04: el proyecto anuncia 46 CVE en 24.09.08 en la lista de correo oss-security.

La corrección se fusionó en julio y agosto, la versión se etiquetó en octubre y la serie de CVE se anunció el 4 de noviembre
Figura 1: del primer commit de corrección al anuncio de las CVE. Fuente: pull requests, etiqueta de versión y anuncio de oss-security de Apache OFBiz, verificados el 5 de noviembre de 2026

Preguntas frecuentes

¿Qué versión lo corrige?

Apache OFBiz 24.09.08 corrige las 46 CVE de la serie. El proyecto indica que todas las versiones anteriores a 24.09.08 están afectadas y no publica retroportaciones a la rama 18.12 ni a las ramas más antiguas, así que esas instalaciones deben pasar a 24.09.08.

¿Tengo que corregir las 46 CVE a la vez?

Sí, porque las 46 llegan en una sola versión, 24.09.08. Van desde la ejecución de código y las credenciales codificadas hasta la autorización ausente, la inyección SQL y XML, el recorrido de rutas, la falsificación de peticiones del lado del servidor, el cross-site scripting, la divulgación de datos y la denegación de servicio. Varias son accesibles sin autenticación.

¿Hay una solución alternativa si no puedo actualizar esta semana?

El proyecto no publica ninguna. Restringir la interfaz web a redes de administradores conocidos y rechazar cuerpos de petición que definan atributos de decorador reduce la exposición, pero no elimina el código vulnerable. Trate la actualización como la corrección.

¿Se ha explotado CVE-2026-68524 en entornos reales?

No se conoce explotación al 5 de noviembre de 2026, y la CVE no está en el catálogo KEV de CISA. Apache anunció la serie el 4 de noviembre de 2026, y el material público no contiene ninguna prueba de concepto.

¿Por qué los registros CVE no están todavía en las bases públicas?

El proyecto anunció los identificadores CVE el 4 de noviembre de 2026. En el momento de escribir, la API de CVE Services de MITRE no devolvía registros para los identificadores comprobados. La lista de avisos y los commits de corrección son las fuentes públicas disponibles. Los identificadores y las correspondencias de corrección están en la página de seguridad del proyecto.

Referencias

  • Apache OFBiz, página «Apache OFBiz Security», lista de vulnerabilidades conocidas y pull requests de corrección. https://ofbiz.apache.org/security.html (verificado el 5 de noviembre de 2026)
  • Apache OFBiz, «Apache OFBiz: CVE Announcements», oss-security, 4 de noviembre de 2026. https://www.openwall.com/lists/oss-security/2026/11/04/9 (verificado el 5 de noviembre de 2026)
  • Apache OFBiz, página «Download», versión 24.09.08. https://ofbiz.apache.org/download.html (verificado el 5 de noviembre de 2026)
  • Apache OFBiz, pull request #1650, «Restrict widget resource locations to component:// or an explicit allowlist». https://github.com/apache/ofbiz-framework/pull/1650 (verificado el 5 de noviembre de 2026)
  • Apache OFBiz, commit 4afb9c9a, corrección de WidgetSecureLocation y del cuerpo de petición. https://github.com/apache/ofbiz-framework/commit/4afb9c9ab4d9fe7777c00f45eb07c961bcbc357a (verificado el 5 de noviembre de 2026)
  • Apache OFBiz, pull request #1654, retroportación 24.09 de la corrección de ubicación de widgets. https://github.com/apache/ofbiz-framework/pull/1654 (verificado el 5 de noviembre de 2026)
  • Apache OFBiz, pull request #1528, retroportación del endurecimiento de ubicaciones de pantalla. https://github.com/apache/ofbiz-framework/pull/1528 (verificado el 5 de noviembre de 2026)
  • Apache OFBiz, etiqueta de versión release24.09.08. https://github.com/apache/ofbiz-framework/releases/tag/release24.09.08 (verificado el 5 de noviembre de 2026)