
Riproduttore proof-of-concept eseguibile per CVE-2026-85316, che dimostra la modalità proxy non intenzionale nella corrispondenza del prefisso di percorso di Apache Camel camel-platform-http, con controlli sulle versioni corrette.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui camel-platform-http decideva se un
endpoint fosse eseguito in modalità proxy verificando se il percorso configurato iniziava con la stringa proxy, anziché
corrispondervi esattamente. La modalità proxy trasforma un endpoint in un catch-all (getPath() diventa /) il cui target di inoltro
è ricavato dall'header Host della richiesta stessa. Pertanto qualsiasi endpoint il cui percorso inizia semplicemente con quei caratteri —
proxyStats, proxy-health, proxying, … — diventava silenziosamente un proxy di inoltro che l'autore della route non aveva mai richiesto: una
primitiva di request forgery e un'esposizione di tutto ciò che il percorso di inoltro può raggiungere (CWE-1220).
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-platform-http 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-platform-http (Camel 4.22.0, affetto; controllo corretto CQ 3.40.0 / Camel 4.22.1) |
Entrambi i moduli dimostrano il comportamento affetto e quello corretto nei confronti del reale PlatformHttpEndpoint.
Il driver rispecchia il test di regressione della correzione stessa (PlatformHttpEndpointProxyPathTest). Crea un
endpoint platform-http:proxyStats — un endpoint di statistiche il cui nome inizia per caso con proxy — e chiede
al componente se si tratta di un proxy:
isHttpProxy() restituisce true e getPath() collassa nel catch-all / — l'endpoint è stato
trasformato in un proxy di inoltro.isHttpProxy() restituisce false e getPath() è proxyStats — solo il percorso esatto proxy seleziona
la modalità proxy.L'endpoint documentato platform-http:proxy rimane un proxy in entrambe le versioni (mostrato per contrasto), confermando che la
correzione rimuove solo la classificazione non intenzionale.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: proxyStats isHttpProxy=true, path "/"; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85316-platform-http-proxy-prefix-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: isHttpProxy=false, path "proxyStats"; >>> 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): proxyStats isHttpProxy=true, path "/"
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: isHttpProxy=false, path "proxyStats"
| Proprietà | Valore |
|---|---|
| Componente | camel-platform-http (PlatformHttpEndpoint.isHttpProxy) |
| CWE | CWE-1220 (Granularità insufficiente del controllo degli accessi) |
| Gravità | MEDIA |
| Vettore di attacco | Una route dichiara un endpoint platform-http il cui percorso inizia con proxy (ma non è destinato a fare da proxy); diventa un catch-all che inoltra all'header Host del chiamante |
| Impatto | Proxy/request-forgery non intenzionale ed esposizione di tutto ciò che il percorso di inoltro può raggiungere |
| Versioni interessate | Dalla 4.0.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.1 |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24455 |
| Credito | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85316.html
Il modulo Quarkus interessato è basato su CQ 3.39.0 (Camel 4.22.0). Il controllo corretto è in CQ 3.40.0 (Camel 4.22.1). La dimostrazione crea e ispeziona soltanto un endpoint (
isHttpProxy()/getPath()), quindi non viene avviato alcun server HTTP; il modulo Spring Boot utilizza il componentecamel-platform-httpsemplice anziché lo starter.
PlatformHttpEndpoint.isHttpProxy() ora confronta il percorso per uguaglianza
con proxy (PROXY_PATH.equals(this.path)) invece di usare startsWith, così solo l'endpoint documentato platform-http:proxy
viene eseguito in modalità proxy.
Rinominare qualsiasi percorso di endpoint che inizia con proxy ma non è destinato a essere un proxy.
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. La dimostrazione ispeziona soltanto la classificazione dell'endpoint in-process e non inoltra alcun traffico. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.