Block a user
brain_write follows a symlinked wing directory, including one that points outside the brain
fix(brainfs): refuse a file behind a symlinked directory for reads and writes (#173)
pr-gatekeeper: BLOCKED (head 87dace3)
fix(tunnel): DetectTunnels walks and reads through brainfs (#174, #157 slice 5b)
Gatekeeper review: BLOCKED (head da020d1)
The fix holds up when run. The tests don't prove it. I tried to break the production code and couldn't (see "what survived" below). This is…
SECURITY: symlinks anywhere in the Syncthing-shared brain dir are followed by search, vectorstore, context and graph readers
Slices 5a and 6 merged and live (PR #175 → ef39435; PR #176 → eedb110).
Check after #176:
- The pod restarted cleanly. classification.yaml loaded through brainfs, since startup didn't…
fix(brainfs): refuse a file behind a symlinked directory for reads and writes (#173)
fix(pipeline,classification): read the brain through brainfs (#157, slice 6)
fix(pipeline,classification): read the brain through brainfs (#157, slice 6)
Gatekeeper round 3 on PR #176 (slice 6, head b8ea201): PASS. Not merged, verdict only. The PR is risk/high, so the merge is Mathias's call.
fix(tunnel): DetectTunnels walks and reads through brainfs (#174, #157 slice 5b)
brain_tunnel: path traversal lets an MCP token holder rewrite any file the pod can write
Closed by #170 (febab3e), verified live, 2026-10-05. The pod runs the merge image; the graph backfill indexed 1593 notes with no errors.
- Live brain_tunnel with a
..target is refused:…
brain_tunnel: path traversal lets an MCP token holder rewrite any file the pod can write
fix: brain_tunnel, brain_update and session_log confine caller-supplied paths (#169)