
Spring Boot와 Quarkus에서 영향을 받는 동작과 패치된 동작을 보여주는 Apache Camel camel-keycloak 발급자 검증 우회(CWE-287)에 대한 실행 가능한 개념 증명 재현기입니다.
camel-keycloak의 KeycloakSecurityProcessor가 인트로스펙션 응답에 실제로 iss 클레임이 포함된 경우에만
인트로스펙션된 토큰의 발급자를 검증했던 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 프로그램입니다.
클레임이 없을 때 검사는 실패로 처리되지 않고 건너뛰어졌으므로, 인트로스펙션 엔드포인트가 발급자를 명시하지 않은 채
active로 응답하기만 하면 설정된 발급자가 발급하지 않은 토큰도 수락될 수 있었습니다. 배포 환경이 iss를 생략하는
엔드포인트에 대해 인트로스펙션을 수행하면서 둘 이상의 발급자를 서비스하는 경우, 그 결과로 거부했어야 할 호출자를
인증하게 됩니다(CWE-287).
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-keycloak 4.22.0 (영향받음; 4.22.1에서 수정) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-keycloak (Camel 4.22.0, 영향받음; 수정된 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 실제 KeycloakSecurityProcessor를 대상으로 영향받는 동작 및 수정된 동작을 보여줍니다.
드라이버는 validateIssuer=true(예상 발급자 http://localhost:8080/realms/test-realm)로 KeycloakSecurityPolicy를
구성하고, 토큰을 active로 보고하지만 iss 클레임은 반환하지 않는 토큰 인트로스펙터를 설정합니다. 이는
RFC 7662에서 iss를 선택 사항으로 규정하므로 브로커/게이트웨이 인트로스펙션 엔드포인트가 생성하는 것과 정확히
같습니다. 그런 다음 Authorization: Bearer <attacker-token> 헤더로 KeycloakSecurityProcessor를 구동하고 보호된
라우트에 도달하는지 여부를 보고합니다.
iss가 없으면 프로세서가 발급자 검사를 건너뛰므로 토큰이 수락되고 라우트에 도달합니다.
즉, 의도하지 않은 발급자의 토큰이 인증됩니다.iss가 없으면 검증 실패입니다. 프로세서가 CamelAuthorizationException
("Token issuer missing…")을 발생시키고 라우트에는 절대 도달하지 않습니다.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: route reached, token accepted; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85301-keycloak-issuer-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"; >>> 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): route reached, token accepted
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: CamelAuthorizationException "Token issuer missing"
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-keycloak (KeycloakSecurityProcessor.validateIssuerFromIntrospection) |
| CWE | CWE-287 (부적절한 인증) |
| 심각도 | MEDIUM |
| 공격 벡터 | validateIssuer=true인 상태에서, iss를 생략하고 둘 이상의 발급자를 처리하는 엔드포인트에 대해 인트로스펙션된 의도하지 않은 발급자의 토큰 |
| 영향 | 구성된 발급자가 발급하지 않은 토큰을 가진 호출자를 배포 환경이 인증함 |
| 영향받는 버전 | 4.15.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24448 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85301.html
Quarkus의 영향받는 모듈은 CQ 3.39.0(Camel 4.22.0)을 기반으로 빌드되며, 여기서
camel-quarkus-keycloak은 영향받는 Camel 버전에 대응합니다. 패치된 컨트롤은 CQ 3.40.0(Camel 4.22.1)입니다.
KeycloakSecurityProcessor는 이제 iss 클레임이 없는 경우를
검증 실패로 처리합니다. 발급자 검증이 활성화되어 있고 인트로스펙션 결과에 발급자가 없으면, 조기 반환하여 요청을
통과시키는 대신 CamelAuthorizationException을 발생시킵니다. 이전 코드는 클레임이 누락될 때마다 비교를
건너뛰었으며, 이로 인해 발급자를 명시하지 않은 바로 그 토큰들에 대해 발급자가 검증되지 않은 채로 남았습니다.
인트로스펙션 엔드포인트가 iss 클레임을 반환하고 정확히 하나의 발급자만 처리하도록 하십시오. 그러면 다른
발급자의 토큰은 명시되어 거부되거나, 활성 상태로 인트로스펙션되지 않습니다.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. 토큰 인트로스펙터는 인프로세스 스텁이며 실제 Keycloak 서버나 네트워크 호출은 관여하지 않습니다. "공격자 토큰"은 불투명한 자리표시자 문자열입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.