v0.13.0 — Supply-chain & shared-host hardening
A supply-chain and shared-host hardening pass, written with scanner triage in mind: the daemon executes no shell anywhere, payload capture actually redacts, and an opt-in mode puts the bearer token in front of loopback too.
Security
- Payload capture actually redacts now. With
FLEETDECK_CAPTURE_PAYLOADS=on, captured hook payloads are scrubbed before they touch disk: values under secret-looking key names, well-known credential shapes (sk-ant-,ghp_/github_pat_,xox?-,AKIA…, JWTs, PEM private-key blocks,Bearertokens), and the daemon's own bearer token. Free-text secrets can still slip through, so capture stays opt-in and0600— the previous "secrets are scrubbed" wording promised more than it did. FLEETDECK_REQUIRE_TOKEN=on— the bearer token even over loopback. Opt-in mode requiring the token on every control/data route even for loopback;/hook/*,/health, and the public board shell stay exempt. Closes the loopback trust zone against other OS users on a shared machine and the residual Host-rewriting reverse-proxy case. The fleet's own hooks/CLI attach the token automatically, so a normal single-user setup is unaffected.- The board shell now ships a Content-Security-Policy, and every response carries
X-Content-Type-Options: nosniff. - Exec-class API routes log who asked (remote address, proxy verdict, unsupervised flag), and the daemon warns at startup when any test-seam env var is live.
Changed
- BREAKING — the agents poller no longer uses a shell.
FLEETDECK_AGENTS_CMDis whitespace-split into argv and run viaexecFile; quotes, pipes,$()and redirection are never interpreted (the defaultclaudepoll is unchanged). An override that leaned on shell features must move into an executable script;false/blank still disables the poller.
Published to npm via OIDC trusted publishing with provenance. Full detail in #9.