
CVE-2026-85246에 대한 실행 가능한 Spring Boot 재현 프로젝트로, 소켓을 통한 camel-mina 컨슈머 예외 노출을 시연하고 muteException 수정 사항을 검증합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 이 취약점은 Mina 컨슈머가 exchange 처리에 실패했을 때 exchange.getException()을 원격 피어에게 소켓을 통해 그대로 다시 기록했던 문제입니다.
textline 코덱을 통해서는 피어에게 예외의 클래스 이름과 메시지를 넘겨주며, object 코덱을 통해서는 직렬화된 예외를 원인 체인까지 포함하여 넘겨줍니다. 실패를 유발할 수 있는 원격 피어는 배포 환경에 대한 내부 세부 정보 — 클래스 및 패키지 이름, 그리고 메시지나 중첩된 원인이 담고 있는 모든 것(실제로는 경로, 호스트 이름, 연결 세부 정보 포함) — 를 읽을 수 있었습니다. 이 컨슈머에는 이를 억제할 옵션이 없었으며, 이는 CAMEL-23651로 정렬된 HTTP 계열 컨슈머와 달랐습니다.
Spring Boot 전용.
camel-quarkus-mina확장은 존재하지 않으므로, 이 재현기는 단일 Camel Spring Boot 모듈로 제공됩니다. (결함은 컴포넌트의MinaConsumer에 있으며, 이는 런타임에 독립적입니다.)
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina 4.22.0 (영향받음; 4.22.1에서 수정됨) |
Mina TCP 컨슈머(sync=true, textline=true)가 들어오는 각 줄을 처리하다가 실패합니다 — 내부 오류가 발생하는 모든 라우트를 대신하는 것입니다. 이 라우트는 시뮬레이션된 내부 세부 정보(가짜 설정 경로 /etc/camel/secret.properties, 가짜 호스트, 마커 토큰)를 담은 메시지와 함께 IllegalStateException을 던집니다. 익스플로잇 드라이버는 일반 원격 TCP 피어입니다: 소켓을 열고 한 줄을 보낸 뒤, 컨슈머가 다시 기록하는 응답을 읽습니다.
java.lang.IllegalStateException: INTERNAL-DETAIL-MARKER-7F3A2B config=/etc/camel/secret.properties db=internal-db.prod.svc.java.lang.Exception: Exchange processing failed입니다 — 라우트 예외의 클래스, 메시지 또는 스택 트레이스가 없습니다 — 여전히 응답하므로 동기 피어가 타임아웃되지 않습니다.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: exception leaks over the socket; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85246-mina-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic reply; >>> Not exploited
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-mina (MinaConsumer.messageReceived) |
| CWE | CWE-209 (민감한 정보를 포함하는 오류 메시지 생성) |
| 심각도 | MEDIUM |
| 공격 벡터 | 원격 TCP/UDP 피어가 라우트 실패를 유발하고, 소켓을 통해 다시 전송되는 응답에서 예외를 읽음 |
| 영향 | 정보 노출: textline 코덱을 통한 예외 클래스/메시지, 또는 object 코덱을 통한 직렬화된 예외 + 원인 체인(내부 호스트 이름, 경로, 연결 세부 정보) |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24476 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85246.html
MinaConsumer는 muteException 컨슈머 옵션(기본값 true)을 추가합니다.
활성화되면 실패한 교환은 더 이상 exchange.getException()을 다시 쓰지 않고, 대신 빈 스택 트레이스를 가진
대체 Exception("Exchange processing failed")를 씁니다. 여전히 Exception이므로(object 코덱 피어도
여전히 하나를 수신함) 라우트 예외의 클래스, 메시지 또는 프레임을 담지 않습니다. 동기 피어가 타임아웃되지 않도록
응답은 여전히 작성됩니다. 이전 동작을 복원하려면 muteException=false로 설정하십시오.
응답 본문을 명시적으로 설정하는 onException 핸들러를 추가하여 프레임워크가 예외를 피어에게 다시 쓰지 않도록
하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 이를 해결하는지 검증할 수 있도록 돕기 위함입니다. 실패하는 라우트의 구성 경로, 호스트 및 마커 토큰은 무해한, 가상의 로컬 픽스처입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.