
CVE-2026-78165에 대한 실행 가능한 개념 증명(PoC) 재현 도구로, Apache Camel camel-spring-redis에서 Redis PUBLISH 페이로드의 JDK 역직렬화가 필터링되지 않는 문제를 시연합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 이 취약점은 camel-spring-redis에서 serializer 옵션이 구성되지 않은 경우 java.io.ObjectInputFilter가 없는 순수한 JdkSerializationRedisSerializer를 생성하여 모든 읽기에 사용하던 문제입니다. RedisConsumer.setBody는 Exchange가 구성되기 전에 구독된 채널에 게시된 모든 메시지의 원시 바이트에 이를 적용했습니다. 따라서 구독된 채널에서 PUBLISH를 실행할 수 있는 공격자는 역직렬화 싱크에 직접 도달하여 임의의 직렬화된 객체 그래프의 readObject를 실행할 수 있었습니다(원격 코드 실행, CWE-502). 동일한 기본 직렬화기가 프로듀서 읽기 명령(GET/HGET/HGETALL/HVALS)과 SpringRedisIdempotentRepository도 지원했습니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-redis 4.22.0 (영향받음; 4.22.1에서 수정됨) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-spring-redis 3.29.0 (Camel 4.15.0, 영향받음) |
이 결함은 2.11.0에서 컴포넌트가 도입된 때로 거슬러 올라가므로, 모든 영향받는 릴리스와 최신 Camel Quarkus의 Camel 4.15.0이 취약합니다. 수정 사항은 Camel 4.18.5 / 4.22.1 / 4.23.0에 포함됩니다. Spring Boot 모듈은 영향받는 빌드(4.22.0)와 수정된 빌드(4.22.1)를 모두 실행합니다. 수정된 Camel을 번들로 제공하는 Camel Quarkus 릴리스는 아직 없습니다.
이 앱은 serializer 옵션 없이 cve-channel을 SUBSCRIBE하는 Camel 라우트를 실행합니다(따라서 기본 JdkSerializationRedisSerializer가 사용됨). 공격자는 해당 채널에 PUBLISH만 할 수 있는 일반 Redis 클라이언트이며, Camel 프로세스에 접근할 수 없습니다. 공격자는 의도적으로 무해한 com.example.PwnMarker의 원시 직렬화 바이트를 게시하는데, 이 객체의 readObject는 JVM 전역 플래그만 뒤집을 뿐입니다(가젯 없음, 명령 없음). 영향받는 빌드에서는 컨슈머가 이를 역직렬화하고 readObject가 실행됩니다. 수정된 빌드에서는 기본 허용 목록(표준 java./javax. 및 org.apache.camel. 타입)이 com.example.PwnMarker를 InvalidClassException: filter status: REJECTED와 함께 거부합니다.
cd camel-spring-boot
mvn clean package
docker compose up -d --build # starts Redis + the reproducer
curl -s http://localhost:8080/exploit/attack
docker compose down
영향을 받은 빌드에서 예상되는 출력:
Attacker connects to Redis redis:6379 and PUBLISHes a serialized com.example.PwnMarker to channel 'cve-channel'.
PUBLISH delivered to 1 subscriber(s).
Result:
>>> PROVEN: the Redis consumer deserialized the attacker-published, non-allow-listed class
>>> (com.example.PwnMarker) with no ObjectInputFilter — its readObject executed.
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-spring-redis (camel-spring-redis-starter / camel-quarkus-spring-redis) |
| CWE | CWE-502 (신뢰할 수 없는 데이터의 역직렬화) |
| 심각도 | HIGH |
| 공격 벡터 | Camel spring-redis 컨슈머가 구독하는 채널로의 PUBLISH (또는 프로듀서가 읽는 Redis 키 제어); 기본 직렬화기가 필터 없이 페이로드를 역직렬화함 |
| 영향 | 라우트 로직이 실행되기 전에 가젯 클래스를 통해 Camel 프로세스 내부에서 원격 코드 실행 |
| 영향받는 버전 | 2.11.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24421 |
| 크레딧 | Leon Zlobecki |
권고문: https://camel.apache.org/security/CVE-2026-78165.html
새로운 deserializationFilter 엔드포인트 옵션은 기본 직렬화기가 페이로드를 읽는 동안 적용되는 필터를 제어합니다. 설정하지 않으면 JVM 전역 jdk.serialFilter가 존재할 경우 이를 따르고, 그렇지 않으면 보수적인 허용 목록(표준 Java 및 Apache Camel 타입; java.net 거부)이 적용되며, 4.23.0/4.22.1에서는 JEP-290 그래프 형태 제한이 추가로 적용됩니다. 직렬화기는 그래프를 읽기 전에 스트림에 필터를 설정하는 역직렬화 컨버터와 함께 Converter 기반 생성자를 통해 구성됩니다. serializer를 사용자 정의 RedisSerializer로 설정하면 Camel이 더 이상 페이로드 읽기 방식을 제어하지 않으므로 여전히 필터를 우회합니다.
JVM 전역 -Djdk.serialFilter=...를 설정하거나(영향받는 경로가 이를 따름), serializer 엔드포인트 옵션을 StringRedisSerializer와 같은 비-Java 직렬화기로 설정하십시오(사용자 정의 redisTemplate에만 설정하는 것이 아니라 serializer 옵션으로). Redis에 인증을 요구하고 구독된 채널에 게시할 수 있는 주체를 제한하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다: Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. 페이로드는 코드를 실행하지 않는 무해한 마커입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.