
Proof-of-concept eseguibile che riproduce CVE-2026-95628, una lacuna nella validazione dei percorsi assoluti in Apache Camel camel-docling, con harness Spring Boot e Quarkus e verifica della correzione.
validatePathSafety non rifiutava i percorsi assoluti (correzione incompleta di CVE-2026-40047)Riproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui il controllo del percorso degli argomenti personalizzati introdotto dalla correzione di CVE-2026-40047 cercava solo il traversal relativo. Rifiutava un valore contenente ../ e un valore la cui forma normalizzata conteneva ancora un elemento .. — ma non verificava mai se un valore fosse un percorso assoluto, e un percorso assoluto senza segmenti di traversal non contiene nessuno dei due.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.1 |
| Camel Quarkus | camel-quarkus/ | Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0) |
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down
Output su una build interessata (identico su entrambi i runtime):
1) A relative traversal value, which the CVE-2026-40047 fix does reject
header CamelDoclingCustomArguments = [--artifacts-path, ../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
2) Traversal hidden behind redundant separators - also rejected (normalized first)
header CamelDoclingCustomArguments = [--artifacts-path, models/./../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
3) An ABSOLUTE path, which contains no traversal sequence at all
header CamelDoclingCustomArguments = [--artifacts-path, /etc]
argv docling received: --artifacts-path /etc --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
4) The same, attached to the flag after an equals sign
header CamelDoclingCustomArguments = [--artifacts-path=/root/.ssh]
argv docling received: --artifacts-path=/root/.ssh --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
>>> PROVEN: ...
Le sonde 1 e 2 mostrano che la correzione di CVE-2026-40047 fa il suo lavoro. Le sonde 3 e 4 rappresentano la lacuna: il flag è presente nella allowlist di quella correzione (--artifacts-path indica a docling dove trovare i propri artefatti del modello), e il valore passa indisturbato in entrambe le forme di argomento — un elemento di lista separato che segue il flag, e uno allegato dopo un =. Una parte in grado di scegliere gli argomenti personalizzati potrebbe quindi indirizzare il processo docling verso qualsiasi directory a cui il processo Camel può accedere, al di fuori della directory di lavoro in cui il controllo avrebbe dovuto mantenere i valori dei percorsi, che è esattamente il risultato che la correzione precedente mirava a prevenire.
Nessuna installazione di docling necessaria. Il difetto è nella riga di comando che Camel costruisce, quindi l'opzione doclingCommand dell'endpoint punta a un sostituto che registra il vettore di argomenti ricevuto in un file, al posto della CLI. Vengono eseguiti il vero DoclingProducer, il vero validateCustomArguments() e il vero validatePathSafety(); solo lo strumento esterno viene sostituito.
Solo la modalità CLI, che è quella predefinita, passa gli argomenti personalizzati a docling.
CamelDoclingCustomArguments appartiene al namespace degli header di Camel, che i consumer che applicano il filtro predefinito degli header di Camel — ad esempio i consumer JMS e Kafka — rimuovono dai messaggi in arrivo. Il problema viene quindi raggiunto dove una route inoltra valori influenzati dall'esterno nell'header, o dove un consumer mappa gli header in arrivo senza quel filtro.
| Proprietà | Valore |
|---|---|
| Componente | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (Improper Limitation of a Pathname to a Restricted Directory) |
| Gravità | Media |
| Vettore di attacco | Un percorso assoluto come valore di un flag simile a un percorso presente nella allowlist in CamelDoclingCustomArguments |
| Impatto | Indirizzare il processo docling verso qualsiasi directory a cui il processo Camel può accedere |
| Versioni interessate | Dalla 4.15.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.2 |
| Versioni corrette | 4.18.5, 4.22.2, 4.23.0 |
| JIRA | CAMEL-24893 |
| Credito | Zhixi "Jace" Sun, ricercatore indipendente di sicurezza |
Advisory: https://camel.apache.org/security/CVE-2026-95628.html
Correlato: si tratta di una correzione incompleta di CVE-2026-40047, e l'header del percorso di output dello stesso componente è CVE-2026-95629.
validatePathSafety ora rifiuta anche un valore di argomento personalizzato simile a un percorso che sia un percorso assoluto, facendo fallire lo scambio con un'IllegalArgumentException che indica che l'argomento non deve essere un percorso assoluto. Poiché il controllo risiede nell'helper condiviso che convalida ogni valore simile a un percorso, entrambe le forme di argomento sono coperte.
Corretto su main in apache/camel#26738 (fd3bc8e7), backportato su camel-4.22.x in #26743 (e9233c37) e su camel-4.18.x in #26744 (59d30af1).
Impostare camel.version su 4.22.2 ed eseguirlo di nuovo. Verificato su 4.22.1 → 4.22.2:
3) An ABSOLUTE path, which contains no traversal sequence at all
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 must not be an absolute path
4) The same, attached to the flag after an equals sign
REJECTED by Camel: IllegalArgumentException: Custom argument at index 0 must not be an absolute path
>>> NOT reproduced: the absolute path was rejected too.
Non costruire CamelDoclingCustomArguments da valori che provengono dall'esterno del deployment; rimuovi quell'header dai messaggi in arrivo dall'esterno prima che raggiungano un endpoint docling; e assicurati che i consumer che mappano gli header in ingresso scartino il namespace degli header Camel, così che solo la route scelga gli argomenti personalizzati.
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. Non utilizzare questo materiale contro sistemi che non possiedi o non gestisci.