Appearance
SEC399 / CLAUDE-NPX-PERMISSION
SEC399 flags shared Claude settings when permissions.allow grants a Bash(npx ...) permission.
Why It Matters
npx executes mutable package resolution by default. Granting it directly in a shared AI policy makes package execution authority part of the default team config, which is harder to review and easier to cargo-cult than a pinned wrapper or a narrower reviewed command.
Trigger Shape
The rule triggers only when all of these are true:
- the file is a detected Claude settings surface
- the path is not fixture-like
permissions.allowcontains a string that starts withBash(npx
Clean Cases
These stay clean:
- specific non-
npxBash permissions such asBash(node server.js) - settings files that do not grant Bash execution at all
- fixture-like examples under test or fixture paths
Example Trigger
json
{
"permissions": {
"allow": ["Bash(npx claude-flow:*)", "Read(*)"]
}
}Safer Example
json
{
"permissions": {
"allow": ["Bash(./scripts/claude-flow-wrapper)", "Read(*)"]
}
}How To Fix
Replace shared Bash(npx ...) permissions with a pinned wrapper or a narrower reviewed command permission that does not grant mutable package execution by default.