
CVE-2026-85257에 대한 실행 가능한 Spring Boot 및 Quarkus 재현 프로그램으로, camel-cxf SOAP fault 정보 노출을 시연하고 muteException 수정 사항을 검증합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 도구입니다. CXF SOAP 컨슈머 뒤의 라우트가 서비스 계약에 선언되지 않은 예외로 실패했을 때, 해당 예외가 fault를 통해 SOAP 클라이언트에게 그대로 설명되었습니다. CXF는 메시지를 SOAP faultstring에 복사하며(설정에 따라 스택 트레이스를 fault detail에 배치할 수도 있습니다). 따라서 실패를 유발할 수 있는 외부 호출자는 배포 환경에 대한 내부 정보 — 클래스 및 패키지 이름, 그리고 예외 메시지가 담고 있는 모든 내용 — 를 읽을 수 있었습니다. 선언된 fault(@WebFault로 어노테이션된)는 별개의 문제입니다. 이들은 클라이언트가 대응하여 작성되는 공개된 계약의 일부이므로 여전히 전체가 보고됩니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-cxf-soap 4.22.0 (영향받음; 4.22.1에서 수정됨), Tomcat 상의 CXFServlet |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-cxf-soap (Camel 4.15.0, 영향받음; 수정된 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다.
CXF SOAP 컨슈머가 라우트를 뒷받침하며, 해당 라우트의 프로세서는 시뮬레이션된 내부 정보(마커 토큰과 가짜 내부 JDBC URL)를 담은 선언되지 않은 IllegalStateException을 발생시킵니다. 드라이버는 SOAP 클라이언트 역할을 하여 서비스를 호출하고 반환된 SOAP fault를 읽습니다.
Exchange processing failed — 라우트 예외의 클래스, 메시지 또는 스택 트레이스를 담고 있지 않습니다(새로운 muteException 컨슈머 옵션은 기본값이 true입니다). 계약이 선언한 fault(@WebFault)는 여전히 전체가 반환됩니다.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: fault leaks internal detail; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85257-cxf-fault-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault; >>> 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): fault leaks internal detail
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: generic fault
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-cxf (CxfConsumer, SOAP fault 생성) |
| CWE | CWE-209 (민감한 정보를 포함하는 오류 메시지 생성) |
| 심각도 | MEDIUM |
| 공격 벡터 | SOAP 호출자가 선언되지 않은 라우트 실패를 유발하고 fault에서 예외 세부 정보를 읽음 |
| 영향 | 정보 노출: 예외 클래스/메시지(내부 호스트 이름, 연결 문자열, 라우트 구조)가 외부 SOAP 호출자에게 전달됨 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24477 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85257.html
Spring Boot 모듈은 CXFServlet을 내장 Tomcat에 마운트합니다(독립 실행형 CXF Jetty 전송은 Spring Boot가 관리하는 Jetty 버전과 충돌함). 따라서 SOAP 엔드포인트는 포트 8080의
/services/hello에서 제공됩니다.
CxfConsumer는 muteException 컨슈머 옵션(기본값 true)을 추가합니다.
선언되지 않은 라우트 실패의 경우 이제 라우트의 예외 대신 빈 스택 트레이스를 가진 대체
Exception("Exchange processing failed")로부터 fault를 생성합니다. 따라서 클래스 이름, 메시지 또는 스택 트레이스가
호출자에게 전달되지 않습니다. 계약이 선언한 예외(@WebFault)는 감지되어 전체 내용이 보고되는데, 이를 억제하면
서비스가 중단되기 때문입니다. 이전 출력을 복원하려면 muteException=false로 설정하십시오.
서비스가 보고하도록 허용된 예외를 선언하고, onException 핸들러에서 다른 모든 실패를 그중 하나로 매핑하여
선언되지 않은 예외가 fault에 도달하지 않도록 하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드로 문제가 해결되는지 검증할 수 있도록 돕기 위함입니다. 실패하는 라우트의 마커 토큰과 JDBC URL은 무해한, 가상의 로컬 픽스처입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.