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-a2a) 4.21.0 before 4.22.2
- Apache Camel (org.apache.camel:camel-a2a) 4.22.2 unaffected
- Apache Camel (org.apache.camel:camel-a2a) 4.23.0 unaffected
Description:
WebhookUrlValidator in the camel-a2a component classified a push notification
webhook host in two places that did not agree. A host written as an IP literal
was matched against a list of string prefixes that named the IPv6 unique local
range fc00::/7, while a host reached through a name was resolved and the
resulting address classified with the InetAddress predicates isLoopbackAddress,
isAnyLocalAddress, isLinkLocalAddress and isSiteLocalAddress. Those predicates
do not cover the same ground as the prefix list: isSiteLocalAddress reports the
deprecated fec0::/10 block and not the fc00::/7 unique local addresses that
replaced it, and the JDK carries no predicate for them at all. The same address
was therefore accepted or rejected depending on how it was written, and a
webhook URL whose host name resolved into fc00::/7 passed a guard that refused
the identical address given as a literal. PushNotificationDispatcher then
pinned the address it had been handed and opened the connection to exactly that
target, and applyAuth sent along any webhook authorization header or bearer
token the deployment had configured. The webhook URL arrives as
TaskPushNotificationConfig.url from the caller registering the push
notification, so it is attacker-controlled, and allowLocalWebhookUrls is false
by default, which is the configuration in which the guard is expected to hold.
The response is not relayed back to the caller who registered the
configuration, so what the gap yields is a blind outbound HTTPS request from
the Camel process to an internal address the guard was written to refuse;
reaching a service that way additionally requires that the name resolve into
fc00::/7 in the target environment, that an HTTPS service be listening on that
address, and that the TLS handshake succeed for the name being requested. The
same string pre-check was also wrong in the other direction: it matched the raw
host string without first establishing that the host was an IP literal, so any
name merely beginning with fc or fd, such as fcm.googleapis.com, was refused
outright.
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. Both the literal and the resolved path now
classify the address from its raw bytes with one shared classifier, which
recognises fc00::/7 along with IPv4-compatible IPv6, the NAT64 well-known
prefix 64:ff9b::/96, 6to4 under 2002::/16 and the shared address space
100.64.0.0/10. The camel-a2a component was introduced in 4.21.0 and is marked
Preview; the 4.21.x line is not a maintenance stream and does not receive a
fix, and the 4.18.x and 4.14.x lines never carried the component.
Work Arounds:
Place authentication in front of the A2A push notification configuration path
so that the webhook URL does not arrive from an untrusted caller, and deny
egress from the Camel process to fc00::/7 at the network level. Where the
deployment has no need of IPv6, starting the JVM with
-Djava.net.preferIPv4Stack=true removes the address class the gap turns on.
Setting allowLocalWebhookUrls=false is not a workaround: it is already the
default and does not close the gap.
Credit:
[email protected] (finder)
Andrea Cosentino (remediation developer)
References:
https://camel.apache.org/security/CVE-2026-71569.html
https://issues.apache.org/jira/browse/CAMEL-24371
https://github.com/apache/camel/pull/25406
https://github.com/apache/camel/pull/26583
https://camel.apache.org/
https://www.cve.org/CVERecord?id=CVE-2026-71569