Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
☕
☕ Maven
Not in CISA KEV
MEDIUM severity

CVE-2026-111761 — a2a-java-sdk-server-common

MEDIUMFix: a2aproject/a2a-java@b855b2a

CVE-2026-111761 is a medium-severity (CVSS 5.8) Server-Side Request Forgery (SSRF) vulnerability in org.a2aproject.sdk:a2a-java-sdk-server-common. A fix is available for org.a2aproject.sdk:a2a-java-sdk-server-common — see the affected versions and patch details below.

A2A Java SDK has Server-Side Request Forgery (SSRF) in push-notification delivery

Also known asGHSA-q78c-5jjq-57g8
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Oct 22, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

Proof-of-concept exploit code exists

  • CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
  • CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.

Exploitation and automatability from CISA’s SSVC triage for CVE-2026-111761.

EPSS Exploitation Probability

via FIRST.org ↗
0.5%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs43th percentile — riskier than 43% of all scored CVEsHighest risk

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

CVE-2026-111761 by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.

Where this sits among everything scored

Of 395,249 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Counts from FIRST.org, log-scaled.

Real-World Exposure

1 pkg affected
☕org.a2aproject.sdk:a2a-java-sdk-server-common

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Maven packages — download data is not available via public APIs for these ecosystems.

Description


  • Ecosystem: Maven
  • Affected package: org.a2aproject.sdk:a2a-java-sdk-server-common (push-notification delivery)
  • Affected versions: <= 1.2.0.Final (and 1.2.1.Final-SNAPSHOT on main prior 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)

Summary

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's TaskPushNotificationConfig 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 and onCreateTaskPushNotificationConfig 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 302 from the attacker's webhook reaches destinations a creation-time allowlist would block, and a 302 on a POST is followed as a GET — so GET-only endpoints such as the IMDS credentials path are reachable even though the sender only issues POSTs. 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 for I: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:

  1. Start a local listener standing in for an internal target (no real metadata service is touched).

  2. Send one SendMessage that starts a long-running task, with the push config inlined and its url set to http://<internal-target>/latest/meta-data/iam/security-credentials/. Use returnImmediately: true, header A2A-Version: 1.0, and role ROLE_USER. The URL is stored verbatim. (Equivalent via CreateTaskPushNotificationConfig on an existing task.)

  3. 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.

Remediation

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.

References

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
☕Mavenorg.a2aproject.sdk:a2a-java-sdk-server-commonall versions1.3.0.Finalorg.a2aproject.sdk:a2a-java-sdk-server-common:1.3.0.Final

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for org.a2aproject.sdk:a2a-java-sdk-server-common, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update org.a2aproject.sdk:a2a-java-sdk-server-common to 1.3.0.Final or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-111761 is resolved across your whole dependency graph.

  3. Workarounds

    Restrict outbound requests from the affected component to an allowlist of hosts, block access to link-local and internal address ranges at the network layer, and require authentication on internal services so a forged request cannot reach them unauthenticated.

Frequently Asked Questions

--- - **Ecosystem:** Maven - **Affected package:** `org.a2aproject.sdk:a2a-java-sdk-server-common` (push-notification delivery) - **Affected versions:** `<= 1.2.0.Final` (and `1.2.1.Final-SNAPSHOT` on `main` prior 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) --- ## Summary An **unauthenticated** attacker can coerce the a2a-java server into issuing HTTP requests to arbitrary internal and cloud-metadata endpoints from
O3 Security · Impact-Aware SCA

Is CVE-2026-111761 in your dependencies?

Find it across Maven, including transitive dependencies.

CVE-2026-111761: a2a-java-sdk-server — Fixed in 1.3.0.Final