You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+52-2Lines changed: 52 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -205,8 +205,41 @@ flowchart LR
205
205
### Three layers of protection
206
206
207
207
1. **Credential isolation** — your password stays in an isolated cloud browser. The agent gets a pre-authenticated session, never the credentials themselves.
208
-
2. **Scoped boundaries** — the agent can only do what your policy allows. Read inbox? Yes. Delete contacts? Blocked before it starts.
209
-
3. **Audit + kill switch** — every action logged (allowed and blocked). Budget enforced. Instant session destruction when you're done.
208
+
2. **Scoped boundaries** — tasks that don't match your policy are blocked before they start. Deny-first pattern matching with Unicode bypass protection.
209
+
3. **Audit + kill switch** — every action logged (allowed and blocked). Budget enforced. Session destruction when you're done.
210
+
211
+
## Security Model
212
+
213
+
In security terms, leashed is **application-layer authz for AI agents** — it governs what agents are *authorized to do*, not who they are or what credentials they hold. Think of it like an AWS IAM policy that checks what you *request*, not what the underlying service *executes*.
| Browser action validation | Roadmap (v1.0) | AnchorBrowser executes tasks autonomously — leashed has no visibility into actual browser clicks/navigation |
231
+
| URL/domain restrictions | Roadmap (v1.0) | Requires AnchorBrowser session-level allowlists (not yet available in their SDK) |
232
+
| Semantic equivalence | By design | `"forward email"` and `"send email to myself"` are different strings — glob patterns match literally, not semantically |
233
+
234
+
### The honest version
235
+
236
+
The policy engine checks the **task description string** — the human-readable instruction you pass to `leash.task()`. If the string matches a deny pattern, it never reaches the browser. If it's allowed, AnchorBrowser's AI executes it autonomously.
237
+
238
+
This means: a well-intentioned agent that uses descriptive task names gets real governance. A deliberately adversarial agent that lies about what it's doing can bypass pattern matching — just like a developer with an IAM read-only key could name their Lambda "ReadOnlyFunction" while it actually writes to S3.
239
+
240
+
**leashed is a seatbelt, not a cage.** It stops the 95% of accidents that come from misconfiguration, scope creep, and unintended actions. It does not stop a determined attacker with direct API access.
241
+
242
+
For defense-in-depth, see [SECURITY.md](./SECURITY.md).
- URL allowlists at the session level — the browser itself refuses to navigate outside your policy
265
+
- Browser action audit trail — not just task requests, but actual clicks, form fills, and navigation
266
+
- Webhook callbacks for real-time policy violation alerts
267
+
- This is the "IAM enforcement" layer — restrictions enforced by the infrastructure, not just the intent
268
+
269
+
Want to help shape v1.0? [Open an issue](https://github.com/dormstern/leashed/issues) or reach out.
270
+
221
271
## Empowered by AnchorBrowser
222
272
223
273
leashed runs on [AnchorBrowser](https://anchorbrowser.io) — ephemeral, hardened cloud browser sessions purpose-built for AI agents. Each session is isolated, auto-expires, and leaves no trace. [Cloudflare](https://cloudflare.com) verified bot partner. SOC2 Type 2 and ISO27001 certified. Trusted by [Google](https://google.com), [Coinbase](https://coinbase.com), and [Composio](https://composio.dev). Stealth proxies, CAPTCHA solving, anti-fingerprinting, and full session isolation out of the box.
Copy file name to clipboardExpand all lines: SECURITY.md
+26Lines changed: 26 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,3 +31,29 @@ We will acknowledge receipt within 48 hours and aim to release a fix within 7 da
31
31
- Glob pattern matching operates on the literal task string. It cannot detect semantic equivalents (e.g., "forward" vs "send").
32
32
- The audit log is a local file. For tamper-proof logging, export to an immutable store (S3 with object lock, a database, or syslog).
33
33
- The expire timer and kill switch are best-effort — an in-flight AnchorBrowser task may complete after the kill signal.
34
+
35
+
## Trust Model
36
+
37
+
leashed operates at the **intent layer** — it evaluates task description strings before forwarding to AnchorBrowser. It does NOT have visibility into browser-level execution.
0 commit comments