
Apache Camel JWT 인증 우회(CVE-2026-66908)를 재현하는 개념 증명(PoC) 리프로듀서로, camel-platform-http-main에서 누락된 iss/aud 검증을 시연하며 Docker 기반 설정 및 검증 단계를 포함합니다.
iss/aud 검증 누락Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. camel-main 임베디드 HTTP 서버는 jwtIssuer도 jwtAudience도 구성되지 않은 경우 키스토어만으로 JWT 인증기를 구축하므로, 수신 토큰은 서명과 만료 여부만 검사됩니다 — iss 및 aud 클레임은 전혀 검증되지 않습니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Main(독립 실행형) | camel-main/ | camel-main 4.21.0 + camel-platform-http-main |
왜 camel-main이지 Camel Spring Boot / Camel Quarkus가 아닌가? 취약한 클래스인
JWTAuthenticationConfigurer는camel-platform-http-main, 즉 camel-main 임베디드 HTTP 서버(MainHttpServer)에 있으며, 이는 독립 실행형 camel-main 애플리케이션과camel-jbang에서 사용됩니다. 이 서버는 Camel Spring Boot platform-http 통합(서블릿 기반)도 아니고 Camel Quarkus 통합(자체 보안을 가진 Quarkus/Vert.x HTTP)도 아니므로, 이 특정 결함에 대한 신뢰할 수 있는 Spring Boot 또는 Quarkus 재현기는 없습니다. 따라서 이 저장소는 이 버그의 정확한 호스트인 독립 실행형 camel-main 재현기를 제공합니다.
cd camel-main
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit
docker compose down
영향을 받는 빌드에서의 예상 출력:
[1] GET /protected with NO token -> HTTP 401 (auth is enforced)
[2] GET /protected with token iss=https://attacker.example aud=some-unrelated-service -> HTTP 200 (ACCEPTED — iss/aud NOT validated)
[3] GET /protected with the same token but EXPIRED -> HTTP 401 (expiry IS checked)
>>> PROVEN: ... the iss and aud claims were never checked ... : true
보안 권고: https://camel.apache.org/security/CVE-2026-66908.html
4.22.0부터 JWT 키스토어가 구성되어 있는데 jwtIssuer도 jwtAudience도 설정되지 않은 경우, 서버는 누락된 속성을 명시하며 시작을 거부합니다. 실제로 서명 및 만료 확인만 수행하는 검증을 원하는 운영자는 camel.server.jwtAllowMissingIssuerAndAudience=true로 명시적으로 옵트인해야 합니다(기본값은 fail-closed).
// fixed (JWTAuthenticationConfigurer.assertIssuerOrAudienceConfigured)
if (ObjectHelper.isEmpty(audience) && ObjectHelper.isEmpty(issuer)) {
throw new IllegalArgumentException(
"JWT authentication requires camel.server.jwtIssuer or camel.server.jwtAudience to be configured, ...");
}
이 저장소는 교육 및 방어 목적으로 공개되었습니다: Apache Camel 사용자가 취약점을 이해하고, 자신이 영향을 받는지 확인하며, 업그레이드를 통해 해결되는지 확인하도록 돕기 위한 것입니다. 토큰은 프로젝트에 번들로 포함된 일회용 데모 키스토어로 로컬에서 생성됩니다. 이 자료를 소유하거나 운영하지 않는 시스템에 사용하지 마십시오.
| 속성 | 값 |
|---|
| 구성 요소 | camel-platform-http-main(camel-main 임베디드 HTTP 서버) |
| CWE | CWE-287(부적절한 인증) / CWE-1259(보안 클레임 검증 누락) |
| 공격 경로 | 신뢰된 키(예: 공유 JWKS)로 서명되었지만 다른 발급자/대상(audience)으로 발급된 JWT |
| 영향 | 서명 키를 공유하는 모든 당사자가 발급한 만료되지 않은 토큰이 수락됩니다 — 운영자가 생각하는 것보다 배포 환경이 덜 엄격한 보안을 적용합니다 |
| 영향을 받는 버전 | 4.8.0부터 4.22.0 이전까지 |
| 수정된 버전 | 4.22.0 |
| JIRA | CAMEL-24281 |
| 공로 | n0mi1k |