|
1 | | -// plugins/gatekeeper/src/pre-tool-use.ts |
| 1 | +// src/pre-tool-use.ts |
2 | 2 | import process from "node:process"; |
3 | 3 |
|
4 | | -// plugins/gatekeeper/src/chain-parser.ts |
| 4 | +// src/chain-parser.ts |
5 | 5 | function isDigit(ch) { |
6 | 6 | return ch !== undefined && ch >= "0" && ch <= "9"; |
7 | 7 | } |
@@ -124,7 +124,7 @@ function parseChainedCommand(cmd) { |
124 | 124 | return { kind: "chain", parts: trimmed }; |
125 | 125 | } |
126 | 126 |
|
127 | | -// plugins/gatekeeper/src/pre-tool-use.ts |
| 127 | +// src/pre-tool-use.ts |
128 | 128 | var HARD_DENY_RULES = [ |
129 | 129 | { pattern: /^rm\s+-rf\s+\/(?:\s|$)/i, reason: "Filesystem root deletion blocked" }, |
130 | 130 | { pattern: /^rm\s+-rf\s+\/\*(?:\s|$)/i, reason: "Destructive wildcard deletion from root blocked" }, |
@@ -153,24 +153,24 @@ var HARD_DENY_RULES = [ |
153 | 153 | ]; |
154 | 154 | var SOFT_DENY_RULES = [ |
155 | 155 | { pattern: /^git\s+push\s+--force(?:-with-lease)?\b/i, reason: "Force push needs user intent verification" }, |
156 | | - { pattern: /^git\s+push\s+.*\s-(?!-)\S*f/i, reason: "Force push (short flag) needs user intent verification" }, |
157 | | - { pattern: /^git\s+push\s+(?:.*\s)?(?:origin\s+)?(main|master)\s*$/i, reason: "Push to default branch needs user intent verification" }, |
| 156 | + { pattern: /^git\s+push(?:\s+\S+)*\s-(?!-)\S*f/i, reason: "Force push (short flag) needs user intent verification" }, |
| 157 | + { pattern: /^git\s+push\s+(?:\S+\s+)?(?:origin\s+)?(?:main|master)\s*$/i, reason: "Push to default branch needs user intent verification" }, |
158 | 158 | { pattern: /^git\s+reset\s+--hard\b/i, reason: "Hard reset needs user intent verification" }, |
159 | 159 | { pattern: /^git\s+clean\s+-[a-z]*f/i, reason: "Git clean needs user intent verification" }, |
160 | | - { pattern: /^git\s+branch\s+-[a-zA-Z]*D/i, reason: "Force branch delete needs user intent verification" }, |
| 160 | + { pattern: /^git\s+branch\s+-[a-z]*D/i, reason: "Force branch delete needs user intent verification" }, |
161 | 161 | { pattern: /^npm\s+publish\b/i, reason: "Package publish needs user intent verification" }, |
162 | 162 | { pattern: /^(terraform|pulumi)\s+apply\b/i, reason: "Infrastructure apply needs user intent verification" }, |
163 | 163 | { pattern: /^(terraform|pulumi)\s+destroy\b/i, reason: "Infrastructure destroy needs user intent verification" }, |
164 | 164 | { pattern: /^kubectl\s+(apply|delete)\b/i, reason: "Kubernetes mutation needs user intent verification" }, |
165 | 165 | { pattern: /(?:^|\s)\.claude\/settings/i, reason: "Agent self-modification needs user intent verification" }, |
166 | 166 | { pattern: /\bCLAUDE\.md\b/i, reason: "Agent self-modification needs user intent verification" }, |
167 | | - { pattern: /^git\s+commit\s+.*--no-verify\b/i, reason: "Skipping commit verification needs user intent verification" }, |
| 167 | + { pattern: /^git\s+commit(?:\s+\S+)*\s--no-verify\b/i, reason: "Skipping commit verification needs user intent verification" }, |
168 | 168 | { pattern: /\bchmod\s+777\b/i, reason: "Broad permission change needs user intent verification" }, |
169 | 169 | { pattern: /\b(nc|ncat|socat)\s+-l/i, reason: "Exposing local service needs user intent verification" }, |
170 | 170 | { pattern: /\bpython3?\s+-m\s+http\.server/i, reason: "Exposing HTTP server needs user intent verification" }, |
171 | 171 | { pattern: /\b(crontab|systemctl\s+enable|ssh-keygen|ssh-copy-id)\b/i, reason: "Unauthorized persistence needs user intent verification" }, |
172 | | - { pattern: /\b(gcloud\s+.*add-iam|aws\s+iam|az\s+role\s+assignment)\b/i, reason: "Permission grant needs user intent verification" }, |
173 | | - { pattern: /\bsystemctl\s+stop\s+.*log/i, reason: "Logging tampering needs user intent verification" } |
| 172 | + { pattern: /\b(?:gcloud\s+\S+\s+add-iam|aws\s+iam|az\s+role\s+assignment)\b/i, reason: "Permission grant needs user intent verification" }, |
| 173 | + { pattern: /\bsystemctl\s+stop\s+\S*log/i, reason: "Logging tampering needs user intent verification" } |
174 | 174 | ]; |
175 | 175 | var ALLOW_RULES = [ |
176 | 176 | { |
@@ -236,7 +236,7 @@ function classifyWebFetch(url) { |
236 | 236 | return { decision: "soft_deny", reason: rule.reason }; |
237 | 237 | } |
238 | 238 | } |
239 | | - if (/^https?:\/\/(localhost|127\.0\.0\.1|0\.0\.0\.0)(:\d+)?/i.test(url)) { |
| 239 | + if (/^https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0)(?::\d+)?/i.test(url)) { |
240 | 240 | return { decision: "allow", reason: "Safe localhost request" }; |
241 | 241 | } |
242 | 242 | return null; |
|
0 commit comments