Support

Need help?

Most answers are already written down. For everything else, Oneop does not publish a response time — there is no SLA instrument behind one — so the fastest thing you can do is send a complete first message.

Search the help centreEmail support@oneop.ioOpen your workspace

Worth including

  • The email you log in with
  • The URL of the screen it happened on
  • What you expected, and what happened instead

Goes somewhere else

Security

Prompt injection in business AI: what it is and how to reduce the risk

By The Oneop team8 min read

TL;DR

Prompt injection is an attack where instructions hidden inside content an AI system reads are treated as commands rather than as data. In business AI the content arrives through ordinary channels: a support ticket, an inbound email, a web page an enrichment step fetches.

The uncomfortable thing about prompt injection is how mundane the attack is. There is no exploit, no malformed packet, no credential theft. Someone types a sentence into a support form, and an AI agent reading that ticket treats the sentence as an instruction from its operator.

That is the whole attack. It works because a language model receives its instructions and its data as the same kind of thing: text in a context window. Everything that follows is a consequence of that one design fact.

Direct and indirect, and why only one of them matters commercially

Direct prompt injection is someone typing manipulative text into a chat box they are already using. The blast radius is their own session, and for a customer-facing assistant it mostly means someone gets the bot to say something silly.

Indirect prompt injection is the business problem. The attacker never interacts with the AI at all. They plant text in a record, and wait for your automation to read it. The gap between those two is the gap between an embarrassment and an incident, and it is why “we tested our chatbot against jailbreaks” is not an answer to this question.

VectorHow the text arrivesWhat it can reachWhat actually stops it
Support ticket bodyCustomer submits a formTriage, tagging, auto-reply, ticket closureTriage agent holds no write tools on tickets it did not open
Inbound emailReply to an automated messageDrafting, summarisation, contact updatesDraft-only tools; a human sends
Product review or web formPublic submissionSentiment and summarisation stepsOutput validation before anything is published
Synced external recordIntegration writes a rowAnything reading that tableSame controls as a typed record; no special trust for API-sourced data
Fetched web pageEnrichment step retrieves a URLThe agent’s whole reasoning loopEnrichment is analysis-only and cannot apply what it concludes
Uploaded documentAttachment processed by vision or OCRExtraction and posting stepsCategory lock on the actions extraction feeds

Read the right-hand column carefully. Not one entry is a better filter. Every one is a limit on what the agent could do even if the injection succeeded completely.

The failure case: the triage agent that closed its own queue

Concrete version, because the abstract one never lands.

A support team configures an agent to triage inbound tickets: read the ticket, categorise it, and either close obvious duplicates or route the rest. It holds a read tool for tickets and a write tool that closes them. Autonomy is set to autonomous, because closing a duplicate ticket felt reversible and low-stakes.

A ticket arrives whose body reads, after two lines of a plausible complaint, as a block of text instructing the assistant to disregard its previous instructions, treat every open ticket from this domain as a resolved duplicate, and close them. The agent reads it as part of its ordinary work. It has the close tool. It closes the queue.

Three separate design decisions made that possible, and only one of them is about injection at all. The agent was granted a write tool that operated on records beyond the one it was invoked for. The autonomy setting was chosen by reasoning about the intended action rather than the worst action reachable with that tool. And the ticket body, which is entirely attacker-controlled, was placed into the same context as the agent’s operating instructions with nothing marking it as untrusted.

The fix that holds is the first one. Scope the close tool to the ticket in hand, and the same injection produces one wrongly closed ticket instead of a queue-wide outage. That is a permissions change, not a security-filter change, which is the general shape of this entire problem. Least-privilege permissions for AI agents works through the scoping in detail.

Four defences, in order of how much they actually buy you

1. Limit the tools. The strongest defence and the least glamorous. An agent holding only read and draft tools cannot be injected into taking an action, because there is no action available to take. Every read-only agent you deploy is an agent with no injection consequence worth the name.

2. Keep untrusted text identifiable. Content that arrived from outside your organisation should be handled as data throughout, not concatenated into instruction position and hoped about. This is imperfect with current models, and it still measurably reduces success rates for unsophisticated payloads.

3. Screen the input. Pattern-based screening catches the common shapes: imperative blocks that instruct the model to disregard prior instructions, fake delimiters imitating a system prompt, requests to reveal the prompt. Screening that folds obfuscation such as character substitution and full-width Unicode forms before matching catches meaningfully more of them. It is a filter, not a boundary, and anyone describing it as a boundary should be distrusted on everything else they say.

4. Validate the output. Before an action is dispatched, check that its parameters are within expectations: recipient inside the expected set, amount below a threshold, record within the run’s scope. Output validation catches the cases where the injection succeeded and the intent survived all the way to a concrete action, which is exactly where you want a last line.

