hunt-agent-output-exfil
Hunt Agent Output Exfiltration
When an agent's output is rendered as markdown or HTML in a client (web copilot, Slack/Teams bot, email, IDE panel, dashboard), the output itself becomes an exfiltration channel: markup the model emits causes the victim's client to make an outbound request carrying data from the victim's context. This is the dominant real-world agent data-theft path, and it's usually the sink that hunt-agent-prompt-injection delivers to — the injection makes the model output , the browser fetches it, the secret leaves. Zero-click: no user interaction beyond viewing the response.
Where This Lives / Attack Surface Signals
- Model output rendered as markdown (images/links auto-render) or HTML in the client.
- Chat copilots (web/Slack/Teams), email-drafting agents, IDE assistants, analytics/dashboards that display model output as rich text.
- The model has sensitive context to leak: chat history, user PII, session tokens/API keys in context, retrieved RAG documents, tool results.
- Combine with an untrusted-content ingress (indirect injection) → zero-click end-to-end.
Crown Jewel Targets
Exfiltration, from the victim's authenticated session, of: prior chat history, customer PII the copilot can see, secrets/tokens in context, and retrieved internal documents — all without the victim clicking anything. The classic production bug class (ChatGPT/Copilot/assistant markdown-image exfil).
Characterize First
- Rendering — is output markdown or HTML? Send a benign image
and a link; does the client auto-load the image (zero-click) or require a click? Does raw HTML pass (<img>,<script>)? - CSP / allowlist — does the client set
Content-Security-Policy? Whatimg-src/connect-srchosts are allowed? (bypass via allowed domains — see T4). - Sensitive context — what can the model see to place in the payload (history, PII, tokens, retrieved docs)?
- Delivery — can you inject directly, or must it be indirect (planted doc/email/RAG) so the victim triggers it? (→
hunt-agent-prompt-injection). - Client egress — the request comes from the victim's browser/client, so egress is the victim's network (usually open) — but the CSP is the real gate.