Security Model
FERAL assumes the LLM is untrusted. Credentials, tool execution, and autonomy are all gated through layered security primitives that prevent prompt injection from escalating into real-world damage.BlindVault
The BlindVault stores all secrets (API keys, OAuth tokens, database passwords) encrypted at rest in~/.feral/credentials.json (mode 0600). The LLM never sees raw credential values — the vault injects them at the HTTP layer right before a request leaves the process.
[CREDENTIAL:weather_api] in tool descriptions. Even if the model tries to exfiltrate it, the raw value is never in its context window.
Vault CLI
Permission Tiers
Every tool is tagged with a PermissionTier that determines what approval is needed before execution.| Tier | Auto-execute? | Examples |
|---|---|---|
passive | Always | Read memory, search web, get weather |
active | In hybrid/loose | Send a message, create a file |
privileged | Only in loose | Run shell command, install package |
dangerous | Never auto | Delete files, send money, modify system config |
ExecutionSandbox
Tools taggedprivileged or above run inside an ExecutionSandbox that constrains what the subprocess can do.
seccomp on Linux, sandbox-exec on macOS) plus a process timeout. WASM skills get Wasmtime’s capability-based sandbox automatically.
Autonomy Levels
FERAL supports three autonomy modes that control how the PermissionTier system gates execution. See the Autonomy Levels guide for full details.| Mode | Behavior |
|---|---|
strict | Every tool call requires user approval |
hybrid | passive + active auto-execute; privileged + dangerous ask first |
loose | Everything except dangerous auto-executes |
SandboxPolicy Files
For fine-grained control, drop a YAML or JSON policy file in~/.feral/policies/:
Dangerous-Tool Deny Lists
Even inloose mode, certain tools are always gated. The dangerous_tools surface deny list is hard-coded and cannot be overridden by policy files:
enforce_safety
Theenforce_safety() function runs before every tool execution. It checks:
- The tool’s PermissionTier against the current autonomy level.
- Whether the tool is on the deny list.
- Whether a SandboxPolicy restricts the action.
- Whether a standing approval exists (see Autonomy Levels).
