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-oauth) 4.19.0 before 4.22.2
Description:
Use of Cache Containing Sensitive Information vulnerability in Apache Camel
Oauth component.
This issue affects Apache Camel: from 4.19.0 before 4.22.2.
OAuthClientCredentialsTokenResolver obtains OAuth 2.0 bearer tokens through the
client credentials grant on behalf of the components that authenticate their
outbound calls with a named OAuth profile, such as camel-openai,
camel-langchain4j-agent, camel-huggingface, camel-docling, camel-a2a,
camel-spring-ai-chat and the IBM watsonx components, and of applications that
call the OAuthClientAuthenticationFactory SPI directly. It kept the tokens it
obtained in a static cache shared by every resolver instance and every
CamelContext in the JVM, and keyed that cache on the token endpoint and the
client ID only, although the token request also carries the client secret and
the requested scope. Two profiles that share a token endpoint and a client ID
but request different scopes, or authenticate with different client secrets,
therefore mapped to the same cache entry: the profile that resolved a token
first populated the entry, and the other profile was then handed that token,
with no token request made under its own configuration, for as long as the
token remained valid. Token caching is enabled by default, and pointing several
profiles at one identity provider client is an ordinary use of the profile
support rather than an opt-in to an insecure setting. The outcome is an
outbound request that carries a token issued for another profile's scope, which
can grant broader authority than the calling profile was configured for, or
reach a service the token was not issued for; with identity providers that
derive a token's audience from the requested scope, a different scope can mean
a token for a different service altogether. A profile configured with a
different client secret was likewise served the token obtained with the other
secret, without authenticating with its own. The profiles are configured by the
deployment, which is trusted, so no untrusted input reaches the cache: the
party that gains is the service that receives a token it was not meant to
receive, which, if hostile or compromised, can replay that token within its
scope. Reaching the issue requires a deployment that defines more than one
profile sharing a token endpoint and client ID while differing in scope or
client secret.
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. The 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,
disable token caching on every OAuth profile that shares a token endpoint and
client ID with another profile, by setting camel.oauth.NAME.cache-tokens=false
for a named profile or camel.oauth.cache-tokens=false for the default one, so
that each resolution requests a token with that profile’s own scope and client
secret, at the cost of a token request on every resolution. Alternatively,
register a separate client at the identity provider for each profile that needs
a different scope or client secret, so that no two such profiles share a client
ID.
Solution:
Upgrade to Apache Camel 4.23.0, which fixes the issue. Users on the 4.22.x
stream should upgrade to 4.22.2. The 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. The token cache is now
keyed on every input of the token request: the token endpoint, the client ID, a
SHA-256 fingerprint of the client secret, so that the raw secret is not kept in
the cache, and the requested scope, so profiles that differ in credentials or
scope obtain separate tokens while equivalent profiles still share one. The
4.18.x line and earlier never carried the client credentials token resolver and
are not affected.
Work Arounds:
Disable token caching on every OAuth profile that shares a token endpoint and
client ID with another profile, by setting camel.oauth.NAME.cache-tokens=false
for a named profile or camel.oauth.cache-tokens=false for the default one, so
that each resolution requests a token with that profile's own scope and client
secret, at the cost of a token request on every resolution. Alternatively,
register a separate client at the identity provider for each profile that needs
a different scope or client secret, so that no two such profiles share a client
ID.
Credit:
Andrea Cosentino from Apache Software Foundation (finder)
Andrea Cosentino from Apache Software Foundation (remediation developer)
References:
https://camel.apache.org/security/CVE-2026-94386.html
https://issues.apache.org/jira/browse/CAMEL-24872
https://github.com/apache/camel/pull/26681
https://github.com/apache/camel/pull/27779
https://camel.apache.org/security/CVE-2026-85317.html
https://camel.apache.org/
https://www.cve.org/CVERecord?id=CVE-2026-94386