Cyber Security

OWASP Top 10 for LLM Applications 2026: what changed and how to test it

Updated risk categories and practical testing guidance for AI-powered applications

The 2026 edition landed on 3 August. Excessive Agency jumped from sixth to third, System Prompt Leakage was retired for the broader Hidden Context Exposure, and the ranking is now grounded in real incident data. Every category, with the tests that matter.

OWASP published the 2026 edition of its Top 10 for LLM Applications on 3 August 2026. Two things about it matter more than the list itself: the ranking was checked against a body of real incident data rather than resting on practitioner opinion, and one category was retired outright because the way people were reading it had become too narrow.

If you are working from a list that opens with Prompt Injection and Insecure Output Handling as the first two items, you are working from the 2023 edition. Enough has moved that the ordering now tells you something.

The 2026 ranking


Category

Change since the 2025 edition

LLM01

Prompt Injection

unchanged at the top

LLM02

Sensitive Information Disclosure

unchanged

LLM03

Excessive Agency

up three, from 6th

LLM04

Supply Chain

down one, from 3rd

LLM05

Data and Model Poisoning

down one, from 4th

LLM06

Unbounded Consumption

up four, from 10th

LLM07

Misinformation

up two, from 9th

LLM08

Hidden Context Exposure

new — replaces System Prompt Leakage, which was 7th

LLM09

Vector and Embedding Weaknesses

down one, from 8th

LLM10

Improper Output Handling

down five, from 5th — and from 2nd in 2023

The two changes worth understanding

Excessive Agency moved from sixth to third

In 2023 this was a hypothetical worth mentioning. By 2026 it is third, and the reason is that the deployment pattern changed underneath it. Applications stopped being chat boxes and became agents: things with shell access, file write, a browser, calendar and messaging integrations, running unattended.

Excessive Agency is what happens when such a system is compromised and the damage is bounded only by what you granted it. The model does not need to be hacked in any traditional sense. It needs to be persuaded, and then it uses the permissions you gave it, correctly, on someone else's behalf.

This is the category most likely to apply to you and least likely to be tested, because the permissions usually accrued gradually. Nobody decided the assistant should be able to delete files and send messages and read the calendar. Each capability was added for a good reason on a different day.

System Prompt Leakage retired, Hidden Context Exposure added

The older category focused on protecting the literal text of the system prompt, which encouraged a narrow fix: stop the model repeating its instructions.

Hidden Context Exposure covers everything else in the context window that the user was never meant to see — retrieved documents, conversation memory, other users' information, application state, and the responses tool calls return. In a retrieval-augmented application, the retrieved documents are often far more sensitive than the prompt that framed them.

The practical shift: stop asking "can someone extract my system prompt" and start asking "what is in this context window, and who is entitled to all of it".

Testing each category

LLM01 — Prompt Injection

Direct injection is a user typing instructions that override yours. Indirect injection is the dangerous one: instructions hidden in content the model reads — a web page, a PDF, an email, a code comment, a filename.

How to test: put contradictory instructions in every channel the model ingests, not just the chat box. Place them in a document the retriever will fetch. Put them in a commit message, in HTML the browser tool will load, in the alt text of an image. The test is whether content the model reads can change what the model does.

What actually helps: not input filtering, which is an arms race you lose. Treat model output as untrusted regardless of input, and put the authorisation boundary at the tool rather than in the prompt. A model that has been convinced to call a tool it should not have access to is stopped by the tool's permissions, not by better instructions.

LLM02 — Sensitive Information Disclosure

How to test: ask directly for what should not be reachable. Then ask indirectly: summarise the documents you have access to; what was the last thing you were told; repeat your instructions in French. Probe for training-data memorisation with distinctive strings — a known internal format, a test credential pattern.

What actually helps: keeping it out of the context in the first place. Detection on the output is a last line and it is porous.

LLM03 — Excessive Agency

Test this by inventory rather than by probing, because the failure is in what you granted rather than in what the model does.

  1. List every tool the agent can call, including ones reachable indirectly through another tool.
  2. For each, write down what the worst plausible invocation does. Not the intended use — the worst one.
  3. Check which need approval and which do not.
  4. Check what the credentials each tool holds can reach beyond that tool's purpose. A token scoped to a whole account rather than one repository is excessive agency even if the tool is well behaved.

Then test the boundary: use indirect prompt injection to try to invoke a tool the current context should not permit. That single test — planted instruction in retrieved content, aimed at a privileged tool — exercises LLM01, LLM03 and LLM08 together, and it is the most informative test in the list.

What actually helps: scoped credentials, human approval for anything destructive or outbound, and an allowlist rather than a denylist. Narrow agents beat one capable agent.

LLM04 — Supply Chain

