Summary
A2A Java SDK has Server-Side Request Forgery (SSRF) in push-notification delivery
- Ecosystem: Maven
- Affected package:
org.a2aproject.sdk:a2a-java-sdk-server-common(push-notification delivery) - Affected versions:
<= 1.2.0.Final(and1.2.1.Final-SNAPSHOTonmainprior to the fix) - Patched version: (the release that carries the fix)
- CWE: CWE-918 (Server-Side Request Forgery)
- Severity: High
- CVSS v3.1:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N(5.8, Moderate)
An unauthenticated attacker can coerce the a2a-java server into issuing HTTP requests to
arbitrary internal and cloud-metadata endpoints from the server's own network position, a
Server-Side Request Forgery reachable in the default deployment with no credentials, no user
interaction, and a single request. The behaviour is the shipped default, not a misconfiguration.
Details
BasePushNotificationSender (in server-common) POSTs task data to the URL stored on a task'sTaskPushNotificationConfig with no validation of the destination: no block on loopback, RFC1918,
link-local (169.254.0.0/16, including the 169.254.169.254 metadata address), unique-local,
unspecified, or multicast ranges; no scheme restriction; and no bound on redirects.InMemoryPushNotificationConfigStore.setInfo stores the URL verbatim andonCreateTaskPushNotificationConfig does not check it either.
Both shipped HTTP clients follow redirects (JdkA2AHttpClient → followRedirects(NORMAL),VertxA2AHttpClient → setFollowRedirects(true)), so a creation-time URL allowlist is bypassable:
an attacker webhook answers 302 Location: http://169.254.169.254/... and the client follows it. A
hostname check is likewise defeated by DNS rebinding. A correct guard must validate the resolved
IP of every hop at connection time, not the URL string.
Exploitation
Demonstrated end-to-end against a running server (default wiring, unauthenticated caller):
- Arbitrary internal reachability. The attacker picks the destination and the server issues
the request from inside the trust boundary. Delivery to loopback and to a real RFC1918 LAN
address was exercised at runtime; because the code applies no destination filtering of any kind,
the same path reaches link-local / metadata (169.254.169.254) and other internal ranges
wherever network routing permits. - Allowlist + method bypass via redirect. A
302from the attacker's webhook reaches
destinations a creation-time allowlist would block, and a302on aPOSTis followed as aGET, so GET-only endpoints such as the IMDS credentials path are reachable even though the
sender only issuesPOSTs. This is why a URL allowlist is not a sufficient fix; the guard must
validate the resolved IP of every redirect hop. - Data push into internal services. On direct (non-redirected) delivery, each request carries
the task payload in the body, so internal services that ingest POST data receive
attacker-influenced content (basis forI:L). On a redirected request the body is dropped in the
POST→GET conversion, so the body-push and the redirect-reach are separate capabilities, not
simultaneous on one request.
The sender discards the fetched response and exposes no caller-visible difference between a
successful and a failed delivery (both paths return without surfacing status or body), so the base
case reads back nothing, confidentiality is scored C:N. Read-back is limited, reach is not: the
attacker still drives fully controlled requests to metadata and internal services and writes data
into them.
PoC
Against a running server with push notifications enabled (JSON-RPC transport), using only the real
production classes wired the default way:
Start a local listener standing in for an internal target (no real metadata service is touched).
Send one
SendMessagethat starts a long-running task, with the push config inlined and itsurlset tohttp://<internal-target>/latest/meta-data/iam/security-credentials/. UsereturnImmediately: true, headerA2A-Version: 1.0, and roleROLE_USER. The URL is stored
verbatim. (Equivalent viaCreateTaskPushNotificationConfigon an existing task.)As the task emits state/artifact updates, the sender POSTs each one to the stored URL, from the
server's own network position:POST /latest/meta-data/iam/security-credentials/ HTTP/1.1 Host: 169.254.169.254 Content-Type: application/json {"artifactUpdate":{"taskId":"...","artifact":{"parts":[{"text":"Progress update 1/20"}]}, ...}}
One SendMessage produced multiple server-side POSTs to the attacker-chosen internal path.
Verified on main (commit 72d220c, JDK 21) and unchanged on 1.2.0.Final.
References
- CWE-918: Server-Side Request Forgery: https://cwe.mitre.org/data/definitions/918.html
Impact
Untrusted input controls the target URL of a server-initiated request, which may reach internal services not otherwise accessible from outside. Typical impact: access to internal metadata services, internal APIs, or cloud credentials.
CVE-2026-111761 has a CVSS score of 5.8 (Medium). The vector is network-reachable, no privileges required, and no user interaction. A CVSS score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether this affects your application depends on whether the vulnerable code is present and reachable in your environment. A fixed version is available (1.3.0.Final); upgrading removes the vulnerable code path.
Affected versions
Security releases
Kodem intelligence
Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.
Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.
Already deployed Kodem?
See it in your environmentNew to Kodem? Get a demo →Remediation advice
Validate the resolved IP of the target and of every redirect hop before connecting: reject
loopback / RFC1918 / link-local / metadata / unique-local / unspecified / multicast; restrict the
scheme to http/https; cap redirects; and resolve-and-pin to defeat DNS rebinding. Enable by
default, with a documented opt-out for deployments that intentionally target internal webhooks. The
Go A2A SDK ships a dial-time resolved-IP guard of this shape by default.
Workaround: until a fixed release, block the host's outbound egress to the metadata endpoint
and internal ranges at the network layer.
Frequently Asked Questions
- What is CVE-2026-111761? CVE-2026-111761 is a medium-severity server-side request forgery (SSRF) vulnerability in org.a2aproject.sdk:a2a-java-sdk-server-common (maven), affecting versions < 1.3.0.Final. It is fixed in 1.3.0.Final. Untrusted input controls the target URL of a server-initiated request, which may reach internal services not otherwise accessible from outside.
- How severe is CVE-2026-111761? CVE-2026-111761 has a CVSS score of 5.8 (Medium). This score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether it represents real risk in your environment depends on whether the vulnerable code is present and reachable.
- Which versions of org.a2aproject.sdk:a2a-java-sdk-server-common are affected by CVE-2026-111761? org.a2aproject.sdk:a2a-java-sdk-server-common (maven) versions < 1.3.0.Final is affected.
- Is there a fix for CVE-2026-111761? Yes. CVE-2026-111761 is fixed in 1.3.0.Final. Upgrade to this version or later.
- Is CVE-2026-111761 exploitable, and should I be worried? Whether CVE-2026-111761 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
- What actually determines whether CVE-2026-111761 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
- How do I fix CVE-2026-111761? Upgrade
org.a2aproject.sdk:a2a-java-sdk-server-commonto 1.3.0.Final or later.