Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-71569 — Runnable Docker proof-of-concept for CVE-2026-71569, an SSRF guard bypass in Apache Camel camel-a2a webhook validation, with probes and fix verification. | Kitploit
Tools/GitHubGitHub/oscerd/cve-2026-71569
Vulnerability AnalysisExploitationWeb SecurityLearning & Education
GitHuboscerd/cve-2026-71569

CVE-2026-71569

Runnable Docker proof-of-concept for CVE-2026-71569, an SSRF guard bypass in Apache Camel camel-a2a webhook validation, with probes and fix verification.

View Repository
2 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-71569 — camel-a2a: the webhook guard accepted an IPv6 unique local address reached through a host name

Runnable proof-of-concept reproducer for the Apache Camel vulnerability where WebhookUrlValidator 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 naming the IPv6 unique local range fc00::/7 ("fc", "fd");
  • a host reached through a name was resolved and classified with isLoopbackAddress, isAnyLocalAddress, isLinkLocalAddress and isSiteLocalAddress.

Those predicates do not cover the same ground: isSiteLocalAddress reports the deprecated fec0::/10 block, 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.

RuntimeDirectoryStack
Camel Spring Bootcamel-spring-boot/Spring Boot 3.5.13 + camel-a2a 4.22.1
Camel Quarkuscamel-quarkus/Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0)

Run it

The host name has to resolve into fc00::/7, which the compose file arranges with an extra_hosts entry (Docker writes it into the container's /etc/hosts at start-up) — so run this through Docker, not with a bare java -jar:

cd camel-spring-boot          # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until curl -sf http://localhost:8080/exploit/ready >/dev/null; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down

Output on an affected build (identical on both runtimes):

Resolution in this environment: internal-service.example -> fd00:0:0:0:0:0:0:1

1) The unique local address as an IP LITERAL
     url: https://[fd00::1]/push-notification
     verdict: REFUSED - Webhook URL must not point to private/internal IPv6 ranges (SSRF protection): [fd00::1]

2) The SAME address reached through a host name
     url: https://internal-service.example/push-notification
     verdict: ACCEPTED, resolved to fd00:0:0:0:0:0:0:1

3) A legitimate host name that merely BEGINS with "fc" (the bug's other direction)
     url: https://fcm.googleapis.com/push-notification
     verdict: REFUSED - Webhook URL must not point to private/internal IPv6 ranges (SSRF protection): fcm.googleapis.com

4) CONTROL - an IPv4 private address, which isSiteLocalAddress does cover
     verdict: REFUSED - ... site-local/private address ...

5) CONTROL - a link-local IPv6 literal
     verdict: REFUSED - ... private/internal IPv6 ranges ...

>>> PROVEN: ...

Probes 1 and 2 are the same address, and the verdicts disagree. Probe 3 is the same inconsistency in the other direction: the string pre-check matched the raw host without first establishing that it was an IP literal, so any name merely beginning with fc or fd was refused outright — fcm.googleapis.com, a perfectly ordinary push endpoint, among them. Probes 4 and 5 are controls showing the guard working where it was written correctly.

Every probe passes allowLocal=false, which is the default (allowLocalWebhookUrls=false) and the configuration in which the guard is expected to hold.

What the gap yields

The webhook URL arrives as TaskPushNotificationConfig.url from the caller registering the push notification, so it is attacker-controlled. PushNotificationDispatcher then sends the push notification to that address, together with any Authorization header carried in the same configuration — whose scheme and credentials the registering caller supplies.

The response is not relayed back to that caller, so what this 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 — which is why the severity is assessed medium.

Vulnerability Summary

PropertyValue
Componentcamel-a2a (WebhookUrlValidator)
CWECWE-918 (Server-Side Request Forgery)
SeverityMedium
Attack vectorA push-notification webhook URL whose host name resolves into fc00::/7
ImpactA blind outbound HTTPS request, with the configured Authorization header, to an internal address the guard should have refused
Affected VersionsFrom 4.21.0 before 4.22.2
Fixed Versions4.22.2, 4.23.0
JIRACAMEL-24371
Credit2122295973 at qq dot com, reported through the ASF Security Team

Advisory: https://camel.apache.org/security/CVE-2026-71569.html

The fix

Both paths now go through InetAddress.getByName, which parses a bracketed IPv6 literal without touching DNS, and classify the resulting address from its raw bytes with one shared classifier — so a host is judged by the address it denotes rather than by how it was spelled. That classifier recognises fc00::/7 and the shared address space 100.64.0.0/10, as well as IPv4-compatible, NAT64 (64:ff9b::/96) and 6to4 (2002::/16) addresses whose embedded IPv4 address is not globally routable.

Fixed on main in apache/camel#25406 (54041cce), backported to camel-4.22.x in #26583 (c4a5c5fc).

Checking a fixed build

Set camel.version to 4.22.2 and run it again. Verified against 4.22.1 → 4.22.2:

1) The unique local address as an IP LITERAL
     verdict: REFUSED - Webhook URL must not point to a unique local address (SSRF protection): [fd00::1]

2) The SAME address reached through a host name
     verdict: REFUSED - Webhook URL must not point to a unique local address (SSRF protection): internal-service.example

3) A legitimate host name that merely BEGINS with "fc"
     verdict: ACCEPTED, resolved to 216.239.38.55

Both spellings now get the same verdict, with the same message, and the false positive in probe 3 is gone too.

Mitigation without upgrading

Place authentication in front of the A2A push-notification configuration path so 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. Note that allowLocalWebhookUrls=false is already the default and does not by itself close the gap — probe 2 above runs with it.

Disclaimer

This repository is published for educational and defensive purposes: to help Apache Camel users understand the vulnerability, verify whether they are affected, and confirm that upgrading resolves it. Do not use this material against systems you do not own or operate.

Download Tool