Appearance
Why It Matters
SEC362 flags committed Claude settings files when permissions.allow contains the exact wildcard shell grant Bash(*).
This is useful because:
- shared
.claude/settings.jsonfiles are often copied across teams and repos Bash(*)grants unrestricted shell execution instead of a reviewed command allowlist- this makes the shared agent policy much broader than most teams intend
What Triggers
This rule applies only to committed Claude settings surfaces:
.claude/settings.jsonclaude/settings.json
It triggers when:
permissions.allowcontains the exact stringBash(*)
It does not trigger on:
- narrower reviewed patterns such as
Bash(git status) - fixture-like test/example paths
Examples
Bad:
json
{
"permissions": {
"allow": ["Bash(*)", "Read(*)"]
}
}Better:
json
{
"permissions": {
"allow": ["Bash(git status)", "Bash(npm test:*)", "Read(*)"]
}
}Remediation
- replace
Bash(*)with specific reviewed command patterns - keep the shared allowlist as narrow as possible for the repo's actual workflows