Security
[!WARNING] Fased assumes one trusted operator boundary per Gateway. It is not a hostile multi-tenant boundary for adversarial users sharing the same Gateway, host, credentials, or Agent.Use this page to decide who can reach the Gateway, who can message an Agent, what tools an Agent can use, and what to do if something goes wrong.
Trust Model
Recommended deployment model:- one user or trusted team boundary per Gateway;
- one OS user/host/VPS per trust boundary when possible;
- separate credentials, workspaces, and browser profiles for separate trust boundaries;
- split mixed-trust users into separate Gateways.
Quick Audit
Run this after setup changes and before exposing the Gateway:- Gateway bind/auth exposure;
- DM and group policies;
- broad tool or elevated-tool access;
- browser/node exposure;
- weak local file permissions;
- plugin loading without explicit allowlists;
- risky debug flags;
- sandbox settings that look configured but are not active.
Recommended Baseline
Start private, then widen deliberately:Network Exposure
Gateway auth is required for any non-trivial deployment. Recommended exposure order:gateway.bind: "loopback"with token auth.- Tailscale Serve, a direct tailnet path, or SSH tunnel.
- Trusted reverse proxy with explicit
gateway.trustedProxies. - LAN/custom bind only when intentional, authenticated, and firewalled.
- unauthenticated
0.0.0.0; - public port forwarding to the raw Gateway;
- forwarding Tailscale identity headers from a custom proxy;
- relying on
sessionKeyas an auth boundary.
- set
gateway.trustedProxies; - make the proxy overwrite forwarding headers;
- use token/password or trusted-proxy auth;
- set
gateway.controlUi.allowedOriginswhen browserOrigindiffers from the Gateway origin.
Control UI Auth
The Control UI needs a secure browser context: HTTPS or localhost. Important settings:gateway.auth.mode: "token": shared bearer token.gateway.auth.mode: "password": password auth, preferably from env.gateway.auth.mode: "trusted-proxy": trust an identity-aware proxy.gateway.controlUi.allowInsecureAuth: local compatibility switch only.gateway.controlUi.dangerouslyDisableDeviceAuth: break-glass only.
allowInsecureAuth is not a remote-auth bypass. Remote clients still need the
right Gateway auth/device flow. dangerouslyDisableDeviceAuth is a severe
downgrade and should be temporary.
DM And Group Access
DM policies:| Policy | Meaning |
|---|---|
pairing | Unknown sender gets a pairing code; owner approves. |
allowlist | Only configured/approved senders can message. |
open | Anyone can DM; requires explicit "*" opt-in. |
disabled | Ignore inbound DMs. |
per-account-channel-peer.
Tool Authority
Most incidents come from a reachable Agent being allowed to use tools that are too broad for that audience. High-impact surfaces:exec/process;- filesystem read/write/edit/apply_patch;
- browser control;
gatewayconfig/update calls;cron/task creation from untrusted paths;- session tools that can inspect or message other sessions;
- node commands such as camera, screen, contacts, calendar, SMS, or shell.
Sandboxing
Sandboxing is a tool-execution boundary, not a replacement for channel access control. Options:- run the whole Gateway in Docker;
- run host Gateway with Docker-isolated tools through
agents.defaults.sandbox; - keep
workspaceAccess: "none"or"ro"for agents that do not need write access; - keep
scope: "agent"or"session"for isolation.
exec runs on the Gateway host unless your
tool policy denies it or exec approval blocks it.
Browser And Node Control
Browser control can act through the selected browser profile. If that profile is signed in to services, the Agent may be able to interact with them. Recommended pattern:- use a dedicated browser profile for Fased;
- avoid personal daily-driver profiles;
- keep browser/node hosts on tailnet-only access;
- disable browser proxy routing when not needed;
- pair nodes deliberately and treat node pairing as operator-level access.
Prompt Injection
Prompt injection is not solved by system prompts. Treat untrusted messages, links, files, emails, pages, and attachments as adversarial input. Hard controls matter more than wording:- pairing/allowlists;
- group mention gates;
- minimal tools;
- sandboxing;
- restricted file roots;
- modern instruction-following models for tool-enabled Agents;
- reader/summarizer Agents for untrusted content before passing summaries to a higher-authority Agent.
hooks.mappings[].allowUnsafeExternalContenthooks.gmail.allowUnsafeExternalContent- cron payload field
allowUnsafeExternalContent
Secrets, Logs, And Transcripts
Treat these as private:~/.fased/fased.json~/.fased/credentials/**~/.fased/agents/<agentId>/agent/auth-profiles.json~/.fased/secrets.json~/.fased/agents/<agentId>/sessions/**~/.fased/extensions/**~/.fased/sandboxes/**
- use
700on directories and600on private files; - use full-disk encryption where practical;
- keep
logging.redactSensitiveenabled; - add environment-specific redaction patterns;
- prune old logs/transcripts when no longer needed;
- review diagnostics before sharing.
Plugins And Dynamic Skills
Plugins and dynamic skills are trusted code.- Install from sources you trust.
- Prefer explicit
plugins.allow. - Review plugin config before enabling.
- Pin package versions when installing from registries.
- Restart the Gateway after plugin changes.
- Restrict who can modify skill folders.
Incident Response
If the Agent did something unexpected:- Stop the Gateway or app supervisor.
- Close exposure: return
gateway.bindtoloopbackand disable public access. - Freeze risky channels: use
dmPolicy: "disabled"or stricter allowlists. - Rotate Gateway auth and remote client credentials.
- Rotate provider/channel/model credentials if they may have leaked.
- Review logs, session transcripts, and recent config changes.
- Run
fased security audit --deep.
- timestamp and Fased version;
- OS/host shape;
- redacted transcript and log excerpt;
- exact inbound message/content;
- whether the Gateway was exposed beyond loopback.