You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
2.**Filesystem format** (regex): `mkfs.*`, `DELETE FROM .* WHERE 1`
93
-
3.**Secrets in commands** (13 literal + 1 regex): any command containing `ANTHROPIC_API_KEY=`, `OPENAI_API_KEY=`, `AWS_SECRET_ACCESS_KEY=`, `password=`, `token=`, or database URLs with embedded credentials
93
+
3.**Secrets in commands** (9 literal + 1 regex): any command containing `ANTHROPIC_API_KEY=`, `OPENAI_API_KEY=`, `AWS_SECRET_ACCESS_KEY=`, `GITHUB_TOKEN=`, `GH_TOKEN=`, `password=`, `passwd=`, `secret=`, `token=`, or database URLs with embedded credentials
94
94
95
-
Uses `grep -qiF` (case-insensitive, literal) for exact patterns and `grep -qiE` for regex. Returns a JSON decision object to stderr with exit code 2 to block.
95
+
Uses `grep -qiF` (case-insensitive, literal) for exact patterns and `grep -qiE` for regex. Returns a JSON decision object to stdout with exit code 2 to block.
96
96
97
97
**What happens if you remove it.** No pre-execution safety net. A command like `git push --force origin main` would execute if it passes the settings.json permissions. The devcontainer policy blocker (if present) covers some patterns but not all.
98
98
@@ -244,7 +244,7 @@ These layers only apply when running inside the devcontainer. They are optional
244
244
- GitHub IPs (fetched dynamically from GitHub's API, aggregated into CIDR ranges via `ipset`)
245
245
- Specific domains: PyPI (`pypi.org`, `files.pythonhosted.org`), Astral (`astral.sh`), Claude/Anthropic (`claude.ai`, `api.anthropic.com`, `sentry.io`, `statsig.com`), VS Code marketplace
246
246
247
-
Uses `ipset` with `hash:net` for efficient CIDR-based filtering instead of per-IP iptables rules. IPv6 is completely blocked. Self-tests at the end by verifying `example.com` is unreachable and `api.github.com` is reachable.
247
+
GitHub CIDR ranges are aggregated using the `aggregate` tool, then stored in `ipset` with `hash:net` for efficient filtering instead of per-IP iptables rules. IPv6 is completely blocked. Self-tests at the end by verifying `example.com` is unreachable and `api.github.com` is reachable.
248
248
249
249
**What happens if you remove it.** The container has unrestricted network access. Claude Code could download arbitrary packages from any host, which is a supply-chain attack vector.
250
250
@@ -289,7 +289,7 @@ Uses `ipset` with `hash:net` for efficient CIDR-based filtering instead of per-I
289
289
290
290
**Why it exists.** Principle of least privilege. A root user inside the container could modify system files, install packages at the OS level, and potentially escape the container in some Docker configurations.
291
291
292
-
**What it does.** The Dockerfile creates a `vscode` user (uid 1000) and runs all commands as that user. Sudo is restricted to firewall-related commands only (`iptables`, `ipset`, `ip6tables`).
292
+
**What it does.** The Dockerfile creates a `vscode` user (uid 1000) and runs all commands as that user. Sudo is restricted to a single script: `/usr/local/bin/init-firewall.sh`. The user cannot run `sudo iptables` directly.
293
293
294
294
**What happens if you remove it.** Claude Code runs as root inside the container. Combined with removed firewall/policy hooks, this means unrestricted system access within the container.
295
295
@@ -336,9 +336,9 @@ These run automatically as part of `/done` for Standard and Project scope tasks.
336
336
337
337
**Why.** Verifies tests pass and checks coverage. Uses Sonnet because it needs to reason about test adequacy, not just run commands.
338
338
339
-
**What.** Runs `pytest` with coverage flags. Analyzes results and can add missing test cases (`permissionMode: acceptEdits`).
339
+
**What.** Runs `pytest` with coverage flags. Analyzes results and reports findings. Read-only (`permissionMode: dontAsk` -- no Edit tool).
340
340
341
-
**Remove.** Tests are not validated before PR creation. CI still runs them, but you lose the pre-commit coverage check and auto-fix capability.
341
+
**Remove.** Tests are not validated before PR creation. CI still runs them, but you lose the pre-commit coverage check.
342
342
343
343
</details>
344
344
@@ -401,7 +401,7 @@ These are invoked manually, not by `/done`. They have no workflow dependencies.
401
401
|-------|---------|------|
402
402
| security-auditor | OWASP-based vulnerability scan | plan (read-only) |
403
403
| refactoring-specialist | SOLID/code smell analysis | plan (read-only) |
0 commit comments