Severity: 
    CVSS 3.1: 4.8 (medium) CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N

Affected versions:

- Apache Camel (org.apache.camel:camel-keycloak) 4.16.0 before 4.18.5
- Apache Camel (org.apache.camel:camel-keycloak) 4.19.0 before 4.22.2

Description:

Insufficient Session Expiration vulnerability in Apache Camel Keycloak 
component.



This issue affects Apache Camel: from 4.16.0 before 4.18.5, from 4.19.0 before 
4.22.2.



When token introspection is enabled on the camel-keycloak 
KeycloakSecurityPolicy (useTokenIntrospection=true), the security processor 
validates the access token of a request by sending it to Keycloak's OAuth 2.0 
token introspection endpoint, and accepts the token while the response reports 
it as active. The introspection endpoint reports a token as inactive once its 
exp (expiration) time has passed, so on this path the active flag is what 
enforces token expiry. Introspection results are cached by default 
(introspectionCacheEnabled=true, introspectionCacheTtl=60 seconds), and both 
cache implementations shipped with the component, ConcurrentMapTokenCache and 
CaffeineTokenCache, expired an entry a fixed time after it was inserted, 
without bounding that lifetime by the exp claim that the cached response 
already carried. KeycloakSecurityProcessor in turn checked only the active flag 
of the result, on every path that uses introspection, and never compared exp 
with the current time. A response cached shortly before the token expired was 
therefore served to later requests carrying the same token for up to the 
configured time-to-live after the token's expiry, and those requests were 
admitted with the roles and permissions the expired token had carried, although 
RFC 7662, which defines token introspection, states that a response containing 
exp must not be cached beyond that time. The access token is supplied by the 
caller with each request, typically as a bearer token in the Authorization 
header, so a caller holding a token that was valid moments earlier could keep 
using it after it expired, for as long as the cached entry lived. The window is 
bounded by introspectionCacheTtl, which is 60 seconds by default and 300 to 600 
seconds where the documentation's recommendation for internal services was 
followed, and it opens only for a token that the same Camel process 
introspected and cached while the token was still active. The issue grants 
nothing beyond what the token already carried: it allows no token forgery and 
no privilege escalation, and token introspection is not enabled by default, 
which is why the severity is assessed medium. The local JWT verification path, 
used when introspection is disabled, is not affected by this issue.



Users are recommended to upgrade to version 4.23.0, which fixes the issue. If 
users are on the 4.22.x releases stream, then they are suggested to upgrade to 
4.22.2. If users are on the 4.18.x releases stream, then they are suggested to 
upgrade to 4.18.5. The 4.16.x, 4.17.x and 4.19.x to 4.21.x release lines 
reached end of life before this issue was resolved and will not receive a fix, 
so deployments on them must move to a supported release. For deployments that 
cannot upgrade immediately, set introspectionCacheEnabled=false on the 
KeycloakSecurityPolicy, so that every request is checked against the 
introspection endpoint, which reports an expired token as inactive, at the cost 
of one introspection call per request. Lowering introspectionCacheTtl only 
narrows the window and does not close it.

Solution:

Users are recommended to upgrade to version 4.23.0, which fixes the issue. If 
users are on the 4.22.x releases stream, then they are suggested to upgrade to 
4.22.2. If users are on the 4.18.x releases stream, then they are suggested to 
upgrade to 4.18.5. Both cache implementations now bound the lifetime of each 
entry by the shorter of introspectionCacheTtl and the time remaining until the 
token's exp, a result whose token has already expired is never served from the 
cache, and KeycloakSecurityProcessor now rejects a token whose exp lies in the 
past on every path that uses introspection, so expiry is enforced on the 
introspection path as it is on the local JWT verification path. The 4.16.x, 
4.17.x and 4.19.x to 4.21.x releases streams reached end of life before this 
issue was resolved and will not receive a fix, so deployments on those lines 
must move to a supported release.

Work Arounds:

For deployments that cannot upgrade immediately, set 
introspectionCacheEnabled=false on the KeycloakSecurityPolicy, so that every 
request is checked against the introspection endpoint, which reports an expired 
token as inactive, at the cost of one introspection call per request. Lowering 
introspectionCacheTtl only narrows the window and does not close it.

Credit:

Andrea Cosentino from Apache Software Foundation (finder)
Andrea Cosentino from Apache Software Foundation (remediation developer)

References:

https://camel.apache.org/security/CVE-2026-95663.html
https://issues.apache.org/jira/browse/CAMEL-24902
https://github.com/apache/camel/pull/26747
https://github.com/apache/camel/pull/27182
https://github.com/apache/camel/pull/27183
https://camel.apache.org/security/CVE-2026-46455.html
https://camel.apache.org/security/CVE-2026-85301.html
https://camel.apache.org/
https://www.cve.org/CVERecord?id=CVE-2026-95663

Reply via email to