
CVE-2026-83531에 대한 실행 가능한 Spring Boot 개념 증명으로, Apache Camel의 dynamic-router-control 엔드포인트에서 발생하는 표현식 언어 주입을 시연하고 수정 사항을 검증합니다.
dynamic-router-control 엔드포인트가 구독 predicate와 이를 컴파일하는 데 사용되는 언어의 이름을 수신 메시지로부터 가져오는 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다(DynamicRouterControlMessage의 predicate / expressionLanguage 필드, 또는 CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage 헤더). 이후 서비스는 CamelContext에서 해당 언어를 확인하고 표현식을 Predicate로 컴파일했으며, 허용 목록도, 옵트인도 없었습니다. 컴파일된 predicate는 채널을 통해 라우팅되는 모든 exchange에 대해 평가되었습니다. 따라서 해당 라우트가 메시지를 제어 엔드포인트로 전달하는 전송 계층에 메시지를 보낼 수 있는 모든 행위자는 자신이 선택한 표현식을 제공할 수 있었고, 이는 Camel 프로세스의 권한으로 평가되었습니다. 클래스패스에 있는 모든 언어를 선택할 수 있었으며, 항상 존재하고 기본값이었던 simple도 포함됩니다.
Camel Spring Boot 전용.
camel-quarkus-dynamic-router확장은 존재하지 않으므로, 이 재현기는 Camel Quarkus에서 실행할 수 없습니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (영향받음; 4.22.1에서 수정됨) |
앱은 Dynamic Router 채널 test(direct:start → dynamic-router://test)를 설정합니다. 공격자는 공격자가 선택한 predicate 표현식과 언어를 담은 subscribe 제어 메시지를 전송합니다:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
그런 다음 하나의 메시지가 채널을 통해 라우팅되며, 이 채널이 구독 조건자를 평가한다. 영향받는 빌드에서는
표현식이 실행되어 detonator.detonate()를 호출한다. 이는 공격자가 도달할 수 있는 모든 인자 없는 레지스트리
메서드(그리고 Groovy와 같은 모든 언어는 임의 코드를 가능하게 함)를 대신하는 무해한 대체물이다. 수정된 빌드에서는
제어 엔드포인트가 메시지로부터 조건자/언어를 받아들이기를 거부한다.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
영향을 받은 빌드에서 예상되는 출력:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
수정된 빌드에서는 구독이 IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ...와 함께 거부됩니다.
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-dynamic-router (dynamic-router-control 엔드포인트) |
| CWE | CWE-94 (코드 주입), CWE-917 (표현식 언어 주입) |
| 심각도 | HIGH |
| 공격 벡터 | 라우트가 이를 dynamic-router-control 엔드포인트로 전달하는 전송 계층에서, 술어 표현식과 언어를 제공하는 제어 메시지(subscribe/update) |
| 영향 | Camel 프로세스의 권한으로 공격자가 선택한 표현식(모든 클래스패스 언어)을 평가 — 코드 실행 |
| 영향받는 버전 | 4.4.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24576 |
| 크레딧 | Leon Zlobecki |
권고문: https://camel.apache.org/security/CVE-2026-83531.html
술어 표현식과 그 언어는 더 이상 기본적으로 제어 메시지에서 가져오지 않습니다. 이를 제공하는 제어 메시지는
라우트 작성자가 dynamic-router-control 엔드포인트에서 allowPredicateFromMessage=true로 명시적으로
옵트인하지 않는 한 거부됩니다. 의도된 경로는 4.4.0 이전 릴리스에서처럼 엔드포인트 URI에서 predicate와
expressionLanguage를 (라우트 작성자가 제어하는 방식으로) 구성하는 것입니다.
외부에서 발생한 메시지를 dynamic-router-control 엔드포인트로 전달하지 마십시오. 구독은 라우트 작성자가
제어하는 엔드포인트에서만 관리하고, 제어 채널에 도달할 수 있는 전송 계층을 제한하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 이를 해결하는지 검증할 수 있도록 돕기 위해서입니다. 페이로드는 무해한 마커 빈입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.