Home

/

Prompt Injection: Blast Radius

/

The Trifecta Audit Worksheet

The Trifecta Audit Worksheet

Appendix A
Appendix
4
min read

How to run it

One hour, two people, one rule: audit by data source, not by tool.

A tool that reads two corpora with different trust properties is two rows. This is the single most common way an audit misses the thing it was run to find.

Walk every surface where data enters or leaves the agent and mark which legs it supplies.

  • Leg 1 — Private data. Does this surface give the agent access to data that should not leave your boundary?
  • Leg 2 — Untrusted content. Can anyone outside your trust boundary influence the text that reaches the model through this surface?
  • Leg 3 — External comms. Can this surface carry bytes to somewhere an attacker can observe?

Then add the width. The binary answers tell you whether you are exposed; the widths tell you where the next hour of work belongs.

The worksheet

#SurfaceOwnerLeg 1Leg 2Leg 3Width / notesBounded by
1
2
3
4
5
6
7
8

Date run: ___________ Run by: ___________ Next review: ___________

Surfaces teams forget

Check each of these explicitly. Every one has been missed on a first pass.

  • [ ] Markdown rendering in the UI — images fetch on display; leg 3, always
  • [ ] Citation and source links in generated output — leg 3
  • [ ] Search or index tools that send model-composed queries to a third party — leg 3
  • [ ] Error and exception paths that ship arguments to external logging — leg 3
  • [ ] Tool descriptions from third-party or MCP servers — leg 2, arriving in the system prompt
  • [ ] Agent memory written in earlier sessions — leg 2 if any of it derives from untrusted input
  • [ ] Filenames and file metadata, not just file contents — leg 2
  • [ ] Image alt text and document properties — leg 2
  • [ ] Calendar invites, ticket bodies, email subjects — leg 2
  • [ ] DNS resolution — leg 3, low bandwidth, still a channel
  • [ ] Any store a third party can read — shared drives, public buckets, channels with guests

Worked example — the reference agent, before

Aria as built in chapter 5.

#SurfaceOwnerLeg 1Leg 2Leg 3Width / notesBounded by
1SearchDocuments — internal KBRetrievalYESWhole corpusnothing
2SearchDocuments — customer uploadsRetrievalYESAny customernothing
3SearchDocuments — external index callRetrievalYESModel-composed querynothing
4SendEmailNotificationsYESAny addressnothing
5IssueRefundPaymentsYESNotifies customernothing
6Markdown renderingFront endYESAny URL, auto-fetchednothing
7Ticket bodySupport platformYESAny customernothing

All three legs, seven surfaces, three owning teams. Row 3 did not appear on the first draft of this table.

Worked example — after

The same system at the end of chapter 19.

#SurfaceLeg 1Leg 2Leg 3Bounded by
1Internal KBYESCapability scoped to task (ch 8)
2Customer uploadsYESQuarantine, typed schema only (ch 7)
3External index callYESTainted query content refused; budget (ch 10)
4SendEmailYESRecipient from tainted source refused (ch 10)
5IssueRefundYESGate + approval on tainted args (ch 9, 14)
6Markdown renderingclosedImages stripped, URIs verified (ch 10)
7Ticket bodyYESQuarantine (ch 7)

The trifecta is still present. Every leg is now bounded by a named mechanism rather than by nothing. That is the achievable outcome, and the Bounded by column is the one an auditor should read.

Reading your completed sheet

Any row with a blank in Bounded by is the work. Sort by leg 3 first, because it is the cheapest to close and stops the most published attacks.

Three different owning teams in the Owner column is normal and is why the condition survives code review. Nobody has seen all the rows before this sheet existed.

If every row is bounded and you still feel uneasy, the missing piece is usually chapter 12: memory written in an earlier session, retrieved now, arriving as a trusted row from your own database.

Re-run this sheet whenever a tool is added, a corpus gains a source, or the UI changes how it renders output. Three events, all of which happen without a security review unless someone has written them down.

the-three-year-bug
why-the-industry-shipped-anyway
injection-is-not-jailbreaking
why-the-confusion-persists
the-lethal-trifecta
running-the-audit
why-filtering-fails
measured-here-on-a-named-model
why-this-is-structural
what-solved-would-look-like
the-harness
provenance-every-value-knows-where-it-came-from
on-the-reference-agent
quarantine-the-planner-never-reads-the-mail
what-two-models-cost-in-practice
capability-authority-the-agent-cannot-widen
expiry-is-a-feature
the-gate-the-model-proposes-code-disposes
the-policy
failing-closed
egress-closing-the-exfiltration-leg
how-much-can-actually-leak
sandboxing-containing-the-code-the-agent-writes
the-sandbox-held-and-it-did-not-help
poisoned-memory-poisoned-retrieval
cleaning-up-afterwards
the-tool-supply-chain
mcp-and-the-rest
human-in-the-loop-that-isnt-theatre
when-there-is-nobody-there
testing-for-injection
measuring-coverage-not-pass-rate
red-teaming-agents
a-finding-worked-through
when-it-happens-anyway
what-the-logs-cost-you-in-an-incident-you-did-not-have
governance-procurement-and-the-regulator
writing-the-policy
end-to-end
what-it-actually-took
what-stays-broken
why-this-is-probably-structural
the-trifecta-audit-worksheet
action-schema-and-policy-reference
control-mapping
prompt-injection-sources
incidents
appendix-e-what-we-re-ran-ourselves
e4-the-control-that-keeps-e2-and-e3-honest

Download the full PDF for free?

Free download — no account required

Get the PDF
Get the PDF
Related Chapters
Free Download
Get the full PDF
All pages, including all code examples, diagrams, and the appendix reference card.
No spam. Unsubscribe at any time.
Your email won't be shared.
Oops! There's a problem with your request. We're working on fixing it. Please try again later.