
CVE-2026-84180에 대한 실행 가능한 Spring Boot 및 Quarkus 재현 프로그램으로, camel-knative HTTP 컨슈머 예외 누출을 시연하고 muteException 수정 사항을 검증합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 도구로, Knative HTTP 컨슈머가 컨슈머 측에서
익스체인지가 실패했을 때 발생한 예외를 HTTP 응답 본문으로 원격 호출자에게 다시 기록한 문제입니다.
여기에는 예외의 클래스 이름, 메시지, 전체 스택 트레이스가 포함됩니다. 따라서 외부 발신자는 실패를 유발하고
배포에 대한 내부 세부 정보를 읽을 수 있었습니다. 즉, 클래스 및 패키지 이름, 예외 메시지에 담긴 파일 시스템 또는
호스트 이름, 라우트의 구조, 그리고 예외 메시지에 연결 문자열이나 구성이 포함된 경우에는 해당 데이터까지 직접
읽을 수 있었습니다. camel-knative는 CAMEL-23651에 의해 다른 HTTP 컨슈머들에 대해 확립된 muteException
동작과 정렬되지 않은 마지막 HTTP 계열 컨슈머였습니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.22.0 (영향받음, 4.22.1에서 수정됨), Camel의 Vert.x platform-http 서버 상의 컨슈머 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-knative (Camel 4.15.0, 영향받음, 수정된 대조군 CQ 3.40.0 / Camel 4.22.1), Quarkus HTTP 상의 컨슈머 |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다.
Knative HTTP 소스(컨슈머) 라우트가 CloudEvent를 수신한 뒤 처리 중에 실패합니다. 이는 내부 오류(실패한
데이터소스 조회, 다운스트림 타임아웃, 버그)를 겪는 모든 라우트를 대신합니다. 이 라우트는 시뮬레이션된 내부
세부 정보를 메시지에 담은 IllegalStateException을 던집니다. 여기에는 가짜 내부 호스트 이름
(internal-db.prod.svc.cluster.local), 가짜 JDBC URL, 마커 토큰 INTERNAL-DETAIL-MARKER-7F3A2B가 포함됩니다.
공격자는 단순히 원격 호출자로서, 잘 구성된 CloudEvent 하나를 컨슈머에 POST하고 컨슈머가 돌려보내는 응답을
읽습니다.
at com.example... / 프레임워크 스택 프레임이 포함됩니다.muteException(기본값 true)을
준수하므로, 오류 상태는 반환되지만 예외 세부 정보는 호출자에게 전달되지 않습니다.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: stack trace leaks; prints >>> PROVEN
docker compose down
# Patched control: rebuild with the fixed version, then run on the host
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84180-knative-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: empty body; prints >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): stack trace leaks; >>> PROVEN
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: empty body; >>> Not exploited
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-knative (Knative HTTP 컨슈머, KnativeHttpConsumer.computeResponseBody) |
| CWE | CWE-209 (민감한 정보를 포함하는 오류 메시지 생성) |
| 심각도 | MEDIUM |
| 공격 벡터 | 원격 호출자가 컨슈머 측에서 라우트 실패를 유발하고 응답 본문에서 예외 세부 정보를 읽음 |
| 영향 | 정보 노출: 예외 클래스/메시지/스택 트레이스(내부 호스트 이름, 패키지 이름, 라우트 구조, 내장된 연결 문자열)가 외부 발신자에게 전달됨 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24428 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-84180.html
KnativeHttpConsumer.computeResponseBody는 이제 새로운
muteException 옵션(컨슈머, 기본값 true)을 확인합니다. 음소거된 경우, 실패한 교환은 스택 트레이스 대신
빈 응답 본문(new byte[0])을 생성합니다. 빈 본문은 오류 상태가 유지되도록 의도적으로 사용됩니다
(null 본문은 호출자가 204 No Content를 전송하게 만들기 때문입니다). 이전 출력을 복원하려면
muteException=false로 설정하십시오. 이는 camel-knative를 다른 HTTP 계열 컨슈머들과 일치시킵니다(CAMEL-23651).
컨슈머 라우트에 onException 핸들러를 추가하여 응답 본문을 명시적으로 설정하십시오(예: 빈 본문 또는
일반 메시지로). 그러면 프레임워크가 예외를 호출자에게 다시 기록하지 않습니다.
이 저장소는 교육 및 방어 목적으로 게시됩니다: Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 이를 해결하는지 검증할 수 있도록 돕기 위해서입니다. 실패하는 라우트의 "내부" 호스트 이름, JDBC URL 및 마커 토큰은 무해한, 가상의 로컬 픽스처입니다 — 실제 비밀 정보는 포함되지 않습니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.