diff --git a/hermes-key-enforcement.prose.md b/hermes-key-enforcement.prose.md index e0c695c..c178c06 100644 --- a/hermes-key-enforcement.prose.md +++ b/hermes-key-enforcement.prose.md @@ -188,7 +188,7 @@ Agent keys live in `.env` or `.env.vault` files with 600 permissions (koonimo's Run on any Hermes host to detect violations. -**Timeout policy (2026-10-02):** The scan timeout is **15 seconds**, set from measured cost on the largest target (koby, 16 GB `.hermes` tree; full scan = 0.91 s, bounded scan = 0.44 s). The SSH connection timeout is **10 seconds** (separate from the scan timeout). A scan timeout renders as `probe-failed: (timeout after 15s)` — **never** as "unreachable" or "may be down". An SSH connection failure (exit status 255) renders as `unreachable: (ssh connect failed)`. +**Timeout policy (2026-10-02):** The scan timeout is **15 seconds**, set from measured cost on the largest target (koby, 16 GB `.hermes` tree; full scan = 0.451 s, bounded scan = 0.441 s, over SSH, cold cache, measured 2026-10-02). The SSH connection timeout is **10 seconds** (separate from the scan timeout). A scan timeout renders as `probe-failed: (timeout after 15s)` — **never** as "unreachable" or "may be down". An SSH connection failure (exit status 255) renders as `unreachable: (ssh connect failed)`. **Bounded scan (2026-10-02):** Do NOT recurse the entire `/root/.hermes/` tree. Use `--exclude-dir=state-snapshots` to skip dated snapshot directories. Rationale: a superseded config will always carry a superseded key and will report forever with zero signal content (the koby state-snapshot line has repeated on consecutive days). If you deliberately want to include snapshots, say so in the contract and the report. @@ -212,13 +212,15 @@ timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@ \ # ANY output here = WRONG. Must be 'litellm/v1' without /responses suffix. # 2. Check systemd drop-ins for master key leaks (2026-07-05: Tanko had this) +# NOTE: Both greps are inside ONE quoted remote command, separated by ; (not two separate ssh arguments) timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@ \ - "grep -rn 'LITELLM_API_KEY' /root/.config/systemd/user/ 2>/dev/null" \ - "grep -rn 'LITELLM_API_KEY=sk-synthetic-litellm-…' /root/.config/systemd/ 2>/dev/null" + "grep -rn 'LITELLM_API_KEY' /root/.config/systemd/user/ 2>/dev/null; grep -rn 'LITELLM_API_KEY=sk-synthetic-litellm-' /root/.config/systemd/ 2>/dev/null" ; true # 3. Verify running process env matches dedicated key +# NOTE: Single-quoted remote command so $(...) expands on the REMOTE host, not the runner timeout 15 ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no root@ \ - "cat /proc/$(cat /home/jerome/.hermes/gateway.pid | python3 -c \"import sys,json; print(json.load(sys.stdin)['pid'])\")/environ | tr '\0' '\n' | grep LITELLM_API_KEY" + 'cat /proc/$(cat /home/jerome/.hermes/gateway.pid | python3 -c "import sys,json; print(json.load(sys.stdin)['pid'])")/environ | tr "\0" "\n" | grep LITELLM_API_KEY' \ + && echo "step3: PASS" || echo "step3: probe-failed (exit $?; see stderr above)" ``` If any output from step 2 — **critical violation** (master key leaked). Fix immediately.