Appearance
SEC489 / CLAUDE-PNPM-DLX-PERMISSION
SEC489 flags shared Claude settings when permissions.allow grants Bash(pnpm dlx ...).
Why It Matters
pnpm dlx executes packages without requiring a checked-in wrapper or reviewed installation path. In shared Claude settings, that creates a mutable package-runner trust boundary for the whole team.
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(pnpm dlx
Clean Cases
These stay clean:
- narrower non-
dlxcommands such asBash(pnpm install) - settings without
Bash(pnpm dlx ...) - fixture-like examples under test or fixture paths
Example Trigger
json
{
"permissions": {
"allow": ["Bash(pnpm dlx cowsay:*)", "Read(*)"]
}
}Safer Example
json
{
"permissions": {
"allow": ["Bash(pnpm install)", "Read(*)"]
}
}How To Fix
Replace shared Bash(pnpm dlx ...) permissions with a pinned wrapper or a narrower reviewed command permission that does not grant mutable package execution by default.