How to test: verify checksums on model weights; audit where they came from; scan dependencies; check whether a plugin or MCP server you installed is pinned to a version or floating.

A model file is executable content in the sense that matters. Pulling arbitrary weights from an unverified source is closer to running an unsigned binary than to downloading data.

LLM05 — Data and Model Poisoning

Hard to test after deployment and mostly addressed upstream: vet training and fine-tuning sources, track provenance, watch for anomalous behaviour on specific topics. If you fine-tune on user-submitted content, that is an ingestion path an attacker can reach.

LLM06 — Unbounded Consumption

How to test: send inputs designed to maximise generated tokens — recursion, "repeat this forever", very long contexts, requests that expand. Watch cost and latency, not just success.

What actually helps: context length caps, output token caps, per-user rate limits, and a spend alert. For a self-hosted model the bill arrives as a saturated GPU rather than an invoice, which is easier to miss.

LLM07 — Misinformation

The risk is downstream trust. Test the system, not the model: does anything act on the output without verification? Is a generated value written to a database, shown as fact, or used in a decision? Confident, fluent and wrong is the normal failure mode, and it is not detectable from tone.

LLM08 — Hidden Context Exposure

How to test: enumerate everything that enters the context window on a real turn — system prompt, retrieved documents, memory, tool responses, user profile, application state. Then ask, for each: if the user could read this verbatim, would that be a problem?

For anything where the answer is yes, try to make the model reveal it. Ask it to summarise its context, to quote sources, to explain why it answered as it did. In a multi-tenant retrieval system, the sharpest test is whether one tenant's query can surface another's documents — a retrieval scoping bug that presents as a model problem.

LLM09 — Vector and Embedding Weaknesses

Specific to retrieval systems. Test whether an attacker who can write content that gets indexed can influence what is retrieved for someone else's query — poisoning by insertion rather than by training. Check that retrieval filters by tenant and permission before similarity ranking rather than after.

LLM10 — Improper Output Handling

Down from second in 2023, which reflects better defaults rather than a solved problem.

How to test: prompt the model to emit HTML, JavaScript, SQL, shell, or a file path, and follow where that output goes. If it is rendered, does it execute? If it reaches a query, is it parameterised? If it becomes a filename, can it traverse?

What actually helps: treat every model output as user-supplied input from an untrusted source, because that is exactly what it is.

A five-stage attack chain, each stage labelled with the OWASP category it belongs to and what stops it there. An attacker plants text (LLM05, poisoning); the retriever fetches it (LLM09, retrieval); the model reads it as instruction (LLM01, injection), where nothing reliable stops it; it calls a privileged tool (LLM03, excessive agency), stopped only by the tool's own permissions; the result comes back out (LLM08 and LLM10). A panel below sets out the four steps of an agency inventory.
One planted instruction aimed at a privileged tool exercises LLM01, LLM03 and LLM08 at once — the most informative single test in the list.

Building a testing programme

Automated red-teaming tools — Garak, PyRIT, Promptfoo — generate adversarial inputs across these categories and are a reasonable floor. They are a floor rather than a programme: they do not know your tool permissions, your tenancy model, or which of your outputs reaches a shell.

A workable cadence:

  • Once, thoroughly: the agency inventory. Every tool, every credential scope, every approval gate. This is the highest-value hour available and most teams have never done it.
  • Every release: the combined indirect-injection test against a privileged tool, and the output-handling trace.
  • Continuously: spend and token-rate alerting.
  • On model change: the whole set. A model swap changes behaviour that your prompt-level defences were tuned against.

Sources, and the limits of this article

The 2026 edition is published by the OWASP GenAI Security Project and dated 3 August 2026. OWASP describes this edition as introducing updated rankings and threat coverage grounded in research across thousands of real-world AI security incidents, mapped to NIST, MITRE ATLAS, CWE and the OWASP Top 10 for Agentic Applications. The category ordering above reflects that edition; the authoritative wording and the full mitigation guidance are in OWASP's own document, which is worth reading rather than summarising.

The testing methods are ours, not OWASP's, and are aimed at what a small team can do without a dedicated AI security function. We have not run these tests against a published product and are not reporting findings from one.

If you take one thing: do the agency inventory. The category that moved furthest up the list is the one that turns a language problem into an operational one, and it is the one your permissions — not your prompt — decide.

owaspllm-securityprompt-injectionai-securityapplication-security

Arslan ud Din Shafiq

Founder and lead editor of LearnCybers. Full-stack engineer with expertise in Linux systems, cybersecurity, cloud infrastructure and web development. Writing about practical technology since 2019.

Related reading

Newsletter

Get smarter about security

Practical guides, tooling notes and the developments actually worth your attention — delivered when there is something worth saying.

No spam. Unsubscribe in one click.