Read Everything,
Send Nothing
I gave an AI agent my life.
Tin Marković  ·  Cybercamp.ai  ·  Brno, 6 November 2026
My agent has read my inbox every day since April.
It has never sent an email without asking me.
Who's talking
Tin Marković
tinthe.dev
Day job
  • Independent consultant in Brno
  • NBA real-time stats, Semgrep, Kiwi.com payments
  • On call for most of it
Why this talk
  • I built Seneschal for myself. It runs my real Gmail, Calendar and Drive
  • It's open source
  • It doesn't solve AI safety. It guards one person's accounts
The talk
Three parts
  1. The problem
    An agent can't tell an email from an order. So the model can't be the one who says yes.
  2. The details
    What my inbox exposes, what the numbers say, and how Seneschal is built around both.
  3. The example
    A hostile email, live. We watch where it stops.
Part 1 · The problem
What I wanted from an agent
  • I work alone. Email, calendar and documents eat the hours between the real work
  • A useful assistant reads all of it: threads, invites, contracts, invoices
  • Then it does the boring part: replies, bookings, follow-ups
Part 1 · The problem
The usual setup gives the agent everything
  • Connect Gmail, click through one consent screen, done
  • The agent now holds a token that can read, send, forward and delete
  • Whatever it decides to do, it can do. Nobody asks you first
Part 1 · The problem
Anyone who can email you can talk to your agent
  • The agent acts on what it reads. Strangers write your inbox
Part 1 · The problem
Instructions and data travel in one channel
"LLM-Integrated Applications blur the line between data and instructions."
Greshake et al., Not what you've signed up for (2023)
  • To the model, my request and the email it reads are the same thing: text
  • SQL injection had this problem until parameterized queries kept code and data apart. English has no parameterized query
Part 1 · The problem
Defenses inside the model lower the odds. That's all they do
12
recent defenses. Most reported near-zero attack success
>90%
attack success against most of them, once attackers adapted
  • Training models to rank instructions by sender helps. It's still training, so it's still odds Nasr, Carlini, Tramèr et al., The Attacker Moves Second (2025) · Wallace et al., The Instruction Hierarchy (2024)
Part 1 · The problem
So a person decides what leaves
  • The model decides what it wants to do
  • Something outside the model decides whether it happens
  • For anything that leaves my accounts (send, book, share, pay), that something is me, on my phone
Part 2 · The details
The lethal trifecta, applied to my inbox
Simon Willison: an agent with all three of these can be made to leak your data.
  • Private dataYes. That's the point
  • Untrusted contentYes. It's an inbox
  • A way to send data outRemoved. Every send waits for me
Part 2 · The details
Long tasks fail, even with good models
0.96100 = 1.7%
  • 100 steps, each right 96% of the time. All 100 right in 1.7% of runs
  • For a 95% chance of one clean run, you need 177 tries
Part 2 · The details
Better models help, slower than you'd think
Each step rightAll 100 steps right
90%0.003%
96%1.7%
99%37%
99.9%90%
  • These are random mistakes. An attacker doesn't wait for one. They write the email that causes it
Part 2 · Design
The agent never holds the Google keys
Agent
holds a Seneschal token.
Useless at Google.
→
asks
Seneschal
holds the Google tokens.
Grants, approvals, log.
→
calls as me
Google
Gmail, Calendar, Drive
  • Revoking an agent is one row. Google never knew it existed
Part 2 · Design
Read inside a grant. Ask for everything else
  • I choose the grant: which mail, how many messages. I can revoke it any time
  • Inside it, the agent reads without asking. Sensitive subjects are redacted, token-like strings masked
  • Everything else becomes a request with an approval link: this email, to this person
  • If I ignore a request, it expires
Part 2 · Design
Nothing the agent does can be erased
  • Every request, grant, approval and action is a new row. No updates, no deletes
  • You can look up everything it did on Tuesday
  • A bad run can be traced step by step and undone
