Google’s Agent Toolkit Had a Perfect-10 Flaw
CVE-2026-79696 was published on September 9 against Google Cloud's Agent Development Kit for Python. Public advisories rate it 10.0 on CVSS v4.0, the maximum: reachable over the network, low complexity, no authentication, no user interaction, and full compromise of the host. Most businesses reading this do not run it. The mistake that caused it is one nearly all of them are making somewhere.
What the flaw is
The affected component is adk web, in google-adk versions from 2.0.0 up to but not including 2.7.0. The exploit condition is a vulnerable adk web deployment with pytest installed in the runtime, and the advisory calls out OSS Python, Cloud Run and GKE environments that meet it. Under those conditions, an unauthenticated remote attacker can run arbitrary code by submitting a crafted test session replay.
The mechanism is worth following, because it is not exotic. ADK lets you define an agent in a YAML configuration file, including which functions the agent may call as tools. Allowing arbitrary Python functions there would obviously be dangerous, so the loader blocked a list of dangerous standard library functions.
The list was incomplete. It missed several standard library functions that can execute code as a side effect, including cProfile.run, timeit.timeit and trace.Trace.run. None of those is named "run arbitrary code," which is precisely why they were missed. An attacker supplies a configuration naming one of them as a tool, replays a saved test session, and ADK's replay logic dispatches the recorded call directly to the resolved function.
The fix in version 2.7.0 blocks the entire Python standard library from being referenced in agent configurations, rather than maintaining a list of the bad parts. That change from a denylist to something closer to an allowlist is the core repair for this bug. It does not turn untrusted agent configuration into a safe input class: technical analysis of the patch notes that third-party package references can still be resolved, so who is allowed to supply YAML, and which packages resolve, remain live questions.
If you might be running it
ADK is a developer toolkit, so no business installs it by accident. The realistic route into your stack is a contractor or an internal developer who built an agent on it. Ask them today whether google-adk appears in any dependency list and at what version.
If the answer is yes and the version is anything below 2.7.0, upgrade to 2.7.0 or later, preferably the latest patched release rather than the minimum fixed version. Until that is done, the published guidance is to keep adk web off the network, restrict it to trusted internal or local environments, and avoid running it anywhere pytest is installed. There is no public reporting of exploitation in the wild that I have seen, which is a reason to move promptly rather than a reason to relax.
If you have no idea who to ask, that is the more important finding, and it is the problem we set out in vulnerability management without a security team.
Listing the bad things never finishes
A denylist enumerates what is forbidden and permits everything else. An allowlist enumerates what is permitted and forbids everything else. The first is comfortable to write, because you start from a working system and subtract the obvious dangers. The second is uncomfortable, because you start from nothing and have to justify each addition.
The asymmetry is that a denylist has to be right about every dangerous thing that exists, including the ones invented after you wrote it. An allowlist only has to be right about the things you need. This is a predictable failure mode of denylists rather than evidence of careless engineering. timeit.timeit is easy to leave off such a list because timing code is not what anyone pictures when they think about remote code execution.
Where you are making the same choice
This design decision shows up all over an ordinary business, usually without anyone recognising it as one.
Agent permissions. "The agent can do anything except delete records and send external email" is a denylist, and you will discover the third thing you should have excluded after it happens. "The agent can read these two tables and write to this one" is an allowlist and it is not much harder to write.
AI tool policy. A list of banned tools is out of date the week it is written, because a new one launches every few days. A list of approved tools is easier to review and maintain when the permitted set is small, and requests to add to it tell you what people actually need. It still needs revisiting when a tool changes behaviour or expands its permissions. That is why the framework in an AI governance framework for a small business is built around approval rather than prohibition.
Data rules. "Do not put customer data, financial data or HR data into AI tools" leaves every category nobody thought of on the permitted side. "Only public and internal information goes into AI tools" covers the categories you have not imagined yet.
System access generally. The same logic underpins least-privilege access for staff and contractors, and it is the reasoning behind the scoping approach in three boxes for an AI agent.
Why agent frameworks make this sharper
Traditional software does what a developer wrote. An agent framework exists to let a configuration file decide, at runtime, which functions get called, which is a deliberately wide door. Widening the door is the product, so the question of who may walk through it carries more weight than it did in software where the answer was fixed at build time.
Two things get blurred whenever a story like this appears. This is an ordinary software defect in a developer tool, not a model behaving unexpectedly, and it is unrelated to the agent incidents we covered in agents running a website for six weeks. Treating a coding bug as evidence that AI is out of control produces the wrong response, which is usually paralysis rather than a version bump.
One question this week
Take whichever AI agent or automation your business already runs, and ask whoever set it up a single question: is its access described as a list of what it can do, or a list of what it cannot. If the answer is the second, converting a narrowly scoped automation may be a short piece of work, though legacy permissions can take considerably longer. It is worth starting with whichever one touches customer data.
Frequently Asked Questions
What is CVE-2026-79696?
A code injection vulnerability published on September 9, 2026 in the adk web component of Google Cloud’s Agent Development Kit for Python, affecting versions from 2.0.0 up to but not including 2.7.0. Where pytest is installed in the runtime, an unauthenticated remote attacker can execute arbitrary code by submitting a crafted test session replay. Public advisories rate it CVSS v4.0 10.0, the maximum, reflecting network attack vector, low complexity, no privileges and no user interaction, with full impact on confidentiality, integrity and availability. The NVD record is still awaiting its own enrichment, and lists the underlying weakness as CWE-184, an incomplete list of disallowed inputs.
How do I know whether my business is affected?
You are affected only if something in your stack runs Google’s ADK for Python at a version from 2.0.0 up to but not including 2.7.0, exposes adk web to a network, and has pytest installed in that runtime. That is a developer-facing toolkit rather than something a business installs directly, so the realistic route is a contractor or an internal developer who built an agent on it. Ask whoever builds software for you whether google-adk appears in the dependency list and which version.
What is the fix?
Upgrade google-adk to 2.7.0 or later, preferably the latest patched release rather than pinning to the minimum fixed version, since further releases have shipped since. The 2.7.0 change blocks the entire Python standard library from being referenced in agent configurations instead of relying on a list of specific blocked functions. If you cannot patch immediately, the published guidance is to keep adk web off the network, restrict it to trusted local or internal environments, and avoid running it anywhere pytest is installed. Removing test-only dependencies such as pytest from production images is worth doing regardless. Note that the standard-library block closes this bypass class rather than making untrusted agent YAML safe, since third-party package references can still be resolved.
What caused the vulnerability?
The agent configuration loader blocked a list of dangerous Python standard library functions rather than blocking the standard library as a whole. The list missed several functions that can execute code, including cProfile.run, timeit.timeit and trace.Trace.run. An attacker could supply an agent configuration naming one of those as a tool, then replay a saved test session, and the replay logic dispatched the recorded call straight to the resolved function.
Does this mean AI agents are unsafe?
This particular flaw is an ordinary software defect in a developer toolkit rather than an AI behaving unexpectedly, and conflating the two leads to the wrong response. The transferable lesson is a design one: the code listed what to forbid instead of listing what to permit, and a list of forbidden things is only ever as complete as the imagination of whoever wrote it. That same choice is available to you every time you scope what an agent may do in your systems.
Turn your denylists into allowlists
We review what your agents and integrations are permitted to reach, convert exclusion rules into explicit permissions, and put approval gates on the actions that cannot be undone.
Related Articles
Google DeepMind Maps 6 Ways Hackers Can Hijack Your AI Agent
Three Boxes to Put an AI Agent In
From Chatbots to Agent Gateways: How to Control What AI Agents Can Touch
Ajan leads the ChatGPT.ca team: 200+ custom GPT builds and automation projects for 50+ businesses across 20+ industries. Based in Markham, Ontario. PIPEDA-compliant solutions.