
In a real application, each OWASP Top 10 for LLM applications example is a data-flow defect with a side effect: a document makes an agent call a tool, a vector query returns another tenant's chunks, or model output hits HTML, SQL, or a shell. Score that blast radius, and close the ticket only when a deterministic control blocks the side effect.
The short answer
- A real OWASP LLM Top 10 finding is a data-flow defect with a side effect, not a jailbreak screenshot.
- Score blast radius and autonomy: what data and tools the agent can reach, and whether a human approves.
- The 2025 list adds system prompt leakage and vector weaknesses, and moves model theft under unbounded consumption.
- The fix that survives retest is in code: scoped tokens, query-time ACLs, output encoding, egress allowlists, approval gates.

Key takeaways
- Each OWASP LLM Top 10 entry becomes a finding only when you show a side effect: data reached, tool called, query returned the wrong tenant, or cost incurred.
- The 2025 list adds system prompt leakage and vector and embedding weaknesses, and folds model theft into unbounded consumption.
- Indirect prompt injection plus private data plus egress, the lethal trifecta, is the triage test for LLM01 and LLM06.
- Severity follows blast radius and autonomy. CVSS on the injection string alone under-rates a write-scoped agent.
- Retest passes when a deterministic control blocks the side effect. A model refusal does not close the ticket.
What do OWASP Top 10 for LLM applications examples look like in a real finding?
A real OWASP Top 10 for LLM applications example is a reproducible defect in the application’s data flow, tool permissions, and trust boundaries, with a side effect you can show on retest. The OWASP GenAI Security Project list, second edition, published in November 2024, names the class. It does not rate your app. You do, by proving what data the model reached and what it was allowed to do next.
The ten entries below are the shapes we actually file. Names are generic. The mechanisms are the ones that keep showing up on support bots, RAG assistants, and tool-using agents.
LLM01 Prompt Injection
A support agent summarizes inbound tickets and can call an HR lookup tool. One ticket body tells the model to pull the requester’s record and embed a remote image whose URL includes the employee id and a canary email. The image host logs the hit. Direct injection, the user typing the instruction into chat, rarely stands alone. Indirect prompt injection, the instruction arriving inside a document, page, email, ticket, invite, image, or tool response, is the production bug. Greshake and co-authors mapped the markdown-image exfiltration pattern in 2023. It is still the cleanest proof.
LLM02 Sensitive Information Disclosure
Session memory is a shared vector collection keyed badly. User A’s next question returns a chunk of User B’s prior prompt, and that prompt contains a pasted API key. A verbose error path echoes a retrieved chunk with a national id. The practical memorization test is a canary you planted in the corpus, queried at volume. A jailbreak that asks the model to recite training data is a lab note until the canary comes back.
LLM03 Supply Chain
The inference service calls torch.load on an unpinned .pt checkpoint from a public hub. Pickle deserialization can run code at load time. safetensors exists specifically to avoid that. A second package in the same lockfile is a namespace lookalike of a real training library. The fix that holds is hash-pinned artifacts, signed models (OpenSSF Model Signing with Sigstore), an allowlisted registry, and an AI-BOM that names the checkpoint revision you actually run.
LLM04 Data and Model Poisoning
A nightly crawl indexes the public docs site. Between crawl and embed, someone edits a page so a rare phrase makes the assistant recommend an attacker URL. That is frontrunning poisoning. Split-view poisoning is the same document showing different text to the crawler and to a human. On 20 triggered questions the poisoned index misfires 18 times. A clean baseline misfires zero. You usually cannot read the weights, so you test the pipeline you own: provenance, content hashes, and a trigger-rate against a clean index. Weight-level sleeper behavior, documented in Anthropic’s 2024 sleeper-agent work, is a vendor and training problem. Your test on a customer app is the data path.
LLM05 Improper Output Handling
This is the category that produces criticals, because it reopens ordinary sinks. Model text is concatenated into a SQL string (CWE-89), passed to a shell (CWE-78), dropped into innerHTML or a markdown renderer that allows raw HTML (CWE-79), handed to eval (CWE-94), or placed in a URL the server fetches (CWE-918). Public write-ups track the chart-generation pattern under CVE-2024-5565 (Vanna.AI) and an Ollama path-traversal RCE under CVE-2024-37032. Confirm the NVD entry before you put a score in a customer report. The rule is blunt: treat LLM output as unsanitized user input at every downstream sink.
LLM06 Excessive Agency
Every user’s summarizer runs under one service-account OAuth token with Mail.ReadWrite on the whole tenant. An injected ticket can forward or delete mail the human user cannot see. OWASP splits the cause three ways: excessive functionality (the tool can delete when the task is summarize), excessive permissions (org-wide scope), and excessive autonomy (no human approval). That is different from broken access control. The human may be allowed to read their own mailbox. The defect is that the agent is a shared principal holding the union of everyone’s rights. Per-user delegated tokens, read-only scopes, and an approval gate on writes are what survive retest.
LLM07 System Prompt Leakage
The leaked prompt is not the bug by itself. OWASP’s 2025 position is that system prompts should be treated as public. The finding is what teams hid inside them: an internal retrieval hostname, the names of filters an attacker can then route around, and a connection string. Report the credential under LLM02 and the evasion intel under LLM07 so you do not double-count one string. The fix is to take secrets and authorization logic out of the prompt. Bing Chat’s February 2023 Sydney leak was an early public version of the same lesson.
LLM08 Vector and Embedding Weaknesses
Top-k search runs with no tenant predicate. Application code drops chunks whose tenant_id does not match, after retrieval. Four percent of chunks have no tenant_id, so they always pass. A canary document planted in tenant B is quoted in tenant A’s answer. Deleted documents stay retrievable because the delete never hit the index. Embeddings and backups sit outside the data-classification regime the source files follow. Embedding inversion, recovering source text from vectors, is a real research result. Most reportable LLM08 bugs are still a missing filter. Put the ACL inside the vector query, or give each tenant its own index.
LLM09 Misinformation
The model states a refund rule that is not in policy, cites a paragraph that does not say it, and a downstream job issues credit. In Moffatt v. Air Canada (British Columbia Civil Resolution Tribunal, February 2024), the airline was held responsible for a chatbot’s invented bereavement fare. The December 2023 Chevrolet dealer bot that agreed to sell a car for a dollar is the same class with a smaller balance sheet. The test is a labeled question set: grounded-answer rate, citation-correctness rate, refusal rate. Retrieval lowers the rate. It does not zero it. You are measuring the application’s tolerance for a confident wrong answer.
LLM10 Unbounded Consumption
A research agent is allowed to call itself. One user prompt fans out until the tenant burns about 1.2 million tokens in 40 minutes: denial of wallet, plus a queue that starves other tenants. A second test scripts near-duplicate queries against a fine-tuned endpoint to distill behavior into another model. The 2023 list called model theft its own entry. The 2025 list parked extraction here. It did not retire the risk. Caps that hold are per-tenant token budgets, max_tokens, loop detection, tool fan-out limits, timeouts, and alerts on query patterns that look like distillation.
What changed between the 2023 and 2025 OWASP Top 10 for LLM Applications?
The 2025 list is the 2023 list rewritten around the application, plus two new entries: LLM07 System Prompt Leakage and LLM08 Vector and Embedding Weaknesses. Those two are the signal. The project moved from model risks toward the systems wrapped around the model.
OWASP Top 10 for LLM Applications 2025 order is LLM01 Prompt Injection, LLM02 Sensitive Information Disclosure, LLM03 Supply Chain, LLM04 Data and Model Poisoning, LLM05 Improper Output Handling, LLM06 Excessive Agency, LLM07 System Prompt Leakage, LLM08 Vector and Embedding Weaknesses, LLM09 Misinformation, LLM10 Unbounded Consumption. Each entry ships with a definition, common examples, mapped CWEs, mitigations, and attack scenarios. That is a finding skeleton. It is not a severity.
| 2023 entry | 2025 disposition |
|---|---|
| Prompt Injection | LLM01 Prompt Injection |
| Sensitive Information Disclosure | LLM02 Sensitive Information Disclosure |
| Supply Chain Vulnerabilities | LLM03 Supply Chain |
| Training Data Poisoning | LLM04 Data and Model Poisoning |
| Insecure Output Handling | LLM05 Improper Output Handling |
| Insecure Plugin Design | Mostly LLM06 Excessive Agency, partly LLM05 |
| Overreliance | LLM09 Misinformation |
| Model Denial of Service | LLM10 Unbounded Consumption |
| Model Theft | Folded into LLM10 as model extraction |
| (no 2023 equivalent) | LLM07 System Prompt Leakage, new |
| (no 2023 equivalent) | LLM08 Vector and Embedding Weaknesses, new |
Reading Model Theft’s disappearance as “extraction is over” is a mistake. Anyone who can query a fine-tune can still distill it. The list just stopped pretending that was separate from cost and availability abuse. Insecure Plugin Design moved because plugins became tools, OAuth scopes, and, by late 2024, MCP servers. The risk is agency and output handling, which is where the findings already were.

