
CVE-2026-85316에 대한 실행 가능한 개념 증명 재현기로, Apache Camel camel-platform-http 경로 접두사 매칭에서 의도치 않은 프록시 모드를 고정 버전 대조군과 함께 시연합니다.
camel-platform-http가 엔드포인트의 프록시 모드 실행 여부를 결정할 때, 구성된 경로가 문자열 proxy와 정확히 일치하는지가 아니라 proxy로 시작하는지를 검사했던 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 도구입니다. 프록시 모드는 엔드포인트를 catch-all(getPath()가 /가 됨)로 전환하며, 포워딩 대상은 요청 자체의 Host 헤더에서 가져옵니다. 따라서 경로가 단지 해당 문자들로 시작하기만 하는 엔드포인트 — proxyStats, proxy-health, proxying, … — 는 라우트 작성자가 의도하지 않았던 포워딩 프록시로 조용히 변모했습니다. 이는 요청 위조 원시 요소이자 포워딩 경로가 도달할 수 있는 모든 것의 노출입니다(CWE-1220).
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-platform-http 4.22.0 (영향받음; 4.22.1에서 수정) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-platform-http (Camel 4.22.0, 영향받음; 수정 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 실제 PlatformHttpEndpoint를 대상으로 영향받는 동작 및 수정된 동작을 시연합니다.
드라이버는 수정 사항 자체의 회귀 테스트(PlatformHttpEndpointProxyPathTest)를 그대로 반영합니다. 이름이 우연히 proxy로 시작하는 통계 엔드포인트인 platform-http:proxyStats 엔드포인트를 생성하고, 해당 엔드포인트가 프록시인지 컴포넌트에 질의합니다:
isHttpProxy()가 true를 반환하고 getPath()가 catch-all /로 축소됩니다 — 엔드포인트가 포워딩 프록시로 전환된 것입니다.isHttpProxy()가 false를 반환하고 getPath()는 proxyStats입니다 — 정확히 proxy 경로만이 프록시 모드를 선택합니다.문서화된 platform-http:proxy 엔드포인트는 두 버전 모두에서 프록시로 유지되며(대조를 위해 표시), 이는 수정 사항이 의도치 않은 분류만 제거함을 확인해 줍니다.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: proxyStats isHttpProxy=true, path "/"; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85316-platform-http-proxy-prefix-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: isHttpProxy=false, path "proxyStats"; >>> 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.22.0): proxyStats isHttpProxy=true, path "/"
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: isHttpProxy=false, path "proxyStats"
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-platform-http (PlatformHttpEndpoint.isHttpProxy) |
| CWE | CWE-1220 (불충분한 접근 제어 세분성) |
| 심각도 | MEDIUM |
| 공격 벡터 | 경로가 proxy로 시작하는(그러나 프록시로 사용할 의도가 없는) platform-http 엔드포인트를 라우트가 선언하면, 호출자의 Host 헤더로 전달하는 포괄적(catch-all) 포워딩이 되어버림 |
| 영향 | 의도하지 않은 프록시/요청 위조 및 포워딩 경로가 도달할 수 있는 모든 대상의 노출 |
| 영향받는 버전 | 4.0.0 이상 4.18.5 미만, 4.19.0 이상 4.22.1 미만 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24455 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85316.html
영향받는 Quarkus 모듈은 CQ 3.39.0 (Camel 4.22.0) 기반으로 빌드되었습니다. 패치된 제어는 CQ 3.40.0 (Camel 4.22.1)입니다. 이 시연은 엔드포인트를 생성하고 검사(
isHttpProxy()/getPath())할 뿐이므로 HTTP 서버는 시작되지 않습니다. Spring Boot 모듈은 스타터가 아닌 일반camel-platform-http구성 요소를 사용합니다.
PlatformHttpEndpoint.isHttpProxy()는 이제 startsWith를 사용하는 대신
경로가 proxy와 동일한지 비교(PROXY_PATH.equals(this.path))하므로, 문서화된 platform-http:proxy
엔드포인트만 프록시 모드로 실행됩니다.
proxy로 시작하지만 프록시로 사용할 의도가 없는 엔드포인트 경로의 이름을 변경하십시오.
이 저장소는 교육 및 방어 목적으로 게시되었습니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드로 문제가 해결되는지 검증할 수 있도록 돕기 위함입니다. 이 시연은 프로세스 내에서 엔드포인트 분류만 검사하며 어떤 트래픽도 전달하지 않습니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.