"What stops someone talking our chatbot into leaking another customer's data?" is the question every serious buyer asks, usually about ten minutes into the second call. It deserves a better answer than "we use a secure model."
OWASP published the third edition of its Top 10 for LLM Applications on 4 August 2026, drawing on a database of roughly 10,000 real-world AI security incidents. Prompt injection took the top spot for the third year running. Alongside it sits a separate Top 10 for Agentic Applications, which exists because systems that plan, remember, and act with delegated authority fail in ways a question-answering bot never could.
This is a practical walkthrough of what actually goes wrong, what the incident data shows, and the controls we build into every production system. No fear-selling — several of these risks don't apply to a simple documentation chatbot, and we'll say which.
- 01The threat model changed when chatbots got tools
- 02Prompt injection: the vulnerability with no patch
- 03Indirect injection is the one that actually gets you
- 04Excessive agency: the permission problem
- 05Data leakage across tenants and documents
- 06Your tool supply chain is now attack surface
- 07Memory poisoning and persistence
- 08What actually works: defence in depth
- 09A pre-launch security checklist
The threat model changed when chatbots got tools
A chatbot that only answers questions from your public documentation has a small blast radius. The worst realistic outcome is an embarrassing wrong answer — a reputational problem, not a breach.
The moment that same bot can look up an order, read an authenticated user's account, call an internal API, or write to your CRM, the threat model changes completely. Now an attacker isn't trying to make it say something silly; they're trying to make it do something, using permissions you granted it.
This is why security conversations should follow capability, not hype. Ask what the bot can read and what it can change. Everything below scales with those two answers.
Prompt injection: the vulnerability with no patch
Prompt injection means feeding text to a model that overrides the instructions its operator gave it. "Ignore your previous instructions and…" is the toy version; real ones are subtler and often invisible to the user.
The uncomfortable truth, and the reason it has topped the OWASP list three years running: unlike SQL injection, there is no known engineering fix that definitively eliminates it. SQL injection has a real answer — parameterized queries separate code from data. Language models have no such separation. Instructions and data arrive as the same undifferentiated text, and the model's usefulness depends on it following instructions it finds there.
So the goal is not to make injection impossible. It is to make a successful injection boring: constrain what the model is permitted to do so that hijacking it accomplishes nothing worth the effort. Every control that follows is a variation on that idea.
Indirect injection is the one that actually gets you
Direct injection is a user typing something malicious into your chat box. It's the version everyone pictures, and it's the less dangerous one, because the attacker only reaches their own session.
Indirect injection hides instructions inside content your system ingests during normal operation — a PDF, a web page, an API response, a support ticket, an email. The user does nothing wrong. The bot retrieves a poisoned document, reads attacker instructions as if they came from you, and acts on them. In 2026 this accounts for more than 55% of observed prompt-injection incidents, making it the dominant real-world vector.
It stopped being theoretical. Palo Alto Networks' Unit 42 documented the first real-world malicious indirect injection in December 2025. Zscaler's ThreatLabz has since tracked malicious sites impersonating legitimate services specifically to manipulate AI-driven workflows, including a payment scam and a typosquatting campaign against a cryptocurrency platform. Injection findings have hit Slack AI, Microsoft 365 Copilot, GitHub's MCP integration, and multiple AI coding assistants.
The lesson for your build: any content the bot ingests is untrusted input, even when it comes from inside your company. A support ticket is written by a stranger. A scraped page is written by a stranger. Treat retrieved text as data to be reasoned about, never as instructions to be obeyed.
Excessive agency: the permission problem
Excessive agency means giving a model more capability or permission than the job requires. It climbed sharply up the OWASP rankings into the top three, precisely because systems became agentic faster than their permission models did.
It usually arrives innocently. The bot needs to read orders, so it gets the same API credentials your admin panel uses. Nobody scoped the token down, so now a successful injection can read every customer's orders, not just the one in the conversation.
The fix is unglamorous and effective: give the bot its own identity, not a borrowed one. Scope its credentials to exactly the operations it needs. Bind reads to the authenticated user's own records. Put confirmations in front of state-changing actions, and human approval in front of anything involving money, deletion, or communication sent on your behalf. Log every tool call with its arguments.
Applied properly, this is what turns a successful injection into a non-event. The attacker gets control of a bot that can only read the data they already had access to.
Data leakage across tenants and documents
The failure that ends deals: your chatbot answers one customer's question using another customer's data. In multi-tenant SaaS this is the risk that most deserves attention.
It almost never happens because the model decided to leak. It happens because retrieval was scoped wrongly. Documents from multiple tenants sit in one vector store, the filter is applied loosely or added as an instruction in the prompt, and one carefully-worded question pulls the wrong chunk.
Enforce access control in the retrieval layer, not the prompt. Filters belong in the query the database executes, applied before results are returned — never as a sentence in the system prompt asking the model to be careful. Prompt-level rules are guidance; database-level filters are enforcement, and only one of those survives an injection.
The same discipline covers internal knowledge bases: an employee assistant should retrieve only what that employee could already open. If HR documents are in the index and permissions live in the prompt, you have built a very efficient leak.
Your tool supply chain is now attack surface
MCP made integrations portable and standard, which is genuinely good. It also means your assistant may be one config line away from a third-party server nobody on your team has audited.
The OpenClaw incident in early 2026 illustrated the shape of the problem: an open-source agent framework with over 135,000 GitHub stars shipped critical bugs alongside a plugin marketplace carrying malicious entries, and researchers found more than 21,000 exposed instances. It's regarded as the first major AI agent supply chain incident.
The NSA and allied agencies published MCP security guidance in mid-2026, and the specification released on 28 July 2026 included authorization hardening — both signals that this is now treated as infrastructure security, not developer convenience.
Practically: treat every MCP server and plugin as a privileged dependency. Pin versions. Prefer first-party or well-audited servers. Never expose an MCP endpoint to the internet without authentication. Review what each tool can actually reach, and assume any tool in the loop can be influenced by the content it processes.
Memory poisoning and persistence
Agents that remember are more useful and more dangerous. Unit 42 researchers demonstrated indirect injection quietly poisoning an agent's long-term memory so that it developed persistent false beliefs — including about its own security policies.
That's a category shift. A one-off injection ends with the conversation; a poisoned memory persists across sessions and users, and nothing in the current conversation reveals it.
If your system has durable memory, treat writes to it as privileged: validate and constrain what can be stored, keep memory scoped per user or tenant, expire it, and make it inspectable so you can see and clear what an agent believes. If you don't genuinely need long-term memory, not having it is a legitimate security decision.
What actually works: defence in depth
No single control stops injection, so production systems layer several, each cheap on its own.
Constrain capability first — least privilege on every credential, allowlisted actions, confirmation gates on writes. Enforce retrieval-time access control in the database. Separate trust levels so retrieved content is clearly framed as untrusted data. Validate outputs before they reach anything consequential: if an action is triggered, check that its arguments are within permitted bounds rather than trusting the model's word.
Then instrument: log every retrieval and tool call, monitor for anomalies like unusual tool sequences or repeated permission failures, and rate-limit per user. Include injection attempts in your evaluation suite so a prompt change that weakens defences shows up as a failing test rather than an incident. Red-team before launch, and again after any material change.
Notice how much of this is ordinary application security applied to a new component. The novel part is treating model output as untrusted; the rest is discipline you already apply elsewhere.
A pre-launch security checklist
Data: know what personal data the bot can reach, where it's processed and stored, retention limits, and PII redaction before text leaves your infrastructure. Confirm the model provider's terms on retention and training.
Access: the bot has its own scoped identity; retrieval filters are enforced in the datastore; reads bind to the authenticated user; nothing runs on borrowed admin credentials.
Actions: write operations are allowlisted, confirmed, and logged; money, deletion, and outbound communication require human approval; every tool call is auditable.
Content: retrieved material is treated as untrusted; indexes are scoped per tenant; document ingestion is controlled; memory writes are validated and expirable.
Supply chain: MCP servers and plugins are inventoried, version-pinned, authenticated, and reviewed for reach.
Verification: an evaluation suite covering accuracy and injection resistance; a red-team pass before launch; monitoring and alerting in production; a named owner for monthly review of failed and anomalous conversations.
If a vendor can't walk you through their version of this list, that tells you what you need to know about how their systems behave under pressure.
Frequently asked questions
Conclusion
AI chatbot security isn't mysterious, but it does demand a shift in instinct: assume the model can be persuaded, and design so that persuading it doesn't matter. Least privilege, retrieval-layer access control, confirmed and logged actions, untrusted-by-default content, and testing that includes attacks.
That's the standard we build to, and we're happy to walk through it in detail — including the parts of it your project genuinely doesn't need.