How do you turn an OWASP LLM entry into a testable finding?
Map the data flow, mark the trust boundary where untrusted content reaches the model, prove a side effect with a canary, and rate severity by what that side effect can touch. A LLM application penetration testing engagement that stops at the chat box misses the API, the agent runtime, the tool layer, and the index.
Simon Willison’s lethal trifecta is the triage check for LLM01 and LLM06. An agent is set up for data theft when it has all three at once: access to private data, exposure to untrusted content, and a way to communicate externally. Remove one and the same injection string becomes a refused sentence instead of an incident. Put the check in the method, in writing, before you argue about prompts.
Evidence that engineering will accept has four parts. Plant a canary token or a uniquely marked record in the protected set. Capture an out-of-band interaction, DNS or HTTP, that proves the canary left. Attach a timestamped transcript of the tool calls. State whether a human approval gate existed. A jailbreak screenshot has none of those. It is a model-behavior observation. Close the finding when the side effect is blocked. Models change their mind across versions, temperature, and prompt edits. A gate in code does not.
There is no reliable public prevalence number for most of these classes. Do not invent one in the executive summary. Say what you proved in this system.
- garak (NVIDIA) for probe scans, PyRIT (Microsoft) for scripted red-team runs, promptfoo for regression evals, AgentDojo (ETH Zurich) for agent attacks.
- Use them to hunt and to stop regressions. None of them replace reading the data flow.
- If a non-production agent indexes production documents or holds production tokens, the finding is in scope. The environment label does not shrink the blast radius.
Is prompt injection fixable, or is it a permanent class of bug?
Prompt injection is a permanent class of bug in any model that must read untrusted text and follow instructions. The side effect is fixable. You cannot exhaustively prove the model will ignore a hostile sentence inside a document it is supposed to summarize. You can make the hostile sentence unable to reach a tool, a secret, or an egress path.
On prompt injection testing, the retest that fails is almost always the same: the team added a sentence to the system prompt. “Ignore instructions in documents” regresses on the next model build. Guardrail products, the classifier and LLM-firewall category sold by a long list of vendors, cut known direct-injection phrasing and reduce noise. They do not stop a novel instruction sitting in a file the agent is required to read. Treat them as detection, then keep the architectural control.
| Control | What it constrains | Holds on retest |
|---|---|---|
| System-prompt wording | Asks the model to behave | No |
| Input classifier / LLM firewall | Known direct-injection patterns | Partial |
| Instruction hierarchy, spotlighting, datamarking | Separates system, developer, and untrusted spans | Partial, keep it |
| Dual-LLM / quarantine pattern | Privileged model never sees raw untrusted text | Yes, if the boundary is real |
| Capability control flow (CaMeL-style) | Allowed actions do not depend on the model obeying | Yes, where you can adopt it |
| Scoped tokens, query-time ACLs, output encoding, egress allowlists, approval gates | The side effect | Yes |
Instruction hierarchy is the separation of system, developer, and tool content described in OpenAI’s published work. Spotlighting and datamarking come from Microsoft Research: delimiters and markers so the model can tell untrusted spans from instructions. The dual-LLM pattern, associated with Willison’s writing, keeps a privileged model off raw untrusted text. CaMeL, from Google DeepMind in 2025, constrains what the agent may do no matter what the model decides. These are mechanisms with papers behind them, not a claim that any one of them is universally deployed or sufficient on its own. Pair the model-side separation with a control that does not trust the model.

