Skip to main content
Risoluto’s HTTP surface is designed for local, trusted environments by default. This guide covers the controls available when you need to expose it or harden the sandbox.

Hardening Checklist

1

Set a Write Token

When binding to a non-loopback address, always set a write token:
All mutating requests (POST, PUT, PATCH, DELETE) then require:
2

Enable Sandbox Security Defaults

Verify these are enabled (they are by default):
3

Restrict Egress

Lock down outbound network access from worker containers:
4

Enable gVisor (Optional)

For defense-in-depth container isolation:
Requires runsc installed on the Docker host.
5

Back Up the Master Key

The MASTER_KEY protects all encrypted secrets. Store it in a password manager or secrets vault — if lost, all credentials become unrecoverable.

Write Guard

Never bind to 0.0.0.0 without also setting RISOLUTO_WRITE_TOKEN. Without it, anyone on your network can mutate configuration and secrets.
All mutating API requests are protected by a write guard middleware: Read-only methods (GET, HEAD, OPTIONS) are exempt from write guard checks and always allowed from any address. Webhook routes (/webhooks/*) bypass IP/token checks — they use their own HMAC signature verification.

Credential Encryption

Risoluto encrypts all stored credentials using AES-256-GCM with a key derived from MASTER_KEY via SHA-256: The DB-backed store (DbSecretsStore) encrypts each secret individually with its own IV and auth tag, stored as separate rows. Key names are plaintext; values are encrypted.
Worker containers run on the risoluto-internal Docker bridge network by default. The data plane (when using control/data plane split) is not exposed to the host — it only listens on this private network.For additional isolation, use a custom Docker network:
When codex.sandbox.security.dropCapabilities is true (default), worker containers start with --cap-drop=ALL. Combined with noNewPrivileges: true, this ensures containers cannot escalate privileges.The resulting docker run flags:
gVisor (runsc) provides a user-space kernel that intercepts all syscalls from the container, adding a strong isolation boundary between the agent and the host kernel.
This passes --runtime=runsc to Docker. Install gVisor first:
The egressAllowlist restricts which domains worker containers can reach. When the list is non-empty, only listed domains are reachable:
This is enforced via the Codex sandbox policy. An empty list (default) allows all outbound traffic.
For fine-grained syscall filtering, specify a custom seccomp profile:
This passes --security-opt=seccomp=/etc/docker/seccomp-risoluto.json to Docker.

Sandbox Policy Summary

Rate Limiting

All /api/* and /metrics endpoints are rate-limited to 300 requests per 60 seconds per client. Webhook endpoints (/webhooks/linear) have a separate limit of 600 requests per 60 seconds. Exceeding the limit returns HTTP 429 Too Many Requests.

Filesystem Paths

Host-Side

Inside Worker Containers

Directories like ~/.risoluto-codex or ~/.risoluto-codex-home are not created by Risoluto. If found on your host, they are leftover Codex CLI data and can be safely deleted.

Environment Variables

What’s Next

Trust Model

Understand Risoluto’s trust boundaries and threat model.

Custom Sandbox

Build a custom sandbox image with your project’s toolchain.
Last modified on April 3, 2026