Security model
How Agora authenticates callers, isolates browsers and apps, and what it does not protect against.
Agora controls a real computer with logged-in browser sessions. Treat access to it like SSH access to the host.
Network exposure
- The daemon listens on 127.0.0.1:7788 and refuses to bind to any other interface unless you set
AGORA_ALLOW_PUBLIC=1. Don’t. - For remote access, publish it through an authenticated tunnel (for example Cloudflare Tunnel with Access, or an SSH tunnel). Never open the port to the internet.
- Chromium is controlled with
--remote-debugging-pipe: there is no CDP TCP port. X displays are local to the host and never exposed. - WebRTC needs UDP to the host. Behind HTTP tunnels, viewers use the WebSocket transport instead.
- The embedded dashboard is served with a strict Content Security Policy (
default-src 'self').
Tokens
Every API call needs Authorization: Bearer <token>. Streaming endpoints also accept ?token= because browsers cannot set headers on WebSocket and <img> requests.
| Token | Scope | Where it comes from |
|---|---|---|
| Admin | Everything. | Generated on first start in admin.token (mode 0600). agora token prints it. |
| Cursor | Its own workspace and its own descendants, limited by its permissions. | Returned once by POST /v1/cursors. Agora stores only a hash. |
| Viewer | Streaming one workspace, with or without input, for at most 24 hours. Rejected on every other endpoint. | POST /v1/viewer-tokens or agora open. HMAC-signed with viewer.key. |
Give agents cursor tokens, never the admin token. Permissions only narrow down the tree: a child can never get a permission its parent lacks, and only cursors with workspace can create workspaces, freeze, suspend, fork or take control.
Process isolation
- When the daemon runs as root, apps and browsers run as the unprivileged
agorauser (home/var/lib/agora-apps), with no access to root’s files. - Chrome’s sandbox stays on.
- Each workspace has its own processes, display and (by default) browser profile. Processes start inside a per-workspace cgroup when cgroups v2 is available, which enforces
memory_mbandcpu_percentbudgets. - Request bodies are capped at 8 MB.
What Agora does not isolate
Isolation between cursors in the same workspace is logical: tab owners, surface locks and token scopes. They share one display, one browser profile and one Unix user. A cursor with browser permission can read any page in that profile.
For agents you do not trust:
- Put them in separate workspaces (separate processes, display and profile), and do not give them the
workspacepermission. - Use a dedicated profile without your personal logins.
- Keep
processanddesktopoff unless the task needs them:processlaunches programs as theagorauser.
Agora does not checkpoint memory: a suspended workspace keeps cookies and storage on disk in its profile, not open page state.
Reporting a vulnerability
Email security@olimpia.dev with the details. Please do not open a public issue for security reports.