
Reproductor de prueba de concepto ejecutable para CVE-2026-84178, un CSRF de inicio de sesión en la callback de código de autorización de camel-oauth de Apache Camel que canjea códigos sin verificar el estado.
state)Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que la callback de authorization-code de OAuth
no llevaba un parámetro state que la vinculara a la solicitud de autorización que inició el flujo, ni lo verificaba.
Un authorization code obtenido en cualquier navegador podía, por tanto, canjearse en la callback y asociarse
con la sesión que lo presentara — cross-site request forgery de inicio de sesión: la víctima inicia sesión silenciosamente con una
identidad controlada por el atacante, de modo que las acciones y datos posteriores de la víctima acaban en la cuenta del atacante. (La
misma callback no validada también permitía influir en el destino de redirección posterior a la autenticación — una redirección abierta.)
Como señala el aviso, la comprobación de state se ejecuta antes de canjear el code, por lo que la diferencia es alcanzable sin
ninguna interacción con el proveedor de identidad.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0 (afectado; corregido en 4.22.1), callback mediante camel-undertow |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-oauth 3.39.0 (Camel 4.22.0, afectado; control corregido 3.40.0 / Camel 4.22.1), callback mediante camel-quarkus-platform-http |
Ambos módulos demuestran el comportamiento afectado y el corregido.
El procesador real y sin modificar OAuthCodeFlowCallback gestiona el endpoint de callback. Un pequeño stub OAuth se
registra en el registro de Camel para que la callback se ejecute sin un proveedor de identidad activo — solo sustituye al
IdP y registra cuándo se canjea un authorization code (lo que, en el flujo real, vincula la identidad resultante a la
sesión que lo presenta). El atacante simplemente llama a la callback con un code y sin un state coincidente:
state
que coincida con la solicitud de autorización que inició esta sesión) — el code nunca se canjea.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Salida esperada en la compilación afectada:
Request: GET /callback?code=ATTACKER-SUPPLIED-AUTH-CODE (no 'state' parameter)
Callback HTTP status: 302
>>> PROVEN: the callback redeemed the authorization code ... WITHOUT verifying a state parameter ... login CSRF.
| Propiedad | Valor |
|---|---|
| Componente | camel-oauth (callback de authorization-code, OAuthCodeFlowCallback) |
| CWE | CWE-352 (Cross-Site Request Forgery) |
| Severidad | MEDIA |
| Vector de ataque | Una solicitud de callback que transporta un authorization code sin state vinculado a la solicitud de autorización de la sesión |
| Impacto | CSRF de inicio de sesión (la víctima inicia sesión con una identidad controlada por el atacante); redirección abierta desde un origen de confianza |
| Versiones afectadas | Desde 4.11.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24437 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-84178.html
El callback ahora transporta y verifica un parámetro state de un solo uso vinculado a la solicitud de autorización que
inició la sesión: expectedState = session.removeValue(OAUTH_STATE), comparado (en tiempo constante) con el parámetro
de consulta state. Si no hay ningún flujo en curso, o el state no coincide, el callback rechaza la solicitud antes
de canjear el código.
Coloque el callback detrás de un componente que imponga un vínculo CSRF de state, o no dependa del callback del
flujo de código OAuth para el establecimiento de sesión, hasta que pueda actualizar.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si se ven afectados y confirmar que la actualización la resuelve. El proveedor de identidad simulado y el "código del atacante" son fixtures locales inertes. No utilice este material contra sistemas que no sean de su propiedad o que no opere.