Skip to content

Build1 publisher3 min readPublished

Claude Code's deny rules on /tmp and /etc missed paths given by their real location

Claude Code 2.1.268 closes two ways a written prohibition failed to bind, one through symlinked directories and one through Bash lines the permission checker cannot analyze. Codex CLI 0.154.0 removes codex mcp-server outright.

The Engineer · Build desk

Illustration accompanying Claude Code's deny rules on /tmp and /etc missed paths given by their real location

What happened

  • Claude Code 2.1.268 fixes two cases where deny rules silently failed to apply, one of them deny and ask rules on symlinked directories such as /etc, /tmp and /var on macOS and /bin on Linux.
  • The same version stopped /mcp and /plugin server details, claude mcp list and get, and MCP login errors from printing secrets that MCP configs resolved from ${VAR} placeholders.
  • A deny or ask rule starting with ! had been applying beyond the settings source that wrote it, and now applies only within its own source, with a bare ! negation ignored.
  • Codex CLI 0.154.0 removes the deprecated codex mcp-server entry point, so any script, service definition or editor integration that invokes it has to be changed before upgrading.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • exposure Teams that used deny rules to keep .env files and credentials out of reach had no protection on symlinked paths or on lines the checker could not analyze, for every session run before the update.
  • constraint A permission checker that lets a rule lapse on a line it cannot analyze caps what deny rules can promise: they bind the commands the parser understands, and a wrapper like eval is enough to leave the rest unchecked.
  • decision Anyone who put a ! negation in a user-level settings file to carve exceptions for project rules now has to rewrite it inside the source it should apply to, or lose the exception at upgrade.
  • cost Whoever owns the editor integration, the service unit and the hook code pays for the Codex upgrade in edits, since both mcp-server invocations and hook.command accesses have to change.

The two symlink failures hit the same rule from two directions. Deny and ask rules on symlinked directories did not apply when the path was given by its real location, and the roundup lists /etc, /tmp and /var on macOS and /bin on Linux [3]. Bash commands, separately, ignored deny rules written against the symlinked spelling [4]. Whichever spelling an author picked, one of the two paths went unchecked [1].

The second case is about what the checker does when it cannot read the line. The permission checker works out which files a Bash command will touch. env -C runs its command after changing directory, and eval expands a string at runtime. When one of those appeared on the same line, a Read or Edit deny rule could fail to apply [5]. The roundup puts both cases in one class: "Both are the same class of problem: a prohibition you wrote was not actually in force." [6]

Features were the minor part of the week. The same pair of Claude Code releases added claude plugin eval, which scores a plugin's eval suite and writes JSON and HTML reports, /output-style switching that works in cloud and headless sessions, Bash edit diffs behind bashEditDiffEnabled, and a per-run concurrent agent limit settable from 1 to 256 [10].

Gemini CLI 0.59.0 also tightened trust. Its release notes list two substantive changes, both security fixes: SSRF prevention in MCP OAuth metadata discovery and authentication, filed as PR #29081, and enforcement of fail-closed workspace trust with mcpServer filtering [17]. The roundup describes the week across all three tools as light on features and heavy on closing permission and security gaps [18].

Codex CLI 0.154.0 also moves the Python SDK, and the roundup names no replacement for the removed mcp-server entry point. HookMetadata now wraps its handler in .root, so hook.command becomes hook.root.command, and handler-specific fields need a hook.root.handler_type check first [16]. In Python, that kind of change shows up at runtime. Trust handling changed too: startup avoids running workspace-controlled helpers before trust is established, and the macOS sandbox blocks terminal input injection [15].

Count what 2.1.268 closes and it comes to four described defects: two deny bypasses and two secret-disclosure bugs [2]. The second disclosure bug showed a token or password contained in a git source URL in plugin and marketplace errors [8]. The roundup's advice is blunt: "If you rely on deny rules to protect parts of your codebase, update first and read the rest later." [19] A deny rule binds the way its author intended only when the file tools and the Bash path agree on how a path is spelled and the checker refuses a line it cannot analyze, and before 2.1.268 neither of those was in place [2].

What to watch

  • Whether Anthropic documents a fail-closed default for Bash lines the permission checker cannot analyze, instead of case-by-case fixes for env -C and eval.
  • Whether a replacement entry point for the removed codex mcp-server appears in Codex CLI docs or a later release.
  • What Gemini CLI's mcpServer filtering under fail-closed workspace trust actually excludes, which the release notes summary leaves truncated.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories