
CVE-2026-85245를 재현하는 실행 가능한 Spring Boot 개념 증명으로, camel-thrift 교차 거래소 데이터 노출 문제를 다루며, 취약 버전과 수정 버전의 비교 및 완화 방안을 포함합니다.
Thrift 데이터 포맷이 대상 타입의 공유 defaultInstance로 언마셜링되고(새 복사본이 아닌), 그 공유 객체를 교환 본문으로 반환하는 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 인스턴스가 프로세스 전역에서 공유되기 때문에, 한 메시지를 언마셜링하는 동안 기록된 상태가 객체에 남아 동일한 타입을 사용하는 이후의 모든 메시지에 노출되었습니다. 이후 페이로드에 없는 필드는 이전 메시지의 값을 유지했으므로, 한 발신자에 속한 콘텐츠가 다른 발신자의 메시지를 처리하는 동안 읽힐 수 있었고, 동시 교환들이 서로의 부분적으로 기록된 상태를 관찰할 수 있었습니다. 동일한 라우트를 통해 둘 이상의 테넌트나 사용자에게 서비스하는 배포 환경에서는 한 당사자의 데이터가 다른 당사자에게 노출되는 것입니다.
Spring Boot 전용.
camel-quarkus-thrift확장은 존재하지 않으므로, 이 재현기는 단일 Camel Spring Boot 모듈로 제공됩니다. (결함은 런타임에 독립적인 컴포넌트의ThriftDataFormat에 있습니다.)
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (영향받음; 4.22.1에서 수정됨) |
라우트는 하나의 ThriftDataFormat(생성된 Thrift 타입 Work 기반)을 정의하고 일반적인 라우트처럼 모든 메시지에 재사용합니다. 두 테넌트가 이를 통해 메시지를 보냅니다:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — 선택적 comment 필드에 민감한 데이터가 담겨 있습니다;Work{num1=3, op=SUBTRACT} — comment 필드가 없습니다.라우트는 테넌트 A의 메시지를 언마셜링한 다음 테넌트 B의 메시지를 언마셜링합니다.
comment**를 담은 채로 반환됩니다 — Thrift는 수신 바이트에 존재하는 필드만 할당하며, 두 메시지 모두 동일한 공유 인스턴스로 역직렬화되어 (그리고 그 인스턴스로 반환되어) B의 누락된 필드가 A의 값을 유지했기 때문입니다. 두 본문은 문자 그대로 동일한 객체입니다.comment는 null입니다 — 각 교환은 자체적으로 초기화된 복사본을 받습니다.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (잘못된 세션에 데이터 요소 노출) |
| 심각도 | MEDIUM |
| 공격 벡터 | 하나의 라우트를 통해 동일한 Thrift 유형의 메시지 두 개를 전송하며, 이후 메시지가 필드를 생략하면 이전 메시지의 값을 상속받음 |
| 영향 | 교환 간 / 테넌트 간 데이터 노출, 동시 교환이 서로의 부분적으로 기록된 상태를 관찰할 수 있음 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24442 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85245.html
생성된 Thrift 유형(Work, Operation)은 Apache Camel 자체의 camel-thrift 테스트에서 가져온 공개 테스트 픽스처입니다.
ThriftDataFormat.unmarshal은 이제 교환별 복사본으로 역직렬화합니다:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — 그런 다음 바이트를 instance로 역직렬화하여
반환합니다. 각 교환은 자체적으로 초기화된 객체를 받으므로 메시지 간에 필드가 이월되지 않고 두 교환이 본문을 공유하지 않습니다.
데이터 포맷이 실행된 직후 역직렬화된 본문을 새 인스턴스로 복사하고, 반환된 객체에 대한 참조를 유지하지 마십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다: Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. "secret"은 비활성의, 조작된 마커 문자열입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.