The Incident
On August 6, 2026 at Black Hat USA 2026, PortSwigger’s Gareth Heyes (with Pete Hendy on the AI-agent chains) presented “CSS: the bomb inside your inbox” and published the accompanying research and proof-of-concept exploits. No CVE was assigned to the AI-agent chains at publication. The research documents CSS-sanitizer bypasses across Yahoo/AOL, Fastmail, Proton Mail, Gmail, and Outlook, and pairs two of those bypasses with delegated-agent authority to produce end-to-end exfiltration.
The Anthropic Claude Cowork chain used Gmail’s image-set() fallback: the CSS function treats its fallback string as a live URL request and evades Gmail’s image proxy. An indirect prompt-injection email, ingested through a Gmail connector the user had granted Cowork, redirected the agent to fetch a Slack OAuth-confirmation token from the victim’s inbox and place it inside an HTML draft. Rendering the draft — which happens as soon as the victim views it — issues the outbound CSS request and exfiltrates the token. The OpenAI Atlas chain was simpler: a Fastmail-hosted email hid instructions inside CSS pseudo-elements at near-zero opacity, so when the user asked Atlas to “translate the visible text,” the agent instead read the hidden instructions and opened tabs whose URLs encoded the victim’s name. Fastmail patched two mutation bugs and Proton Mail’s proxy bypass regressed shut on retest; Gmail’s image-set() bypass and Outlook’s label-jacking were still live at publication. OpenAI’s Atlas browser was separately scheduled to stop working on August 9, 2026 — framed by OpenAI as “evolving Atlas into ChatGPT,” not as a security withdrawal.
MITRE ATT&CK coverage: T1204.002 (User Execution: Malicious File), T1567 (Exfiltration Over Web Service), T1078 (Valid Accounts).
The Authority Path That Failed
The identity that carried execution authority in the Cowork chain was Claude Cowork acting as a delegated agent under the victim’s Gmail OAuth grant. The scope that identity held was broad: read arbitrary message bodies including third-party OAuth-confirmation emails from services such as Slack, create and modify HTML drafts, and cause the webmail UI to render those drafts — the primitive that the Gmail image-set() fallback bypass converts into arbitrary outbound HTTP requests. The scope the user exercised was narrow: “process the emails,” an analyze-and-summarize intent. The trust anchor that failed first was the Gmail HTML/CSS sanitizer, but the load-bearing gap is the second one: nothing in the Cowork runtime enforced that the connector’s exfiltration-capable primitives had never been authorized by the deploying user for a “summarize inbox” task. Once indirect prompt injection redirected the agent, the delegated OAuth grant carried the exfiltration to completion under the user’s own identity, and the stolen Slack OAuth confirmation token extended the blast radius into a second SaaS.
The Atlas chain is the same shape at smaller scale. Atlas held authority to open tabs and construct URLs across every origin the user was signed into in that browser session; the user’s exercised intent was “translate visible text.” The CSS-hidden instruction rerouted the agent into a URL-open action encoding the victim’s identity — an action the user never approved and would not have if asked. In both chains the gap between held and exercised scope is inspectable before the incident by comparing the connector’s actual tool inventory (draft-write, URL-open, image-fetch) to the user-facing task inventory (“summarize inbox,” “translate this page”).
SecurityV0 Perspective
This is a scope_drift finding (ASI03). The Meta rogue-agent precedent — “publish to the forum when asked to analyze” — is the same shape as “draft an outbound HTML message that reads a Slack OAuth confirmation when asked to summarize inbox.” The control question is whether the agent’s connected authority matches the task: which connector grants and tools are available, which systems they can reach, and which actions become possible when they are combined.
Before deployment, operators should be able to ask whether any tool available across the connected surface holds a network-effective primitive that a “summarize inbox” or “translate this page” task never needs. After an incident, they need enough platform, identity, and execution evidence to identify the untrusted input, the authority that carried the action, and the downstream systems exposed. Without both views, the blast radius remains unknown.
What To Do
- Inventory the connector tools your AI agents can actually invoke. For every connector mounted on Claude Cowork, an OpenAI browser agent, or any email/browser agent, enumerate the effective tool set (draft-compose, tab-open, image-fetch, URL-open) and compare it to the labeled user-facing task inventory. If “summarize inbox” resolves at runtime to a stack that can also draft outbound HTML with arbitrary CSS URLs, the labels and the runtime are not aligned and injection turns that gap into exfiltration.
- Monitor outbound actions across the connected surface. Correlate draft rendering, tab opens, image loads, and network requests with the platform identity and task that caused them. The Gmail
image-set()bypass is difficult to detect without this signal, and the same evidence helps expose Atlas-style tab-open exfiltration. - Remove authority the task does not require. A Gmail connector used only to summarize inbox content should not retain draft-compose authority. Where the platform cannot grant task-specific scopes, separate read and write agents or accounts, require approval before a write or external request, and rotate exposed tokens when incident evidence indicates compromise.
- Treat email content and web pages as untrusted prompt input, not as text. Configure the agent runtime to strip or isolate HTML/CSS from message bodies before the model sees them, or route through a sanitizer that does not pass
image-set()fallbacks,content:pseudo-elements, oropacity:0text. Do not rely on the webmail provider’s own sanitizer as the last line of defence — Fastmail’s mutation bugs and Proton’s regressed proxy bypass show why. - Freeze exfiltration primitives while untrusted content is in the context. When a user asks an email or browser agent to process a message or a page, deny the agent’s ability to open new URLs, share files, or write outbound drafts until the specific operation completes and the user re-approves the next step. The pattern is universal across Cowork’s draft-write, Atlas’s tab-open, and any browser-embedded agent with cross-origin reach.
Sources
- CSS: the bomb inside your inbox — PortSwigger Research
- portswigger/css-the-bomb-inside-your-inbox — GitHub proof-of-concept
- Evolving Atlas into ChatGPT — OpenAI Help Center
- Atlas is scheduled to stop working on August 9, 2026 — OpenAI Developer Community
- Webmail CSS attacks expose a new risk for AI-powered email tools — Security Affairs
- New CSS Attacks Can Break Webmail Defenses to Steal Passwords and Tokens — The Hacker News
- MITRE ATT&CK: T1204.002, T1567, T1078