
Apache Camel camel-knative 구조화된 CloudEvent 헤더 주입(CVE-2026-63621)을 위한 개념 증명(PoC) 재현 코드로, Spring Boot 및 Quarkus 런타임에서 악의적인 확장 필드를 통한 헤더 주입을 시연합니다.
동일한 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 런타임별로 하나씩 제공됩니다:
두 버전 모두 영향을 받는 버전입니다(이 문제는 4.14.9 / 4.18.4 / 4.22.0에서 수정됨). 두 재현기 모두 동일한 결함을 보여줍니다:
camel-knative 컨슈머는 CloudEvents를 두 가지 콘텐츠 모드로 수락합니다. 바이너리 모드에서는 속성이 HTTP 헤더로 도착하며
HeaderFilterStrategy를 통해 매핑되므로 Camel* 헤더는 삭제됩니다. 구조화 모드(Content-Type: application/cloudevents+json)에서는
이벤트 전체가 JSON 본문이며, 영향받는 빌드는 해당 JSON의 모든 확장 필드를 setHeader(key.toLowerCase(Locale.US), value)로 메시지 헤더에 매핑하고
HeaderFilterStrategy를 적용하지 않습니다. 확장 이름은 송신자가 선택하므로 공격자는 Camel 내부 제어 헤더를 설정할 수 있습니다.
여기서 주입된 확장 camelsqlquery는 CamelSqlQuery 헤더가 됩니다(Camel 헤더는 대소문자를 구분하지 않음) — camel-sql 프로듀서가 실행할 명령문입니다
(헤더 주입 → CWE-74).
Spring Boot 변형에 관한 참고 사항. knative HTTP 전송은 Vert.x 기반이며 camel-main / Camel Quarkus 배포에서 사용됩니다. Spring Boot 서블릿 애플리케이션은 해당 전송을 호스팅하지 않으므로, Spring Boot 재현기는 정확히 취약한 디코딩(
CloudEventProcessors.fromSpecVersion("1.0").consumer(...))을 직접 구동합니다 — 이는 인바운드application/cloudevents+json요청이 knative 컨슈머 내부에서 거치는 것과 동일한 코드 경로입니다. Camel Quarkus 변형은 전체 HTTP 기반 재현기입니다(실행 중인 소스로 CloudEvent를 POST).
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
영향받는 빌드에서의 예상 출력(두 변형 모두):
1) Benign structured CloudEvent (no extension):
CamelSqlQuery ... = [null]
2) Malicious structured CloudEvent (injected extension 'camelsqlquery'):
CamelSqlQuery ... = [SELECT * FROM secrets WHERE 1=1 -- injected-by-attacker]
>>> PROVEN: ... a camel-sql producer downstream would execute this attacker-supplied statement: true
보안 권고: https://camel.apache.org/security/CVE-2026-63621.html
구조화 모드 확장 매핑은 이제 각 필드를 설정하기 전에 HeaderFilterStrategy(
DefaultHeaderFilterStrategy)를 거치게 됩니다. 이는 바이너리 콘텐츠 모드 경로와 일치하므로,
신뢰할 수 없는 본문의 Camel* 확장 이름은 삭제됩니다:
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
이 저장소는 교육 및 방어 목적으로 게시됩니다: Apache Camel 사용자가 취약점을 이해하고, 자신이 영향을 받는지 확인하며, 업그레이드로 해결되는지 확인할 수 있도록 돕기 위한 것입니다. 주입된 값은 무해한 마커입니다(여기서는 절대 실행되지 않는 비활성 SQL 문자열). 이 자료를 귀하가 소유하거나 운영하지 않는 시스템에 사용하지 마십시오.
| Runtime | Directory | Stack | Style |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | 직접 디코딩(참고 참조) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (Camel 4.20.0 번들) | 전체 HTTP 기반 knative 소스 |
| Property | Value |
|---|
| 구성 요소 | camel-knative (Spring Boot: camel-knative; Quarkus: camel-quarkus-knative) |
| CWE | CWE-20 (잘못된 입력 검증) → CWE-74 (주입) |
| 공격 벡터 | 공격자가 선택한 확장 필드가 포함된 구조화 모드 CloudEvent(application/cloudevents+json) |
| 영향 | Exchange에 Camel 내부 제어 헤더 주입(여기서는 CamelSqlQuery) |
| 영향을 받는 버전 | 3.15.0 이상 4.14.9 미만, 4.15.0 이상 4.18.4 미만, 4.19.0 이상 4.22.0 미만 |
| 수정된 버전 | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24084 |
| 공로 | Andrea Cosentino (Apache Software Foundation) |