
CVE-2026-48205 재현 도구: Apache Camel camel-dns의 dns.* 헤더 주입으로 DNS 쿼리를 공격자가 제어하는 리졸버로 리디렉션(DNS를 통한 SSRF)하며 내부 호스트명 정찰을 가능하게 함(4.14.8/4.18.3/4.21.0에서 수정됨)
dns.* / term 헤더 주입 재현 도구 (CVE-2026-48205)이 프로젝트는 Apache Camel의 camel-dns 컴포넌트에서 발생하는 메시지 헤더 주입 취약점을 시연하며,
CVE-2026-48205로 추적됩니다. DNS 프로듀서는 쿼리할 리졸버, 조회할 이름/도메인, 레코드 타입/클래스 및 검색어 등
작업 파라미터를 Exchange 헤더에서 읽어오는데, 해당 헤더의 상수 값(DnsConstants.DNS_SERVER, DNS_NAME,
DNS_DOMAIN, DNS_TYPE, DNS_CLASS, TERM)은 dns.server, dns.name, dns.domain, dns.type,
dns.class, term이라는 평문 문자열이었습니다. 이 이름들은 Camel / camel 접두사로 시작하지 않기 때문에,
HTTP 경계에서 Camel 헤더 네임스페이스만 차단하는 HttpHeaderFilterStrategy가 인바운드 HTTP 요청에서 Exchange로
이 헤더들이 그대로 전달되도록 허용했습니다.
HTTP 컨슈머(예: platform-http)를 dns: 프로듀서로 연결하는 라우트에서, 모든 HTTP 클라이언트는
dns.server 헤더를 설정하여 dig 프로듀서가 공격자가 제어하는 DNS 서버를 가리키는 SimpleResolver를
생성하도록 만들 수 있습니다. 이는 DNS를 통한 서버 측 요청 위조(SSRF) 로, 공격자는 쿼리된 이름을 관찰하고
오염된 응답을 반환할 수 있습니다. 또한 dns.name / dns.domain을 설정하여 임의의 내부 호스트 이름을
확인할 수 있습니다(내부 네트워크 정찰).
Advisory: https://camel.apache.org/security/CVE-2026-48205.html
수정은 헤더 이름을
CamelDnsServer/CamelDnsName등으로 변경하여, 다른 모든 Camel 제어 헤더처럼 HTTP 경계에서 필터링되도록 합니다. CVE-2025-27636, CVE-2026-46454 및 CVE-2026-47323과 같은 계열입니다.
// DnsConstants (영향을 받는 4.18.2) — 제어 헤더 이름이 Camel 접두사가 없는 일반 문자열입니다:
public static final String DNS_SERVER = "dns.server";
public static final String DNS_NAME = "dns.name";
// DnsDigProducer.process (영향을 받는 4.18.2) — 리졸버 대상이 헤더에서 직접 전달됩니다:
String server = exchange.getIn().getHeader(DnsConstants.DNS_SERVER, String.class);
SimpleResolver resolver = new SimpleResolver(server); // <-- 공격자가 제어하는 DNS 서버
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) — 쿼리가 공격자의 서버로 전송됩니다
수정(4.14.8 / 4.18.3 / 4.21.0, CAMEL-23574)은 값을 CamelDns* 규칙으로 변경합니다.
from("platform-http:/lookup")
.setHeader("dns.name", constant("example.com"))
.setHeader("dns.type", constant("A"))
.setHeader("dns.class", constant("IN"))
.to("dns:dig"); // dns.server 없음 -> 기본 리졸버 사용 (의도된 동작)
이 라우트는 고정된 이름을 기본 리졸버로 조회합니다. 공격자는 dns.server 헤더 하나만 추가하여 쿼리를
자신의 DNS 서버로 리디렉션시킵니다. (dns.server는 소문자이므로 서블릿 컨테이너의 헤더 정규화를
통과합니다 — platform-http만으로도 충분합니다.)
모든 것이 하나의 자체 포함 컨테이너에서 실행됩니다: 피해자 라우트, 공격자의 가짜 DNS 서버(UDP 53), 그리고 공격자 드라이버.
CVE-2026-48205/
├── pom.xml # camel-platform-http + camel-dns 4.18.2
├── Dockerfile
├── docker-compose.yml # 단일 자체 포함 서비스
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── FakeDnsServer.java # UDP 53의 공격자 DNS 서버 (리디렉션된 쿼리 기록)
│ ├── VictimRoute.java # platform-http:/lookup -> dns:dig
│ └── ExploitController.java # 공격자: 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) 정상 요청 (dns.server 헤더 없음) — 기본 리졸버 ===
attacker's DNS server was queried: false
=== 2) dns.server=127.0.0.1 주입 (DNS를 통한 SSRF) ===
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
이제 공격자의 DNS 서버는 피해자의 조회 이름을 확인할 수 있습니다(그리고 오염된 응답을 반환할 수도 있습니다).
dns.server를 실제 내부 DNS 리졸버로 지정하거나 dns.name을 내부 호스트 이름으로 설정하면 내부 네트워크에
대한 정찰이 가능해집니다.
4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23574)로 업그레이드하십시오. 업그레이드 후에는 헤더를 통해 DNS 작업을
수행하는 라우트가 CamelDnsServer / CamelDnsName 등을 사용해야 합니다.
업그레이드 전까지는 신뢰할 수 없는 모든 인그레스에서 dns: 프로듀서 앞에 도달하기 전에 dns.* 및 term
헤더를 제거하고, 라우트 내에서 신뢰할 수 있는 소스로 DNS 서버 및 조회 파라미터를 설정하십시오.
이 재현 도구는 공개적으로 공개되었고 수정된 취약점에 대한 보안 연구 및 승인된 테스트 전용으로 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.
| 속성 | 값 |
|---|
| 컴포넌트 | camel-dns |
| 영향을 받는 클래스 | org.apache.camel.component.dns.DnsDigProducer — new SimpleResolver(getHeader("dns.server")) |
| CWE | CWE-20 (잘못된 입력 검증) / CWE-918 (서버 측 요청 위조) |
| 영향 | 라우트의 DNS 쿼리를 공격자가 제어하는 서버로 리디렉션(이름 관찰, 오염된 응답 반환 가능); 내부 호스트 이름 열거 |
| 전제 조건 | 라우트가 HTTP 컨슈머를 dns: 프로듀서로 연결; 컨슈머가 인증을 요구하지 않을 경우 인증 없이 가능 |
| 영향을 받는 버전 | 4.0.0부터 4.14.8 이전, 4.15.0부터 4.18.3 이전, 4.19.0부터 4.21.0 이전 |
| 수정된 버전 | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23574 (PR apache/camel#23411) |
| 발견자 | Yu Bao (PayPal) |