
Replicatori proof-of-concept per l'iniezione di header CloudEvent strutturati in Apache Camel camel-knative (CVE-2026-63621), che dimostrano l'iniezione di header tramite campi di estensione dannosi nei runtime Spring Boot e Quarkus.
Reproducer proof-of-concept eseguibili per la stessa vulnerabilità di Apache Camel, uno per runtime:
| Runtime | Directory | Stack | Style |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | decodifica diretta (vedi nota) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (include Camel 4.20.0) | source knative completamente pilotata da HTTP |
Entrambe sono versioni affette (il problema è corretto in 4.14.9 / 4.18.4 / 4.22.0) e dimostrano lo stesso identico difetto: il consumer camel-knative accetta CloudEvents in due modalità di contenuto. In modalità binaria gli attributi arrivano come header HTTP e vengono mappati tramite una HeaderFilterStrategy, quindi gli header Camel* vengono scartati. In modalità strutturata (Content-Type: application/cloudevents+json) l'intero evento è un corpo JSON, e la build affetta mappa ogni campo di estensione di quel JSON sugli header del messaggio con setHeader(key.toLowerCase(Locale.US), value) e senza HeaderFilterStrategy. I nomi delle estensioni sono scelti dal mittente, quindi un attaccante può impostare un header di controllo interno a Camel. Qui l'estensione iniettata camelsqlquery diventa l'header CamelSqlQuery (gli header Camel non fanno distinzione tra maiuscole e minuscole) — l'istruzione che un producer camel-sql eseguirebbe (header injection → CWE-74).
Nota sulla variante Spring Boot. Il trasporto HTTP knative è basato su Vert.x ed è utilizzato nelle implementazioni camel-main / Camel Quarkus. Un'applicazione servlet Spring Boot non ospita quel trasporto, quindi il reproducer Spring Boot pilota direttamente la decodifica vulnerabile esatta (
CloudEventProcessors.fromSpecVersion("1.0").consumer(...)) — lo stesso percorso di codice che una richiesta in ingressoapplication/cloudevents+jsonpercorre all'interno del consumer knative. La variante Camel Quarkus è il reproducer completamente HTTP-driven (POST di un CloudEvent alla source attiva).
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
Output atteso su una build affetta (entrambe le varianti):
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
| Property | Value |
|---|---|
| Component | camel-knative (Spring Boot: camel-knative; Quarkus: camel-quarkus-knative) |
| CWE | CWE-20 (Improper Input Validation) → CWE-74 (Injection) |
| Attack vector | Un CloudEvent in modalità strutturata (application/cloudevents+json) con un campo di estensione scelto dall'attaccante |
| Impact | Iniezione di header di controllo interni di Camel sull'Exchange (qui CamelSqlQuery) |
| Affected Versions | Dalla versione 3.15.0 fino a prima della 4.14.9, dalla 4.15.0 fino a prima della 4.18.4, dalla 4.19.0 fino a prima della 4.22.0 |
| Fixed Versions | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24084 |
| Credit | Andrea Cosentino (Apache Software Foundation) |
La mappatura delle estensioni in modalità strutturata ora fa passare ogni campo attraverso una HeaderFilterStrategy (una DefaultHeaderFilterStrategy) prima di impostarlo, in linea con il percorso della modalità di contenuto binaria — quindi i nomi di estensione Camel* provenienti dal body non attendibile vengono scartati:
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
Questo repository è pubblicato a scopo educativo e difensivo: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono affetti e confermare che l'aggiornamento la risolva. Il valore iniettato è un marcatore benigno (una stringa SQL inerte che qui non viene mai eseguita). Non utilizzare questo materiale contro sistemi che non possiedi o che non gestisci.