
CVE-2026-85247에 대한 실행 가능한 Spring Boot 및 Quarkus 재현 프로그램으로, camel-knative TLS trust-all 폴백을 시연하고 수정 사항을 검증합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 프로그램으로, 트러스트스토어를 구성하지 않은 채 Knative HTTP 클라이언트에서 SSL을 활성화하면 JVM의 기본 신뢰 앵커 대신 제시된 모든 인증서를 신뢰하는 것으로 폴백되는 문제입니다. 따라서 트러스트스토어를 함께 구성하지 않고 TLS만 켠 배포는 피어 인증 없이 암호화된 연결을 얻게 되며, 네트워크 경로에 위치한 공격자가 이를 종료하고 내용을 읽을 수 있습니다. 이 위험한 상태는 명시적 옵트인이 아니라 누락에 의해 도달됩니다. 즉, TLS를 켜는 것이 인증서 검증을 끄는 원인이 되어서는 안 됩니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.22.0 (영향받음; 4.22.1에서 수정) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-knative (Camel 4.15.0, 영향받음; 수정된 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다.
배포는 camel.knative.client.ssl.enabled=true를 설정하고 트러스트스토어를 구성하지 않습니다. 드라이버는 바로 그 설정들로 실제 KnativeSslClientOptions를 구성하며 — Knative HTTP 프로듀서가 사용하는 것과 동일한 옵션입니다 — TLS 중간자 공격을 대신하는, 자체 서명 인증서(CN=localhost, 어떤 트러스트스토어에도 없음)를 제시하는 번들 서버로 이 옵션들을 사용해 HTTPS 요청을 보냅니다.
KnativeSslClientOptions.getTrustOptions()가 TrustAllOptions이므로 클라이언트가 자체 서명 인증서를 수락하고 요청이 성공합니다 — 암호화되었지만 인증되지 않음.SunCertPathBuilderException: unable to find valid certification path와 함께 실패합니다.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: trusts the self-signed cert; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85247-knative-cert-validation-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: handshake fails; >>> 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.15.0): trusts the self-signed cert
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: handshake fails
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-knative (KnativeSslClientOptions.configureOptions) |
| CWE | CWE-295 (부적절한 인증서 검증) |
| 심각도 | MEDIUM |
| 공격 벡터 | SSL을 활성화했지만 트러스트스토어를 구성하지 않은 Knative HTTP 클라이언트에 대한 네트워크 중간자 공격 |
| 영향 | 피어 인증 없는 암호화 연결: 모든 인증서를 신뢰하므로 TLS를 가로채어 읽을 수 있음 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24443 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85247.html
번들로 제공되는 server-keystore.p12는 이 재현기(reproducer)를 위해서만 생성된 일회용 자체 서명 키 쌍(CN=localhost)입니다.
KnativeSslClientOptions.configureOptions: SSL이 활성화된 상태에서 키스토어, 트러스트스토어 또는 trust-cert 경로가 없으면, 이제 트러스트 옵션이 설정되지 않은 채로 남겨지므로, Vert.x가 JVM 기본 트러스트 앵커로 폴백합니다. 이는 SSLContextParameters와 Camel의 나머지 부분이 사용하는 것과 동일한 폴백입니다. 이제 TrustAllOptions는 camel.knative.client.ssl.trust.all=true를 명시적으로 설정해야만 도달할 수 있습니다(자체 서명 인증서가 있는 클러스터를 대상으로 한 개발 시에는 여전히 사용 가능). 업그레이드 후, 암묵적인 trust-all 동작에 의존하던 배포는 트러스트스토어를 구성하거나 trust.all을 의도적으로 설정해야 합니다.
Knative HTTP 클라이언트에서 SSL이 활성화된 모든 곳에 트러스트스토어를 명시적으로 구성하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하고, 업그레이드로 문제가 해결되는지 확인할 수 있도록 돕기 위함입니다. 자체 서명 키스토어는 로컬에서만 쓰이는 비활성 픽스처입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.