Skip to content

v0.13.0 — Supply-chain & shared-host hardening

Choose a tag to compare

@lacion lacion released this 15 Jul 20:56
44f2abd

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, Bearer tokens), and the daemon's own bearer token. Free-text secrets can still slip through, so capture stays opt-in and 0600 — 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_CMD is whitespace-split into argv and run via execFile; quotes, pipes, $() and redirection are never interpreted (the default claude poll 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.