
Apache Camel camel-shiro의 스레드 바인딩된 subject 인증 우회를 재현하는 실행 가능한 Spring Boot 및 Quarkus 개념 증명으로, 취약 및 패치된 대조군을 포함합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 이 취약점은 Shiro Subject가 현재 스레드에 이미 바인딩되어 있고 그 principal이 들어오는 exchange의 principal과 동일할 때 Shiro 보안 프로세서가 자격 증명 검증을 건너뛰는 문제입니다. Camel exchange를 처리하는 스레드는 풀에서 가져와 여러 exchange에 걸쳐 재사용되므로, 이전의 인증된 exchange가 남긴 바인딩된 subject가 자체적으로 유효한 자격 증명을 제시하지 않은 이후 exchange의 검사도 통과시킬 수 있었습니다. 즉, 이후 exchange의 비밀번호는 검증되지 않았습니다. 공격자는 현재 활발히 사용 중인 principal을 지정한 요청을 보내기만 하면 됩니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-shiro 4.22.0 (영향받음; 수정 버전 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-shiro (Camel 4.15.0, 영향받음; 수정 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다.
라우트는 alwaysReauthenticate=false로 구성된 ShiroSecurityPolicy로 보호됩니다. 이는 문서화된 모드로, 인증된 subject가 exchange 사이에 (풀링되어 재사용되는) 워커 스레드에 의도적으로 바인딩된 채 유지됩니다. 익스플로잇 드라이버는 하나의 HTTP 워커 스레드 안에서 두 개의 exchange를 순서대로 실행합니다:
ringo가 올바른 비밀번호 starr로 보내는 정당한 요청 — 인증에 성공하고 Shiro subject를 이 스레드에 바인딩된 채로 남깁니다 (바쁜 서비스에서 이전 인증 요청이 그랬던 것처럼);ringo를 지정하지만 잘못된 비밀번호 not-starr를 사용하는 공격자 요청을 같은 스레드에서 보냅니다.AuthenticationException과 함께 거부됩니다.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wrong password reaches protected logic; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84181-shiro-auth-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wrong password rejected; >>> 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): wrong password reaches protected logic
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: wrong password rejected
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-shiro (ShiroSecurityProcessor.authenticateUser) |
| CWE | CWE-287 (부적절한 인증) |
| 심각도 | MEDIUM |
| 공격 벡터 | 재사용된 워커 스레드에 현재 바인딩된 principal을 지정하지만, 자체적으로 유효한 자격 증명을 지니지 않은 요청 |
| 영향 | 인증 우회: 인증되지 않은 요청이 이미 바인딩된 principal로 수락되며, 해당 비밀번호는 검증되지 않음 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24439 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-84181.html
ShiroSecurityProcessor.authenticateUser는 스레드에 바인딩된 subject가 이미 동일한 principal을 지니고 있을 때 로그인을 건너뛰지 않습니다. 이전 코드는 currentUser.isAuthenticated() && username.equals(currentUser.getPrincipal())에서 단락 평가되었는데, 사용자 이름이 일치한다고 해서 이번 exchange와 함께 제시된 비밀번호에 대해 아무것도 알려주지 않습니다. 이제 프로세서는 모든 exchange에서 currentUser.login(token)을 호출하므로, 제시된 자격 증명이 항상 검증됩니다. alwaysReauthenticate는 여전히 subject의 rememberMe 유효 기간을 제어하지만, 더 이상 비밀번호 검사 여부를 결정하지 않습니다.
업그레이드가 가능할 때까지, 모든 exchange가 끝날 때 Shiro subject가 스레드에서 정리되도록 하십시오(이후 exchange가 subject를 상속받을 수 없도록). 예를 들어 Shiro의 ThreadContext.unbindSubject()를 호출하는 onCompletion/프로세서를 사용하면 됩니다.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. 여기에 포함된 사용자, 비밀번호, 키는 동작하지 않는 로컬 픽스처입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.