Skip to content

Commit c2c107d

Browse files
audit: classify Track C panic-attack findings (#155) (#175)
## Summary Triages all 7 Critical/High panic-attack findings from the 2026-05-26 estate sweep. None require code changes; each is recorded in \`audits/assail-classifications.a2ml\` with a per-line rationale so a future re-sweep on the same path doesn't require re-investigation. | File:line | Category | Classification | Why | |---|---|---|---| | rokur-mcp tests/integration_test.sh:33 | CommandInjection | legitimate-deno-eval | \`deno eval\` is Deno's --eval flag (sandboxed), not POSIX \`eval\` | | vault-mcp tests/integration_test.sh:34 | CommandInjection | legitimate-deno-eval | Same pattern as above | | mcp-bridge/lib/security.js:49 | DynamicCodeExecution | legitimate-pattern-string | security.js IS the detector; \`\"eval(\"\` is a needle in its list, not an eval() call. Inline comment already flags this. | | mcp-bridge/main.d.ts:8 | ExcessivePermissions | legitimate-doc-comment | \`.d.ts\` file; \`-A\` is in a \`//\` documentation comment | | tests/aspect_security_test.zig:125 | HardcodedSecret | legitimate-test-fixture | Placeholder \`ghp_xxx…\` is the *needle* an anti-leak ASPECT test asserts must NOT appear in responses; already \`hypatia-ignore\` annotated | | flake.nix | SupplyChain | legitimate-flake-lock-pinned | Sibling \`flake.lock\` pins inputs by narHash+rev; dependabot keeps it fresh weekly | | tray/src/server.rs:130 | UnboundedAllocation | legitimate-user-config-file | Reads \`~/.config/boj-node/prefs.json\` — user's own settings, not attacker-controlled | Metadata bumped 1.0.0 → 1.1.0; entries 119 → 126. ## Test plan - [ ] \`s-expression\` paren balance verified locally (string-aware counter: 769 = 769). - [ ] CI \`Validate A2ML manifests\` job parses the updated file. - [ ] Spot-check rationale alignment with the live file contents (\`grep -n …\` on each line confirmed the cited context). Closes #155 Refs hyperpolymath/panic-attack#32 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent cba39d2 commit c2c107d

1 file changed

Lines changed: 65 additions & 3 deletions

File tree

audits/assail-classifications.a2ml

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77
(assail-classifications
88
(metadata
9-
(version "1.0.0")
9+
(version "1.1.0")
1010
(project "boj-server")
11-
(last-updated "2026-05-26")
12-
(entries 119)
11+
(last-updated "2026-06-01")
12+
(entries 126)
1313
(status "active"))
1414

1515
(classification
@@ -726,4 +726,66 @@
726726
(classification "legitimate-ffi")
727727
(audit "audits/audit-ffi-2026-05-26.md §2")
728728
(rationale "Zig FFI bridge to boj-server backend (cartridge runtime, federation). Each unsafe pointer cast is at the Zig→C ABI boundary required to call into libboj-server."))
729+
730+
;; ─────────────────────────────────────────────────────────────────
731+
;; Track C — 7 findings from the 2026-05-26 panic-attack estate
732+
;; sweep (#155 / panic-attack#32). All 7 triaged 2026-06-01 — none
733+
;; require code changes. Each entry below records *why*, so a
734+
;; future sweep on the same line does not require re-investigation.
735+
;; ─────────────────────────────────────────────────────────────────
736+
737+
(classification
738+
(file "cartridges/rokur-mcp/tests/integration_test.sh")
739+
(line 33)
740+
(category "CommandInjection")
741+
(classification "legitimate-deno-eval")
742+
(audit "boj-server#155 (2026-06-01)")
743+
(rationale "`deno eval` is Deno's --eval flag (in-runtime JS evaluation, sandboxed by Deno's permission system), not POSIX-shell `eval`. The string is a fixed literal that reads a project-local mcp-tools.json file. Pattern-only match by panic-attack's CommandInjection rule; no shell-string interpolation of untrusted input."))
744+
745+
(classification
746+
(file "cartridges/vault-mcp/tests/integration_test.sh")
747+
(line 34)
748+
(category "CommandInjection")
749+
(classification "legitimate-deno-eval")
750+
(audit "boj-server#155 (2026-06-01)")
751+
(rationale "Identical pattern to cartridges/rokur-mcp/tests/integration_test.sh:33 — `deno eval` is Deno's --eval flag, not POSIX `eval`. Fixed literal, project-local file. False-positive pattern match."))
752+
753+
(classification
754+
(file "mcp-bridge/lib/security.js")
755+
(line 49)
756+
(category "DynamicCodeExecution")
757+
(classification "legitimate-pattern-string")
758+
(audit "boj-server#155 (2026-06-01)")
759+
(rationale "security.js IS the danger-pattern detector. `\"eval(\"` is a needle in its haystack list, not an actual eval() call site. Inline comment on the same line already flags this as a tool false-positive."))
760+
761+
(classification
762+
(file "mcp-bridge/main.d.ts")
763+
(line 8)
764+
(category "ExcessivePermissions")
765+
(classification "legitimate-doc-comment")
766+
(audit "boj-server#155 (2026-06-01)")
767+
(rationale "`.d.ts` declaration file. The `-A` mention is inside a `//` documentation comment describing how end-users invoke the bridge (`deno run -A mcp-bridge/main.js`). Not a permission grant; not executable; comment is for human readers."))
768+
769+
(classification
770+
(file "tests/aspect_security_test.zig")
771+
(line 125)
772+
(category "HardcodedSecret")
773+
(classification "legitimate-test-fixture")
774+
(audit "boj-server#155 (2026-06-01)")
775+
(rationale "Anti-leak ASPECT test. The placeholder `ghp_xxxxxxxxxxxxxxxxxxxx` is the *needle* the test then asserts MUST NOT appear in response bodies / error detail. Removing it would defeat the test's purpose. Already carries an inline `hypatia-ignore: test-only placeholder, not a real token` annotation; line 132's `my_super_secret_password` is the same pattern."))
776+
777+
(classification
778+
(file "flake.nix")
779+
(category "SupplyChain")
780+
(classification "legitimate-flake-lock-pinned")
781+
(audit "boj-server#155 (2026-06-01)")
782+
(rationale "Sibling `flake.lock` IS present at repo root and pins each input by `narHash` and `rev`. The panic-attack SupplyChain rule checks for in-file pinning (narHash/rev attrs in flake.nix itself) but does not detect the lockfile, which is the canonical Nix flakes pinning mechanism. Dependabot also bumps the lock weekly (e.g. PR #170 nixpkgs 4100e83 → e9a7635)."))
783+
784+
(classification
785+
(file "tray/src/server.rs")
786+
(line 130)
787+
(category "UnboundedAllocation")
788+
(classification "legitimate-user-config-file")
789+
(audit "boj-server#155 (2026-06-01)")
790+
(rationale "`std::fs::read_to_string(&path)` where path is `~/.config/boj-node/prefs.json` (`prefs_path()`, line 121). Owned by the local user, not attacker-controlled. The on-disk file is whatever the user's own settings dialog wrote. If a user wants to OOM their own tray process by manually writing a multi-GB prefs.json, that is a local-trust-boundary choice, not a remote attack surface."))
729791
)

0 commit comments

Comments
 (0)