
CVE-2026-85248에 대한 실행 가능한 Spring Boot 및 Quarkus 재현 프로그램으로, ML-DSA 서명 검증 우회를 일으키는 camel-pqc 동시 Signature 경쟁 조건을 다루며, 취약 빌드와 수정된 빌드를 포함합니다.
Signature 경쟁 조건 (서명 검증 우회)Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 프로그램으로, PQC 프로듀서가 단일
java.security.Signature 인스턴스를 보유하고 동기화 없이 모든 교환에 사용했던 문제를 다룹니다. Signature는 상태를 가지며
스레드 안전하지 않습니다: update()는 서명하거나 검증할 데이터를 누적하고, verify()/sign()은 그
누적된 상태를 소비합니다. 동시 교환이 하나의 인스턴스를 공유하면 서로 다른 메시지의 update와 verify 호출이
교차하게 되어, 검증이 다른 교환에 속한 데이터에 대해 완료되거나 부분적으로 누적된 버퍼에 대해 완료될 수 있습니다.
그 결과는 비결정적이며, 서명이 실제로 검증된 적 없는 메시지에 대해 검증 성공을 보고하는 경우를 포함하는데,
이는 이 컴포넌트가 제공하기 위해 존재하는 보장을 무력화합니다. 이에 도달하려면 동일한 엔드포인트를 통한
동시 트래픽만 필요합니다 — 부하 상태의 Camel 라우트에서 흔한 조건입니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0 (영향받음; 수정 버전 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc (Camel 4.22.0, 영향받음; 수정 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다.
라우트는 각 메시지를 포스트 양자 ML-DSA 키로 서명한 다음 방금 생성한 서명을 즉시 검증하므로,
모든 정당하게 서명된 메시지는 true로 검증되어야 합니다. 드라이버는 공유 pqc: 프로듀서를 통해
이러한 서명→검증 왕복 1024회를 동시에(16개 스레드) 실행합니다.
true를 반환하지 않습니다 — 일부는 false를 반환하고, 일부는
서명 엔진 오류를 발생시킵니다 — 동시 교환 간에 공유된 단일 상태 기반 Signature가 교차 실행으로 인해
손상되기 때문입니다. 판정이 더 이상 그것이 계산된 메시지에 대응하지 않습니다. (동일한 경쟁 조건이 위험한
방향으로 발생하면, verify()가 실제로 다루지 않은 데이터에 대해 성공할 수 있습니다.)Signature 인스턴스를 사용하므로 1024회의 왕복이 모두 검증됩니다.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: many of 1024 broken; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85248-pqc-signature-race-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 0 broken; >>> 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): many broken
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: 0 broken
이 경쟁 조건은 본질적으로 타이밍에 의존합니다. 재현기는 충분한 동시성(1024회 왕복)을 구동하므로 영향을 받는 빌드에서 안정적으로 나타납니다. 영향을 받는 실행에서 0개의 손상이 표시되면 다시 실행하십시오.
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-pqc (PQCProducer 서명/검증) |
| CWE | CWE-362 (부적절한 동기화를 사용한 공유 리소스의 동시 실행) |
| 심각도 | MEDIUM |
| 공격 벡터 | 하나의 상태 저장 java.security.Signature를 공유하는 동일한 pqc: 엔드포인트를 통한 동시 트래픽 |
| 영향 | 비결정적 서명 검증; 서명이 실제로 검사되지 않은 메시지에 대해 검증이 성공을 보고할 수 있음 |
| 영향받는 버전 | 4.12.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24445 |
| 크레딧 | Claude Security Scan Tool |
권고: https://camel.apache.org/security/CVE-2026-85248.html
PQCProducer는 더 이상 동시 교환 간에 Signature를 공유하지 않습니다. 프로듀서가 인스턴스를 직접 생성한 경우 이제 교환마다 새 인스턴스를 생성하며(signerForExchange()), 사용자가 (JVM 전역 public static final) 인스턴스를 구성한 경우 해당 인스턴스에 대한 접근이 synchronized됩니다. 어느 경우든 두 교환이 하나의 인스턴스에서 init/update/verify 시퀀스를 교차 실행하지 않습니다.
영향받는 라우트를 단일 동시 소비자로 제한하여 두 교환이 동시에 Signature 인스턴스를 사용하지 않도록 하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드로 문제가 해결되는지 확인할 수 있도록 돕기 위한 것입니다. 메시지와 키는 비활성 로컬 픽스처입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.