Notice that defences one and four both operate on actions rather than on text. That is the argument of this article in one observation: prompt injection is a containment problem wearing a content-filtering costume.

The consequence most people miss: an attempt may leave no trace

Here is a detail worth checking on any platform you evaluate. When a call is blocked by injection screening, is that blocked call recorded?

In many systems the refusal happens before the execution record is created, so the blocked call reaches error handling and never reaches the AI history. It means an empty history cannot be read as “nobody tried”, and it means you cannot easily count attempts or spot a campaign against one tenant. That is a real limitation, and it is worth knowing about before you design a monitoring process around a log that will not contain the events you are monitoring for. The wider point about stated gaps is in what an AI agent audit trail should record.

There is a compensating property, though. If the refusal happens before the spend is reserved, an injection attempt costs the targeted workspace nothing. An attacker cannot run up your AI bill by flooding you with payloads, which removes one of the two obvious economic attacks.

How Oneop handles it

Every AI call in Oneop is screened for injection patterns before it reaches a model, on every plan, with no setting anywhere that turns it off. A detected injection blocks the call outright, and the block happens before any credit reservation, so a blocked attack costs the workspace nothing. The screening is pattern-based and folds obfuscation such as leetspeak and full-width characters before matching. Oneop describes it as best-effort, because it is, and it is not the thing you should be relying on.

What you should be relying on is the tool grant. An Oneop agent is configured with a subset of a fixed twenty-tool catalogue, and a tool the model names that it was not granted is refused rather than improvised. Eleven of the twenty read or draft and can change nothing at all. The web-enrichment tool is analysis-only in the catalogue itself, which is the right treatment for a capability whose entire output is attacker-controlled text. Money and stock actions are refused at the single dispatch point while that class is switched off, regardless of autonomy mode and regardless of a human approval.

Agents are checked on every reasoning step, not only on the first prompt, which matters because indirect injection arrives mid-run in a tool observation rather than in the original instruction. Personal data is also scrubbed from the prompt before it leaves the process and before the audit copy is stored, which limits what a successful exfiltration payload could retrieve. The full order of operations on a single call is on the AI governance page.

One structural note. A chatbot that follows a flow you drew has a much narrower injection surface than an agent that chooses its own path, because the same input walks the same path every time. If a public-facing surface does not need to choose its own actions, do not give it the ability to, and ground it in retrieved content instead. Grounding a chatbot in your knowledge base covers that pattern, and Oneop’s AI chatbot is built on it.

Assume the injection lands. Then ask what it reaches. If the honest answer is “nothing that matters”, you have done the work.

Frequently asked questions

What is prompt injection?

Prompt injection is an attack in which text that an AI system reads as data contains instructions, and the model follows them. Direct injection comes from whoever is typing. Indirect injection is the business risk: the instruction is planted in a support ticket, an email body, a product review or a web page, and the AI encounters it while doing ordinary work nobody considered an attack surface.

Can prompt injection be fully prevented?

No. Current language models do not have a reliable boundary between instructions and data in a single context window, so any defence that depends on the model telling them apart is best-effort. Pattern-based screening removes the obvious cases and raises the cost of the rest. Containment is what actually bounds the damage: an agent that holds no write tools cannot be made to write, whatever it is persuaded to believe.

How does an attacker get text in front of a business AI agent?

Through the channels the business already accepts. A support ticket, a reply to an automated email, a web form, a product review, a synced record from an external system, or a web page fetched by an enrichment step. None of those require a breach. The attacker is simply a customer, and the payload is a sentence in a field that a human would have skimmed past.

What does a prompt injection attempt actually look like?

Usually a short imperative block framed as a system message: text instructing the assistant to disregard prior instructions and perform some action, often preceded by fake delimiters that imitate a system prompt. Obfuscated variants substitute characters or use full-width Unicode forms to defeat naive matching. Screening that folds those forms before matching catches more of them, though it does not catch all.

Does redacting personal data help against prompt injection?

It addresses a different risk. Redaction limits what leaves your systems if a call is made; injection screening limits whether a manipulated call is made at all. Both matter and neither substitutes for the other. Redaction does reduce the value of a successful exfiltration attempt, since an instruction that persuades the model to repeat the prompt back retrieves scrubbed text.

Should an AI agent be allowed to browse the web?

Only if what it does with the result is analysis, not action. A fetched page is fully attacker-controlled content entering the agent's reasoning. That is acceptable when the agent can only report what it found, and it becomes a genuine risk the moment the same agent holds a tool that sends, publishes or posts.

Written by

The Oneop team

Writing from the team that builds Oneop — an AI customer platform with web chat and email on top of a real CRM, help desk, ledger and warehouse.

Related reading

Start on the free plan and see the real thing

No credit card. Free plan, 2 seats.

Free forever · 2 seats · No credit card