Fetching from the wire…
Public story · 2026-09-11 · high
Symlinked system directories, unparseable eval commands, and headless -p runs could all slip past deny rules before this release.
Why now: Anthropic published the fix in the September 11 release notes.
Claude Code 2.1.268 closes three gaps in how deny and ask rules get enforced, according to the release notes.
The first is a symlink problem. Deny and ask rules written against a symlinked directory didn't apply when a command resolved the real path instead. On macOS that covered /etc, /tmp, and /var. On Linux it covered /bin. A rule blocking writes to /tmp could be walked around just by hitting the path the symlink actually points to.
The second is a parsing gap. Read and Edit deny rules got skipped whenever a command line included env -C or eval in a form the checker couldn't parse. The rule wasn't wrong, it just never got evaluated for that line.
The third matters most for automation. PermissionRequest hooks never fired at all under claude -p, the headless mode used for scripted and CI runs. If a job's only safety check was a PermissionRequest hook, that job ran with no permission checking, and nothing in the logs would have said so.
I use deny rules as a sandbox boundary in my own projects, treating them as the thing standing between an agent and the parts of the filesystem I don't want touched. None of these three bugs are edge cases. Symlinked system paths and env -C show up in normal shell usage, not just adversarial input, and headless -p runs are exactly where nobody's watching in real time to catch a rule not firing.
If you run -p jobs with a PermissionRequest hook as the enforcement layer, update and re-test them. The release notes don't say how long the headless gap existed before 2.1.268, so there's no way to know how many runs it affected.
Each link below shares sources, entities, or timing with this story.
msitarzewski/agency-agents added 446 stars today, packaging personas across "divisions" (frontend specialists, community experts, fact-checkers, reality checkers), each defined with a voice, a process, and concrete deliverables rather than a generic prompt template (GitHub). I...
The August 7 release adds claude self-hosted-runner so Team/Enterprise customers can host web, mobile and desktop sessions on their own machines or containers, plus cross-session SendMessage/ListAgents so sessions on any of your machines can message each other (macOS and Linux...
The changelog shows sandbox filesystem deny entries being bypassed on Linux and macOS: specifically, denyRead: "~/.aws/" written with a trailing slash was silently ignored. That follows the zsh regex bypass, the PreToolUse auto-allow bypass, and the tabs/invisible-Unicode prom...
One Claude Code release fixed two independent permission-check bypasses on the same day. That's the story. Version 2.1.221, shipped August 4, patches a Bash tool bypass where zsh could execute hidden commands embedded inside [[ ]] regex conditionals. The approval prompt never...
Each project gets a throwaway VM where the agent has full tool access to Docker, git, compilers and package managers with no path back to the host (GitHub). coop setup installs Firecracker and a guest kernel on Linux; macOS goes through Lima via Homebrew. Usage is coop up then...
Two things in one release, and only one of them is in the security section. CLAUDE_CODE_SUBAGENT_MODEL used to override the model for every subagent. In 2.1.251 it sets the default instead. An agent definition's model: frontmatter now wins, and so does an explicit per-spawn mo...
MindPattern daily
One email a day at 7 AM. Sources and a take on every story. Unsubscribe anytime.