
CVE-2026-85296을 재현하는 실행 가능한 Spring Boot 및 Quarkus 개념 증명으로, camel-as2의 파트너 간 MDN 서명 키 혼동(CWE-488) 취약점을 다루며, 취약 빌드와 수정된 빌드를 포함합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 이 취약점은 요청별 서명 자료가 처리 중인 요청에 국한되지 않고 요청 간에 공유되는 상태에 보관되었던 문제입니다. 단일 ResponseMDN이 공유 HttpProcessor에 등록되어 모든 AS2 요청을 처리합니다. 동적 키 구성(경로당 하나의 거래 파트너, 각 파트너의 키를 HttpContext에서 요청별로 해석)에서 영향을 받은 빌드는 해석된 요청별 서명 키를 인스턴스 필드에 다시 기록했습니다. 따라서 하나 이상의 파트너를 처리하는 배포에서는 동시 또는 연속 요청이 서로의 자료를 관찰할 수 있었고, MDN(Message Disposition Notification)이 다른 거래 파트너의 키로 서명될 수 있었습니다. AS2 배포는 설계상 일반적으로 다중 파트너이므로, 이 조건은 평범한 동시 트래픽만으로도 도달됩니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-as2 4.22.0 (영향받음; 4.22.1에서 수정) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-as2 (Camel 4.22.0, 영향받음; 수정된 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다.
드라이버는 실제 ResponseMDN(AS2 응답 인터셉터)을 동적 키 형태로 사용합니다. 두 파트너의 서명 자료를 차례로 — 파트너 A, 그다음 파트너 B — ResponseMDN.process(...)를 통해 해석하고(각각 해당 파트너의 RSA 키를 HttpContext에 넣음), 각 호출 후 인스턴스의 signingPrivateKey 필드를 읽습니다.
final이며 절대 기록되지 않습니다. 요청별 키는 요청에 국한되므로 공유 인스턴스의 signingPrivateKey는 null로 유지됩니다.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: per-request key on the shared instance; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85296-as2-signing-key-confusion-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: field stays null; >>> 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): per-request key on the shared instance
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: field stays null
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-as2 (ResponseMDN 동적 키 처리) |
| CWE | CWE-488 (잘못된 세션에 데이터 요소 노출) |
| 심각도 | MEDIUM |
| 공격 벡터 | 하나의 ResponseMDN 인스턴스를 공유하는 다중 파트너 배포 환경에서 발생하는 일반적인 동시 AS2 트래픽 |
| 영향 | 다른 거래 파트너의 개인 키로 서명된 메시지 처리 알림(Message Disposition Notification); 파트너 간 서명 자료 재사용 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24429 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85296.html
Quarkus의 영향받는 모듈은 CQ 3.39.0 (Camel 4.22.0)을 기반으로 빌드됩니다. 이 PoC에서 다루는 요청별 동적 AS2 서명 키 메커니즘은 CQ 3.29.0 (Camel 4.15.0) 이후에 도입되었으므로, CQ 3.39.0은 Spring Boot 모듈과 동일한 Camel 4.22.0을 포함합니다.
ResponseMDN은 구성된 보안 필드를 final로 만들고, 요청별 동적 자료를
process() 내부의 로컬 변수로 해석하며, 이를 인스턴스 필드에 다시 기록하지 않습니다. 따라서 단일 공유 인스턴스가
더 이상 한 요청의 서명 키를 다른 요청으로 유출할 수 없습니다.
거래 파트너별로 별도의 Camel 컨텍스트를 실행하여 파트너 간에 서명 자료가 공유되지 않도록 하십시오.
이 저장소는 교육 및 방어 목적으로 게시되었습니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드로 문제가 해결되는지 검증할 수 있도록 돕기 위한 것입니다. RSA 키 쌍은 시연을 위해 프로세스 내에서 생성되며 아무런 효력이 없습니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.