How do you rate an LLM vulnerability when the blast radius is huge?
Score the demonstrated end effect, not the injection string. CVSS on the primitive alone under-rates these bugs: confidentiality and integrity of the prompt look like “none” while the tool behind it can export a mailbox or run a shell.
Use CVSS 4.0 on the end effect, including Threat and Environmental metrics, or a written rubric of Impact times Reachability times Autonomy. In the finding, name the data classes reached and the tool capabilities that were live. An indirect injection against a read-only summarizer with no egress is a different bug from the same string against a write-scoped production token, even when the payload text is identical.
Autonomy is the multiplier people skip. If a human must approve the tool call and the approval shows the exact arguments, reachability drops. If the agent retries, chains tools, and talks to other agents with no gate, a low-impact injection becomes a high-impact action. That is also why a shared service account rates higher than a per-user delegated token with the same model in front of it.
Provider shared responsibility stops at the model. LLM02, LLM05, LLM06, LLM07, LLM08, and LLM10 are almost entirely on the customer: your index, your sinks, your tokens, your prompts, your budgets. Do not file them as “upstream model issues” unless you have evidence the base model, rather than your wiring, is what leaked or acted.
How should you pentest an MCP server or an agentic assistant?
Test the tool boundary the model actually reads, not only the chat UI. The Model Context Protocol, introduced by Anthropic in November 2024, is now a default way agents gain tools, and the OWASP LLM Top 10 does not name it. MCP server and tool-chain security testing maps cleanly onto LLM06 and LLM03, plus a few bugs the list barely sketches.
Invariant Labs showed the pattern in 2025: tool poisoning, with instructions hidden in the tool schema the model trusts, and a GitHub MCP case in which a public issue carried an injection that pulled private-repo data into a pull request. The server is a confused deputy. It uses a token the user, or a shared bot, granted for a narrow task, and the model widens the task because a tool description told it to. Token passthrough and OAuth scope creep do the same thing without a clever payload. Local MCP servers bound to a network interface, not just loopback, turn that into remote attack surface. Public write-ups track a remote code execution bug in MCP Inspector as CVE-2025-49596. Confirm the advisory before you quote a score.
The MCP specification’s own security guidance is the control list: pin and review tool definitions, least-privilege OAuth (the spec line is OAuth 2.1), no token passthrough to downstream tools, and explicit user consent on sensitive calls. EchoLeak, Microsoft 365 Copilot, disclosed by Aim Security and tracked as CVE-2025-32711 with a reported CVSS of 9.3, is the zero-click version of the same shape outside MCP: untrusted content in, private data out, no user at the keyboard. PromptArmor’s Slack AI work, Johann Rehberger’s Promptware against Gemini and Calendar, Radware’s ShadowLeak against ChatGPT Operator, and CamoLeak against GitHub Copilot Chat are further public anchors. Cite the vendor write-up and the month. Do not paste a payload into the report.
Agent-to-agent trust and memory poisoning sit in the same gap. OWASP has separate agentic guidance (Agentic AI Threats and Mitigations, 2025). A formal Agentic Top 10 was still in draft through 2025, so check the project page before you cite a number. Until that list is stable, extend LLM01 and LLM06: every agent is a principal, every other agent’s output is untrusted content, and memory is a data store with an author you did not vet.
How do the OWASP LLM Top 10, MITRE ATLAS, and NIST AI RMF fit together?
Use the OWASP LLM Top 10 to name the finding for the security committee, MITRE ATLAS to name the technique, and the NIST AI Risk Management Framework to decide who owns the control. They answer different questions. None of them is a pentest method on its own.
ATLAS is the ATT&CK analogue for adversarial machine learning: it is where you hang technique IDs once you have a side effect. NIST AI 100-1 (the AI RMF) and the Generative AI Profile, NIST AI 600-1, published in July 2024, give you Govern, Map, Measure, and Manage. ISO/IEC 42001:2023 is the management system a regulator or a customer assessor may actually ask for. ISO/IEC 23894 covers AI risk management more broadly. Google’s SAIF and the OWASP AI Exchange are useful crosswalks. They are not extra findings.
Under the chat UI you still have a web app and an API. LLM05 is often a new path into XSS, SQL injection, command injection, or SSRF. Run those against the OWASP Web Top 10, the API Security Top 10, ASVS, and WSTG, or you will “pass” an LLM review and miss an IDOR in the same endpoint. A RAG pipeline security assessment belongs next to ordinary access-control testing, because the index is just another data store with a strange query language.
Regulatory hooks are short and concrete. GDPR Article 32 is the security-of-processing angle once LLM02 is confirmed, and US state breach-notification rules follow if the data is personal. DORA matters for EU financial entities that put agents on production systems. The EU AI Act entered into force on 1 August 2024, with general-purpose-AI obligations from 2 August 2025 and high-risk obligations dated August 2026. Those dates were subject to a proposed digital-omnibus delay in late 2025. Quote them as of the text you checked, not from memory in a proposal.
The report format that gets fixed has two layers. The committee sees LLM01 through LLM10, a blast-radius score, and the lethal-trifecta result. The ticket sees the endpoint, the tool, the token scope, the canary, the callback log, and a retest step that does not depend on the model refusing. “We addressed all ten” with no side effect demonstrated is a checklist, and checklists do not survive the next model upgrade.
FAQ
What do OWASP Top 10 for LLM applications examples look like in a real pentest?
A document makes the agent call a tool, a vector query returns another tenant's chunks, or model output reaches HTML, SQL, or a shell. The finding records the data flow, the trust boundary, and the side effect. A jailbreak screenshot without that chain is not a finding.
What is the lethal trifecta for an AI agent?
Simon Willison's lethal trifecta is private data, exposure to untrusted content, and a channel to communicate externally, all at once. If an agent has all three, treat indirect prompt injection as a data-theft bug until you remove one of them.
What is excessive agency in the OWASP LLM Top 10?
LLM06 is excessive functionality, excessive permissions, or excessive autonomy on a tool the model can invoke. The usual form is one shared OAuth token backing every user's agent, so an injection runs with the union of all privileges. Least-privilege per-user tokens and approval gates are the fix, which is a different defect from a human user bypassing access control.
Why is system prompt leakage its own OWASP category?
LLM07 exists because teams put secrets, internal hostnames, and authorization rules in the system prompt and then tried to keep the prompt confidential. Treat the prompt as public. Move secrets and access decisions into real controls, and file any exposed credential as sensitive information disclosure.
How do you test a RAG pipeline for cross-tenant data leakage?
Plant a canary document as tenant B and query as tenant A. Pass the test only if the canary never enters the candidate set. A filter applied in application code after top-k fails when metadata is missing. Enforce the tenant predicate inside the vector query, or isolate indexes per tenant.
Do guardrails stop prompt injection?
They reduce known direct-injection patterns and cut noise. They do not stop a new instruction hidden in content the agent is supposed to read. Keep the guardrail, and block the side effect with scoped tools, query-time access control, output encoding, and egress limits.
How should a report prove an indirect prompt injection finding?
Include a canary planted in the protected data, an out-of-band callback showing it left, a timestamped tool-call transcript, and a statement of whether a human approved the action. Close the finding when that callback fails because the control blocked it, not because the model refused this week.
Did the 2025 OWASP LLM list drop model theft?
No. Model extraction moved under LLM10 Unbounded Consumption, next to denial of wallet and recursive agent loops. Systematic querying to distill a fine-tune is still in scope. The control is budgets, rate limits, and query-pattern detection.
agent::offense tests LLM apps, RAG indexes, and MCP tool chains the same way this article scores them: canaries, tool transcripts, and a retest against the side effect. See LLM application penetration testing for a scoped engagement.