security: lockdown template ships Bash git catch-all + drops interpreter denies #115

Open
opened 2026-05-27 07:07:52 +00:00 by coilysiren · 0 comments
Owner

Source: background security review on coilysiren/agent-guard@ed3bbb1 (.claude/settings.json).

Finding (HIGH, Agent/Subprocess Permission Bypass): The lockdown output narrowed deny: and replaced the per-subcommand git allowlist (Bash(git blame:*), Bash(git diff:*), Bash(git log:*), Bash(git show:*), Bash(git status:*), Bash(git rev-parse:*), Bash(git ls-files:*), Bash(git config --get:*), Bash(git branch:*), Bash(git remote:*)) with a catch-all Bash(git:*). Plus the deny list dropped entries for bash, sh, zsh, dash, ksh, fish, python, python3, node, deno, ruby, perl, powershell, pwsh, cmd, cscript, wscript, mshta, rundll32, regsvr32, osascript, exec, env, xargs, echo*$*, printf*$*.

Reviewer's concern: Bash(git:*) permits dangerous flags like git -c core.sshCommand=... and git fetch --upload-pack=... that yield command execution. The dropped interpreter denies expand the shell-out surface.

Question for triage:

  1. Is this intentional, with the runtime PreToolUse hook (agent-guard hook pre-tool-use / coily hook pre-tool-use) covering risky git invocations + interpreter shells dynamically, making the static deny list redundant?
  2. Or is it drift in the lockdown template that should be reverted to the verbose per-subcommand git allow + interpreter deny list?

Affected output: every coily lockdown --apply --replace consumer. Visible in coilysiren/agent-guard at the post-merge regen.

**Source:** background security review on coilysiren/agent-guard@ed3bbb1 (`.claude/settings.json`). **Finding (HIGH, Agent/Subprocess Permission Bypass):** The lockdown output narrowed `deny:` and replaced the per-subcommand git allowlist (`Bash(git blame:*)`, `Bash(git diff:*)`, `Bash(git log:*)`, `Bash(git show:*)`, `Bash(git status:*)`, `Bash(git rev-parse:*)`, `Bash(git ls-files:*)`, `Bash(git config --get:*)`, `Bash(git branch:*)`, `Bash(git remote:*)`) with a catch-all `Bash(git:*)`. Plus the deny list dropped entries for `bash`, `sh`, `zsh`, `dash`, `ksh`, `fish`, `python`, `python3`, `node`, `deno`, `ruby`, `perl`, `powershell`, `pwsh`, `cmd`, `cscript`, `wscript`, `mshta`, `rundll32`, `regsvr32`, `osascript`, `exec`, `env`, `xargs`, `echo*$*`, `printf*$*`. **Reviewer's concern:** `Bash(git:*)` permits dangerous flags like `git -c core.sshCommand=...` and `git fetch --upload-pack=...` that yield command execution. The dropped interpreter denies expand the shell-out surface. **Question for triage:** 1. Is this intentional, with the runtime PreToolUse hook (`agent-guard hook pre-tool-use` / `coily hook pre-tool-use`) covering risky git invocations + interpreter shells dynamically, making the static deny list redundant? 2. Or is it drift in the lockdown template that should be reverted to the verbose per-subcommand git allow + interpreter deny list? **Affected output:** every `coily lockdown --apply --replace` consumer. Visible in coilysiren/agent-guard at the post-merge regen.
Sign in to join this conversation.
No labels
P0
P1
P2
P3
P4
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilyco-bridge/coily#115
No description provided.