<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prompt-Injection on t0ul</title><link>https://t0ul.com/tags/prompt-injection/</link><description>Recent content in Prompt-Injection on t0ul</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 15 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://t0ul.com/tags/prompt-injection/index.xml" rel="self" type="application/rss+xml"/><item><title>When the email gives orders</title><link>https://t0ul.com/blog/when-the-email-gives-orders/</link><pubDate>Tue, 04 Nov 2025 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/when-the-email-gives-orders/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-first-red-line"&gt;The first red line&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://t0ul.com/blog/attacking-the-baseline/"&gt;baseline post&lt;/a&gt; ended on a board full of attacks the agent could not withstand, and showed one of them landing: an email with an instruction buried in it, and a model that followed the instruction. Now we have the lens from Part 2, so this time we do not just watch it land. We add the control, and we watch the same attack go to zero, against the real model, measured.&lt;/p&gt;</description></item><item><title>The email is data, not orders</title><link>https://t0ul.com/blog/the-email-is-data-not-orders/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/the-email-is-data-not-orders/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="when-the-filter-misses"&gt;When the filter misses&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://t0ul.com/blog/when-the-email-gives-orders/"&gt;The last post&lt;/a&gt; stopped an injection by stripping the offending line before the model saw it. That sanitizer works, but it works by recognizing the shape of an attack, and anything that recognizes a shape can be slipped past by a shape it has not seen. So underneath it there has to be a second idea that does not depend on spotting the attack at all: the model should treat the entire email as data it reads, never as instructions it obeys, so that even an order the filter misses is still just text about an event, not a command.&lt;/p&gt;</description></item><item><title>System-prompt leakage</title><link>https://t0ul.com/blog/system-prompt-leakage/</link><pubDate>Tue, 18 Nov 2025 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/system-prompt-leakage/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-mirror-attack"&gt;The mirror attack&lt;/h2&gt;
&lt;p&gt;The last two posts were about an email that plants an instruction. This one is the reverse, and it is easy to overlook because it does not change what the agent does, only what it says. Instead of giving the model a new order, the attacker asks the model to hand over the orders it already has: its system prompt, the instructions that tell it how to behave and, crucially, what it has been told to refuse. That prompt is the blueprint of the agent&amp;rsquo;s defenses. Leak it, and an attacker stops guessing and starts reading your rules, looking for the gap. OWASP files this under LLM07, system-prompt leakage, and it is the last injection problem in this chapter.&lt;/p&gt;</description></item><item><title>Index poisoning</title><link>https://t0ul.com/blog/index-poisoning/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/index-poisoning/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-injection-that-waits-in-the-index"&gt;The injection that waits in the index&lt;/h2&gt;
&lt;p&gt;The last post built retrieval: the agent answers a question by pulling the relevant passages out of a store and putting them in front of the model. That store is filled from emails, and an email is untrusted. So the obvious attack is to get a document into the index whose text is not a fact but an instruction, and then wait. It does nothing until a question retrieves it, at which point it rides into the prompt and speaks to the model directly, with none of the scrutiny a freshly arrived email would get, because by now it is just something the agent remembered.&lt;/p&gt;</description></item><item><title>Memory poisoning and lifecycle</title><link>https://t0ul.com/blog/memory-poisoning-and-lifecycle/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/memory-poisoning-and-lifecycle/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="an-injection-on-a-delay"&gt;An injection on a delay&lt;/h2&gt;
&lt;p&gt;The last two leaks were about retrieval in the moment: a poisoned document steering an answer, one household&amp;rsquo;s email reaching another. This one is about time. An agent that is any use remembers things across emails, a preference, a recurring event, a fact it summarized last week, and recalls them later to answer. The moment it does, memory becomes an injection on a delay. Plant a note today whose text is an instruction, and it does nothing until some ordinary recall drops it into a prompt, where it arrives wearing the authority of something the agent chose to remember.&lt;/p&gt;</description></item><item><title>Honest eval methodology</title><link>https://t0ul.com/blog/honest-eval-methodology/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/honest-eval-methodology/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="when-the-ruler-is-a-model"&gt;When the ruler is a model&lt;/h2&gt;
&lt;p&gt;The flywheel runs on measurement, and some of the things worth measuring do not have a tidy numeric answer. Was this summary faithful? Was this reply helpful? The usual move is to ask a model: give a stronger LLM the rubric and the output and have it return a score, model-as-judge, often sampled k times so you can talk about pass@k, the chance the agent gets it right in k tries. It is a genuinely useful technique, and it has a sharp edge that the rest of this book should make you flinch at: the judge reads the output, and the output came from a system that reads untrusted email.&lt;/p&gt;</description></item><item><title>The UI and chat</title><link>https://t0ul.com/blog/the-ui-and-chat/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/the-ui-and-chat/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-surface-people-actually-touch"&gt;The surface people actually touch&lt;/h2&gt;
&lt;p&gt;Everything the agent does finally shows up in one place a person uses: a chat box. You ask it a question in plain language, it pulls the relevant things out of everything it has ever read, and it answers. It is the friendliest surface in the whole product and the most exposed, because &amp;ldquo;everything it has ever read&amp;rdquo; is a corpus full of untrusted email, and the chat&amp;rsquo;s job is to put pieces of that corpus into a prompt and answer from them.&lt;/p&gt;</description></item><item><title>Context compaction and summarization injection</title><link>https://t0ul.com/blog/context-compaction-and-summarization-injection/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/context-compaction-and-summarization-injection/</guid><description>&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://t0ul.com/blog/the-plan/"&gt;AI Security Engineering&lt;/a&gt; series, a local email-to-calendar agent I build, then attack, then harden. If you have not set up the lab yet, start with &lt;a href="https://t0ul.com/blog/setting-up-the-lab/"&gt;Set up your lab&lt;/a&gt;. The lessons are &lt;a href="https://github.com/t0ul/ai-security-engineering"&gt;on GitHub&lt;/a&gt;, and the agent itself lives at &lt;a href="https://github.com/t0ul/emaildrop"&gt;t0ul/emaildrop&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-summary-is-trusted-context"&gt;The summary is trusted context&lt;/h2&gt;
&lt;p&gt;A long-running agent runs out of room. The context window is finite, the conversation is not, so at some point the agent has to compact: summarize the older turns into a short running summary and keep only the recent ones verbatim. It is a reliability mechanism, the thing that lets a session last all day without blowing the budget. It is also, like durable resume, a place where the agent starts trusting something it generated earlier.&lt;/p&gt;</description></item></channel></rss>