Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-43866 — Reproductor para CVE-2026-43866 — bypass del filtro de deserialización de CVE-2026-40860 mediante DefaultExchangeHolder forjado en Apache Camel camel-jms (inyección de estado de Exchange) | Kitploit
Herramientas/GitHubGitHub/oscerd/cve-2026-43866
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y Educación
GitHuboscerd/cve-2026-43866

CVE-2026-43866

Reproductor para CVE-2026-43866 — bypass del filtro de deserialización de CVE-2026-40860 mediante DefaultExchangeHolder forjado en Apache Camel camel-jms (inyección de estado de Exchange)

Ver Repositorio
hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

camel-jms: Reproductor de omisión de filtro con DefaultExchangeHolder forjado (CVE-2026-43866)

Este proyecto demuestra la CVE-2026-43866, una omisión (bypass) de la corrección de la CVE-2026-40860 en los componentes camel-jms (y camel-sjms / familia JMS) de Apache Camel. La CVE-2026-40860 añadió una lista blanca de clases posterior a la deserialización (java.**;javax.**;org.apache.camel.**;!*) para las cargas útiles entrantes de JMS ObjectMessage. Pero org.apache.camel.support.DefaultExchangeHolder se encuentra en el espacio de nombres org.apache.camel.** incluido en la lista blanca, por lo que un ObjectMessage cuyo objeto de nivel superior es un DefaultExchangeHolder supera la comprobación. El lado receptor llama entonces a DefaultExchangeHolder.unmarshal() sobre él sin requerir transferExchange, escribiendo cada campo no nulo del holder en el Exchange enrutado (body, cabeceras IN/OUT, propiedades del exchange, variables, id del exchange, excepción). Un atacante que pueda publicar un ObjectMessage puede por tanto inyectar estado arbitrario del Exchange utilizando únicamente tipos java.* universalmente confiados, sin necesidad de una cadena de gadgets de deserialización — para manipular el enrutamiento, las cabeceras, las propiedades y el manejo de errores.

Aviso de seguridad: https://camel.apache.org/security/CVE-2026-43866.html

Resumen de la vulnerabilidad

Detalles técnicos

root@kitploit:~
// JmsBinding.extractBodyFromJms(...) - affected 4.18.2
if (message instanceof ObjectMessage objectMessage) {
    Object payload = objectMessage.getObject();
    checkDeserializedClass(payload);                        // CVE-2026-40860 allow-list: java.**;javax.**;org.apache.camel.**;!*
    if (payload instanceof DefaultExchangeHolder holder) {  // <-- DefaultExchangeHolder is org.apache.camel.** -> passes
        DefaultExchangeHolder.unmarshal(exchange, holder);  // <-- writes forged state into the Exchange; NO transferExchange gate
        Map<String, Object> jmsHeaders = extractHeadersFromJms(message, exchange);
        exchange.getIn().getHeaders().putAll(jmsHeaders);
        return exchange.getIn().getBody();
    } else {
        return payload;
    }
}

La asimetría: el lado emisor restringe la creación de ObjectMessage/transferExchange, pero el lado receptor ejecuta unmarshal sobre cualquier DefaultExchangeHolder que deserialice. La corrección (4.14.8 / 4.18.3 / 4.21.0) añade una nueva opción objectMessageEnabled (security = "insecure:serialization", por defecto false): un ObjectMessage entrante ya no se deserializa en absoluto a menos que se habilite explícitamente, por lo que un holder forjado nunca puede llegar a unmarshal(). (Este es un cambio disruptivo para las rutas que dependen de ObjectMessage / transferExchange).

Una lista blanca del proveedor JMS no sirve de ayuda. Este PoC configura el cliente ActiveMQ con un trustedPackages = [java, javax, org.apache.camel] realista y restringido: la entrada org.apache.camel es exactamente lo que un despliegue que usa transferExchange legítimo debe confiar. El holder forjado sigue superando la comprobación, porque es en sí mismo un DefaultExchangeHolder cuyos campos son todos tipos java.* confiados, indistinguible de uno legítimo.

La ruta de la víctima

root@kitploit:~
from("jms:queue:cve")                 // mapJmsMessage defaults to true; transferExchange NOT set
    .process(exchange -> { /* observes the injected body / headers / properties */ });

Estructura del repositorio: atacante vs. víctima

La víctima es el consumidor JMS de Camel. El atacante es cualquier productor que pueda publicar en la cola. Ambos se comunican con un broker real de Apache ActiveMQ Artemis en Docker.