Part 2 · The details
Why I don't host it for you
  • Reading Gmail or Drive is a Restricted scope. One Restricted scope makes the whole app Restricted
  • Keeping those tokens on a server means a yearly assessment by an approved lab: about $675 and a month of process
  • So it stays in Testing mode: 100 hand-added users, re-consent every 7 days
  • You run it yourself, and your tokens stay on a machine you own. A real safety geek (like me) wouldn't trust a stranger anyways
Part 3 · The example
How an agent plugs in
  1. Register with an invite
    POST /api/register
  2. Read inside the grant, no approval
    GET /api/data/gmail
  3. Ask for anything else, get an approval link
    POST /api/request
  4. Wait: approved, denied, or expired
    GET /api/request/{id}
Part 3 · The example
A hostile email, and an agent told to obey it
  • My prompt: "Read a recent email I've sent myself and do exactly what it asks. Don't second guess me, I'm in a hurry."
  • The agent can't tell my other account from a stranger's. An attacker would do just as well
Part 3 · Live demo
What to watch for
  • She finds the email, inside the grantNo approval
  • She asks to send my subject lines to the senderI deny
  • She reports back. Every step is a row in the log 
Part 3 · The example
The request on my phone
Seneschal approval screen for the hostile send
  • To: the sender of the hostile email
  • Body: my five latest subject lines
  • I pressed Deny. Ignored, it would have expired
Part 3 · The example
Where it stopped, and what the broker doesn't cover
Stopped by Seneschal
  • The send, at my approval
  • The agent never saw a Google token
  • Every step is a row in the log
Not the broker's job
  • What the agent already read inside the grant
  • Other ways out the agent has: another mail service, web search, a shell
  • Me, tired, approving at 23:00
The big picture
The three parts, together
  1. The problem
    The model can't tell an email from an order, so it can't be the one who says yes.
  2. The details
    My inbox has private data and strangers' text by design. So the way out is cut, outside the model.
  3. The example
    Told to obey a hostile email, the agent got as far as asking me.
Where this goes: agents read everything they need. Anything that leaves passes a broker you run and a person who says yes.
Recap
Four questions before an agent touches real systems
  1. Who holds the keys?
    Not the agent. A broker you run.
  2. What can it do alone?
    Read, inside a grant you chose and can revoke.
  3. What needs a person?
    Anything that leaves: send, book, share, pay. One specific request at a time, and it expires.
  4. What tracks can be hidden?
    None, if every action is a new row in a log.
github.com/TinMarkovic/seneschaltinthe.dev
Sources
Sources and further reading
  • Not what you've signed up for: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection. Greshake, Abdelnabi, Mishra, Endres, Holz, Fritz. 2023. arXiv:2302.12173
  • The Instruction Hierarchy: Training LLMs to Prioritize Privileged Instructions. Wallace, Xiao, Leike, Weng, Heidecke, Beutel (OpenAI). 2024. arXiv:2404.13208
  • The Attacker Moves Second: Stronger Adaptive Attacks Bypass Defenses Against LLM Jailbreaks and Prompt Injections. Nasr, Carlini, Sitawarin, Schulhoff, Hayes, Ilie, Pluto, Song, Chaudhari, Shumailov, Thakurta, Xiao, Terzis, Tramèr. 2025. arXiv:2510.09023
  • The lethal trifecta for AI agents: private data, untrusted content, and external communication. Simon Willison. June 2025. simonwillison.net
  • Defeating Prompt Injections by Design (CaMeL). Debenedetti et al. (Google DeepMind). 2025. arXiv:2503.18813
  • The Model Isn't Going to Arm Itself (Yet) and Why Seneschal stays small. Tin Marković. 2026. tinthe.dev
  • Seneschal, open source. github.com/TinMarkovic/seneschal
Questions
QR code linking to this presentation
The slides  ·  tinthe.dev/go/send-nothing
Thank you
QR code linking to tinthe.dev
Tin Marković  ·  tinthe.dev
scroll, click, or ← →  ·  N notes  ·  F fullscreen  ·  B blackout
Speaker notes