Skip to content

docs(claude-config): required-permissions.md recommends Read(...) deny globs for secrets without stating their scope #1598

Description

@kyle-sexton

Problem

plugins/claude-config/skills/audit/reference/required-permissions.md recommends a
sensitive-file-deny baseline — Read(./.env), Read(./secrets/**),
Read(./.claude/settings.local.json), key/PEM/SSH patterns — as the remedy for protecting secrets,
with no statement of what a Read deny actually reaches. A reader who follows it comes away
believing the file is protected.

Reported from a consuming project after an agent, blocked on Read, read the same file through a
python -c one-liner in the shell tool with no deny firing. Both observations were routine
fallbacks after a denied Read, not adversarial bypass attempts — which is what makes the
false confidence expensive.

What the current docs actually say

Verified this session against
https://code.claude.com/docs/en/permissions#read-and-edit,
https://code.claude.com/docs/en/sandboxing, and
https://code.claude.com/docs/en/tools-reference#powershell-tool:

  • Partly refuted. A Read(...) deny is not simply a separate namespace from the shell tool. It
    applies to "file commands Claude Code recognizes in Bash, such as cat, head, tail, and
    sed", plus Read/Grep/Glob/LSP, @file mentions, IDE selection context, and Edit on the same path.
  • Confirmed. The rules "don't apply to arbitrary subprocesses that read or write files
    indirectly, like a Python or Node script that opens files itself." That is the real gap and it
    matches the reported observation exactly.
  • The suggested fix in the report is itself the defect. Enumerating shell readers as Bash(...)
    deny globs is documented as fragile ("Bash permission patterns that try to constrain command
    arguments are fragile"), and a PreToolUse hook inspecting the same command string inherits the
    same evasion surface. Neither is a boundary.
  • The documented enforcement path is the sandbox (sandbox.filesystem.denyRead,
    sandbox.credentials.files with "mode": "deny") — OS-level over every Bash command and its
    children. It does not run on native Windows, so it is unavailable in exactly the environment that
    produced the observation.

Scope

Only required-permissions.md states this recommendation; no other plugin or docs/** page does.
No plugin in this marketplace contributes permissions.* entries. guardrails'
secret-pattern-detection.sh matches Write|Edit|NotebookEdit (blocks writing secrets); its
Bash|PowerShell hooks are git/commit-scoped. Whether guardrails should grow a credential-read
matcher is a separate product call and is not proposed here.

Fix

Add a "Scope of a Read deny" subsection stating covered vs not-covered, ranking the remedies
honestly, carrying the platform limit, and flagging what upstream does not state (PowerShell-tool
read coverage; the full recognized-command set). Leave the pattern table itself unchanged — it is
the Category B presence check.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions