
CVE-2026-80312에 대한 실행 가능한 개념 증명으로, Apache Camel camel-oauth의 fail-open OAuth 가드 문제를 다루며, 영향을 받는 버전과 수정된 버전의 Spring Boot 및 Quarkus 재현 예제를 포함합니다.
라우트를 보호하는 camel-oauth 프로세서가 인증을 완료할 수 없을 때 exchange를 중지하지 않았던 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 인증된 세션을 설정하지 못한 경우 라우팅을 종료하고 오류를 반환했어야 하는데, 프로세서는 응답 코드만 설정하고 제어를 라우트로 되돌려 보냈습니다. 그 결과 요청은 마치 인증에 성공한 것처럼 보호된 엔드포인트로 계속 진행되었습니다. 그 결과는 fail-open 인증 가드입니다. 인증되지 않은 호출자가 특별한 구성 없이 일반 요청 경로에서 라우트가 다음에 수행하는 작업에 도달하게 됩니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0 (영향받음; 4.22.1에서 수정됨), HTTP는 camel-undertow 사용 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-oauth 3.39.0 (Camel 4.22.0, 영향받음; 3.40.0 / Camel 4.22.1에서 수정됨), HTTP는 camel-quarkus-platform-http 사용 |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다. (Spring Boot 모듈은 HTTP 전송으로 camel-undertow를 사용합니다. 가드는 전송 방식에 독립적이며, camel-platform-http-starter 4.22.0은 3.5.x와 다른 Spring Boot 계열을 대상으로 빌드되었습니다.)
라우트는 OAuthBearerTokenProcessor로 보호되는 /protected를 노출합니다. 인증된 요청만이 뒤따르는 보호된 단계에 도달해야 합니다. 공격자는 Authorization 헤더 없이 GET /protected를 전송합니다.
exchange.setRouteStop(true) 없이 반환했으므로, 라우트는 보호된 단계로 그대로 진행되었습니다 → HTTP 200 및 보호된 본문.rejectUnauthorized(...)를 호출하여 401로 응답하고 라우트를 중지합니다 → 보호된 단계는 실행되지 않습니다.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
영향을 받은 빌드에서 예상되는 출력:
Sent: GET /protected (NO Authorization header)
Response status: 200
Response body : PROTECTED-DATA: reached the protected endpoint WITHOUT authenticating
>>> PROVEN: the OAuth guard failed open ...
수정된 빌드에서: Response status: 401, 본문 Authorization header, 보호된 단계는 실행되지 않음.
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-oauth (라우트 가드 프로세서, 예: OAuthBearerTokenProcessor) |
| CWE | CWE-287 (부적절한 인증) |
| 심각도 | HIGH |
| 공격 벡터 | 인증을 완료할 수 없는 OAuth 보호 라우트에 대한 일반 요청 (여기서는 Authorization 헤더 없음) |
| 영향 | 보호된 엔드포인트에 대한 미인증 접근 (인증 우회) |
| 영향받는 버전 | 4.11.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24411 |
| 크레딧 | Claude Security Scan Tool |
권고: https://camel.apache.org/security/CVE-2026-80312.html
가드 프로세서는 이제 인증을 완료할 수 없는 모든 경로에서 rejectUnauthorized(...) / reject(...)를 호출하며, 이는 HTTP 상태(401)를 설정하고 또한 exchange.setRouteStop(true)를 호출하여 프로세서가 인증하지 않은 요청에 대해 이후 단계가 실행되지 않도록 합니다. "자격 증명의 부재는 최소한 유효하지 않은 자격 증명만큼 강력하게 거부되어야 합니다."
가드 뒤에 명시적인 권한 부여 검사를 배치하거나, 업그레이드할 수 있을 때까지 CamelOAuthUserProfile exchange 속성이 없을 때 라우트가 종료되도록 하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다: Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.