root@kitploit:~
CVE-2026-43866/
├── pom.xml                 # camel-jms 4.18.2 + activemq-client 6.2.4  (NO gadget library)
├── Dockerfile              # runs the app (no --add-opens; no gadget)
├── docker-compose.yml      # Artemis broker (quay.io) + the reproducer app
├── README.md
└── src/main/
    ├── java/com/example/
    │   ├── Application.java
    │   ├── JmsConfig.java            # OpenWire ConnectionFactory (trustedPackages incl. org.apache.camel) + jms component
    │   ├── VictimRoute.java          # victim: from("jms:queue:cve"); records what the route observed
    │   ├── CapturedState.java
    │   ├── ForgedHolderFactory.java  # builds a DefaultExchangeHolder via the public marshal() API
    │   └── ExploitController.java    # attacker: publishes the forged holder as an ObjectMessage
    └── resources/
        └── application.properties

Requisitos previos

  • Java 17+ y Maven 3.8+
  • Docker (ejecuta el broker y la aplicación)

Pasos de reproducción

Paso 1: Compilar e iniciar todo

root@kitploit:~
mvn clean package -DskipTests
docker compose up -d --build

Paso 2: Disparar la omisión (bypass)

root@kitploit:~
curl -s http://localhost:8080/exploit/attack
# -> Published a forged DefaultExchangeHolder as a JMS ObjectMessage to queue 'cve'.
#    ...
#      body      = INJECTED-BODY-...      (injected: true)
#      header    = pwned-header-...       (injected: true)
#      property  = pwned-property-...     (injected: true)
#
#    >>> Exchange-state injection proof — attacker controlled body+header+property: true

La ruta se ejecutó con un body, una cabecera y una propiedad que nunca estableció: todos proporcionados por el holder forjado del atacante.

Limpieza

root@kitploit:~
docker compose down

Vectores de ataque

Cualquier consumidor JMS de Camel (camel-jms, camel-sjms, camel-sjms2, camel-amqp, camel-activemq, camel-activemq6) con mapJmsMessage=true (el valor por defecto), que lea de un destino al que un atacante pueda publicar. transferExchange no necesita estar habilitado en el consumidor.

Condiciones de explotación

  1. Un consumidor JMS de Camel con mapJmsMessage=true (por defecto), en una versión afectada.
  2. El atacante puede encolar un ObjectMessage cuya carga útil sea un DefaultExchangeHolder.
  3. El proveedor JMS deserializa la carga útil — lo que, para cualquier despliegue que use transferExchange, significa que el proveedor ya confía en org.apache.camel. No se requiere ninguna librería de gadgets.

Corrección recomendada

Actualice a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23373 / CAMEL-23409). El manejo de JMS ObjectMessage está deshabilitado por defecto mediante la nueva opción objectMessageEnabled; actívela únicamente para destinos alimentados exclusivamente por productores de confianza.

Mitigación

Mientras se actualiza:

  1. Restrinja el acceso de publicación a las colas/temas consumidos por Camel a productores de confianza mediante la autorización del broker JMS.
  2. No exponga consumidores JMS que mapeen cuerpos de ObjectMessage a redes no confiadas.
  3. Nota: una lista blanca de deserialización del proveedor JMS no mitiga esta omisión específica (la carga útil utiliza únicamente clases universalmente confiadas más DefaultExchangeHolder).

Descargo de responsabilidad

Este reproductor se proporciona únicamente para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No lo utilice contra sistemas sin permiso explícito.

Descargar herramienta
PropiedadValor
Componentescamel-jms (+ camel-sjms, camel-sjms2, camel-amqp, camel-activemq, camel-activemq6)
Clase afectadaorg.apache.camel.component.jms.JmsBinding#extractBodyFromJms → DefaultExchangeHolder.unmarshal
CWECWE-502 (Deserialización de datos no confiados) + CWE-20 (Validación de entrada incorrecta)
ImpactoInyección de estado del Exchange: body, cabeceras, propiedades, variables y excepción controlados por el atacante
NaturalezaOmisión (bypass) de la corrección del filtro de clases de la CVE-2026-40860 (no es un fallo de la propia corrección)
Versiones afectadasDesde 3.0.0 hasta antes de 4.14.8, desde 4.15.0 hasta antes de 4.18.3, desde 4.19.0 hasta antes de 4.21.0
Versiones corregidas4.14.8, 4.18.3, 4.21.0
JIRACAMEL-23373 (jms), CAMEL-23409 (sjms)
Reporterogaorenyusi