
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) |
Advisory: https://camel.apache.org/security/CVE-2026-63621.html
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.