On July 8, Wiz Research disclosed GhostApproval, a symlink flaw that hit six major AI coding assistants at once: Amazon Q Developer, Claude Code, Augment, Cursor, Google Antigravity, and Windsurf. The bug is almost insultingly simple, which is exactly why it worked.
A repo ships a file named project_settings.json. It's actually a symlink pointing at your SSH keys. You ask the agent to "set up the workspace." The agent resolves the link, writes to the real target, and shows you an approval dialog that says project_settings.json - because that's the name it was told, not the file it's about to touch. You click approve. You just authorized a write to ~/.ssh/id_rsa without knowing it.
Three things stand out from this disclosure.
The dialog worked exactly as designed. It shows the path a tool call was invoked with, not the path the filesystem resolves to after it follows a symlink. That gap between what the agent says it's doing and what the filesystem actually does is a decades-old class of bug - TOCTOU and symlink attacks predate LLMs by thirty years - and it walked straight into agentic coding because nobody ported the old lessons over.
Vendors split on whether this is even a vulnerability. Amazon, Google, and Cursor shipped fixes. Augment and Windsurf went quiet. Anthropic disputed that Claude Code's behavior was a flaw at all, arguing that a user who trusts a directory and approves an edit owns that decision. Defensible in the abstract, useless in practice: nobody reviewing a "set up the workspace" request is mentally resolving symlinks before they click yes. Consent that requires the human to out-think the attacker is liability transfer dressed up as consent.
The same week, Cursor patched DuneSlide - two CVSS 9.8 zero-click RCEs where a prompt-injected instruction in an MCP response or search result escaped the sandbox entirely, no approval needed at all. GhostApproval and DuneSlide put the trust boundary in the wrong place in two different ways. One relies on a human reading a dialog correctly under time pressure. The other skips the human entirely.
Per-action approval was never an architecture. It's a stopgap that asks a person to make a correct security judgment every single time, on decisions an agent generates faster than anyone can review. GhostApproval is what happens when the only thing standing between an agent and your SSH keys is whether you noticed a filename.
The actual fix is scoping what an agent can touch before it runs, not asking someone to referee each touch as it happens. A spec that enumerates which paths, which operations, which directories are in bounds for a given task turns "did the human catch this" into "was this ever a legal move." You don't need to out-think a symlink attack if the agent was never authorized to write outside /src in the first place. Write your specs to define the blast radius up front. Stop outsourcing that job to a dialog box nobody has time to verify.
Top comments (0)