Research
Every agent will have a grok build moment. this Is how you handle one
SpaceXAI's Grok Build coding agent was uploading unnecessary repository data; the company's transparent response set industry standards.
· Cantina
Analysis of how Vercel's April 2026 security breach leveraged compromised third-party OAuth access through Google Workspace to reach deployment control-plane configuration.
Vercel’s April 2026 security incident followed a clean attack progression. The breach path ran through Context.ai, a third-party AI tool used by a Vercel employee. From there, the attacker took over the employee’s Vercel Google Workspace account, pivoted into Vercel environments, and reached environment variables that were not marked as sensitive.
That chain deserves close study because it crosses three trust boundaries many teams still review separately: third-party OAuth grants, workforce identity, and deployment control-plane configuration. Once those boundaries line up, the attacker does not need a remote code execution bug in the hosting platform. They need an inherited path to authority.
The story is clear enough to reconstruct technically and incomplete enough that every unsupported jump should be avoided. What follows stays anchored to the incident record, the platform behavior visible in Vercel’s product model, and the Google Workspace controls that shaped the identity side of the breach.
By April 20, the picture was clear on a few points:
110671459871-30f1spbu0hptbs60cb4vsmv79i7bbvqj.apps.googleusercontent.comThe timeline currently looks like this:
Several details remain unknown:
Those gaps matter. They shape how defenders should think about both prevention and scoping.
The first step in the chain is the one that matters most: Context.ai was compromised, and one of the indicators tied to the response is a Google Workspace OAuth app. Google Workspace puts that surface squarely inside admin governance. Administrators can review authorized third-party apps, restrict access to Google services, and block or trust apps through API controls. The accessed-app inventory can take up to 48 hours to reflect a token grant or revocation.
That delay is operationally significant. It means a third-party OAuth grant can become an attack path before the administrative inventory becomes complete. In fast-moving incidents, a manual “we’ll review app grants later” process leaves a real gap.
The attack surface here is not “AI” in the abstract. It is delegated identity. Once a third-party application is trusted with meaningful Google access, the app becomes part of the security boundary around the employee account.
The next pivot ran through a Vercel employee’s Google Workspace account. Once that account was under attacker control, it became the bridge into Vercel environments.
This is the critical pivot. The control plane was reached through identity, not through an exploit in application code. In modern SaaS estates, SSO-backed workforce identity is often the real root of administrative authority:
The next step is unusually revealing: the attacker reached environment variables that were not marked as sensitive. On Vercel, variables marked sensitive are stored in unreadable form, and that protection is available in preview and production environments. Vercel’s environment variable documentation also says values are visible to users with project access. That split matters because it creates two classes of configuration from an attacker’s perspective: values they can read once they reach the control plane, and values they cannot.
That means Vercel already had a secret-tier split:
That is why the response had to center on rotation. Any secret stored in a readable variable has to be treated as potentially exposed once the control plane is reached.
In a typical Vercel estate, environment variables frequently carry access into systems outside Vercel itself. The exact impacted values in this incident are not public, so the list below is an inference about common blast radius, not a claim about Vercel’s specific exposure.
Common second-stage credential classes include:
Once an attacker can enumerate readable variables, the incident expands from “control-plane access” to “credential graph expansion.” The control plane gives visibility. The variables give reach.
Vercel’s Activity Log records team events chronologically, including the user involved, event type, account type, and timestamp. In a breach like this, activity logs and recent deployments become the first scoping surface because they show whether the identity pivot turned into environment review, deployment actions, or token changes.
That tells us something important about the likely defensive problem. The relevant signals already existed:
The hard part is sequence detection under pressure. Human review of a log after compromise is slower than automatic correlation of a risky OAuth grant, a new identity session, environment enumeration, and subsequent control-plane actions.
The fastest useful response is to separate confirmed remediation from broader hardening. Vercel’s bulletin and docs support a concrete first wave of actions, and they also point to a few adjacent controls worth tightening while the investigation continues.
110671459871-30f1spbu0hptbs60cb4vsmv79i7bbvqj.apps.googleusercontent.com.The incident itself is not a software vulnerability with a public exploit. It is a trust-chain failure across SaaS identity and deployment administration. The safest way to model it is with defensive lab reproductions that help teams find the same weakness class in their own estate.
This stripped-down graph is enough to explain why the breach path worked:
Context.ai OAuth compromise
-> Google Workspace account session
-> Vercel team access
-> environment enumeration
-> readable environment variables
-> downstream credentials
-> broader internal or customer impact
The defensive use of this graph is to ask a hard question for every edge: which one is supposed to break first?
If the answer is “none of them,” the estate is relying on the third-party app never being compromised.
This is the exact control gap exposed in the incident. The logic below is illustrative pseudocode for a policy engine or CI guardrail:
for (const variable of environmentVariables) {
const nameLooksSensitive =
/(token|secret|key|password|signing|private|credential)/i.test(variable.name);
const valueLooksSensitive =
looksLikeJWT(variable.value) ||
looksLikeGitHubToken(variable.value) ||
looksLikeCloudKey(variable.value) ||
looksLikeWebhookSecret(variable.value) ||
hasHighEntropy(variable.value);
if (!variable.sensitive && (nameLooksSensitive || valueLooksSensitive)) {
fail(variable, "Readable environment variable carries authentication material");
}
}
This matters because manual labeling fails under speed. Teams create a variable to unblock a deploy, label it as non-sensitive to keep it easy to view, and the classification error becomes invisible until an attacker reaches the control plane.
The individual events in this incident are ordinary on their own. Their ordering is what makes them dangerous.
WHEN
oauth_app_grant.risk = 'high'
AND actor.role IN ('platform-admin', 'deployment-admin')
AND WITHIN 30 MINUTES vercel_event IN ('environment.list', 'environment.read', 'deployment.create')
THEN
revoke_session(actor)
page_incident_response()
start_secret_rotation(actor.scope)
No exploit code is required here. This is sequence analytics. It turns a set of normal-looking administrative events into a containment decision.
This incident crossed too many surfaces for a siloed workflow to keep up cleanly:
Most teams cover those surfaces with separate tools and separate owners. Identity sees one part. Cloud sees another. AppSec sees code. SecOps sees alert queues. Platform engineering sees deployment state. The result is the usual operational problem: too many consoles, too many alerts, and too much manual context-switching during the first minutes that actually matter.
This is the operating model Cantina is built to compress. The incident behaves like one graph, so the response system has to do the same.
A setup like this is common: Google Workspace or Okta for workforce identity, GitHub for source and automation, Vercel for deployments and environment management, AWS behind it, and a growing number of third-party AI tools touching engineering workflows.
When a breach moves through that stack, most teams do not fail because they lack alerts. They fail because the useful signals land in different places. One event appears in identity. Another appears in Vercel. The real blast radius sits in the secrets and downstream systems those credentials unlock.
This is where we help first. We bring those signals together early so the team can answer three questions fast:
Instead of spending the first hour jumping between admin consoles, deployment logs, cloud activity, and guesswork over secrets, the team gets a single incident view with a single scope and a single response path.
In a chain like this, we focus on the joins between systems, because that is where incidents like this usually get missed.
We look for things like:
That matters because a breach like this is not one isolated event. It is a chain. If you only look at each step on its own, it is easy to underestimate the whole.
Teams that want to stop this class of breach need stronger answers to three questions:
If your environment depends on Google Workspace, GitHub, Vercel, AWS, and third-party AI tooling all working together safely, this is the kind of incident to plan around now.
We help teams understand where those trust paths exist, which readable secrets create real exposure, and what to lock down first when identity and control-plane signals start lining up.
If you think your Vercel environment may have been affected, or you want help reviewing the OAuth grants, deployment activity, and environment-variable exposure that would shape the first hour of an incident like this in your own stack, contact us.