[Blog](https://excessionlabs.ai/blog/) · 14 November 2026

# AI Red Teaming: How to Plan a Controlled Assessment

Source page: https://excessionlabs.ai/blog/ai-red-teaming-plan-controlled-assessment/

A controlled AI red teaming assessment starts with written approval, isolated test systems and clear stop rules. Attack prompts come later. Define what counts as failure, use synthetic data, and stop at once if a test crosses an approved boundary.

NIST AI 600-1 defines AI red-teaming as “a structured testing exercise used to probe an AI system to find flaws and vulnerabilities”, often “in a controlled environment and in collaboration with system developers”. The plan is what makes it controlled. (sources: [NIST AI 600-1](https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.600-1.pdf), [AI red teaming methodology](https://airedteamingservices.com/methodology/))

A plan covers four areas.

- Scope and ownership: the approved systems, accounts, actions and exclusions, and who can halt the test.

- Test cases: prompt injection, tool permissions, approval limits and cross-tenant data leaks.

- Containment: tool limits enforced in code, cost caps, rollback steps and a stop path you have checked.

- Proof and follow-up: logs, state checks, success counts, owners for fixes and retests.

A refusal in the chat reply does not show that nothing happened. Read the tool-call log and check the state of the downstream system. (sources: [AI agent security guide](https://airedteamingservices.com/guides/ai-agent-security/))

This post covers planning. Our [AI red teaming service page](https://excessionlabs.ai/ai-red-teaming/) describes what we test and how an engagement runs. For measured results from a lab run, read [Prompt injection defenses: success rates from 1,800 trials](https://excessionlabs.ai/blog/prompt-injection-defenses/).

## Build Threat Scenarios and Test Cases

Write one test matrix. Each row links a failure mode to the control you expect, the evidence you will collect and the person who owns the fix. The table shows three example rows.

Example rows from a test matrix

| Case | Failure mode | Test account | Expected control and evidence | Owner |
| --- | --- | --- | --- | --- |
| INJ-01 | Retrieved ticket or document: the model follows instructions found in untrusted content | Low-privilege user who can submit content but cannot change system instructions | Retrieved text is treated as data. Inspect the reply, authorization logs and tool-call logs. | Application owner |
| TOOL-01 | Tool layer: an action the user may not take, such as a refund | Signed-in user without refund permission | The server rejects the call and the order does not change. Inspect authorization logs and order state. | API team |
| RAG-02 | Retrieval and tenant boundary: one tenant’s data reaches another tenant | Tenant B user with no access to Tenant A | The tenant filter excludes Tenant A’s chunks. Inspect retrieval traces and replies. | Retrieval owner |

Rank the cases by impact, the access an attacker needs, the number of tenants affected and whether the action can be undone. Put paths to sending, sharing and payment tools ahead of harmless changes to an answer. (sources: [agent permissions guide](https://airedteamingservices.com/guides/ai-agent-permissions/), [OWASP LLM06:2025 Excessive Agency](https://genai.owasp.org/llmrisk/llm062025-excessive-agency/))

### Test Direct and Indirect Prompt Injection

OWASP separates two kinds. In direct prompt injection, the user’s own input changes the model’s behavior. In indirect prompt injection, the model reads content from an outside source, such as a website or a file. Write separate cases for the chat box and for synthetic documents, retrieved pages, uploads and tool outputs.

For INJ-01, plant a harmless marker instruction in a test ticket. For example, ask the reply to end with an agreed test word. Then request a summary. If the reply follows the marker, record a prompt injection result. It is not a data leak. Read the tool-call log and the browser network log even when the reply contains a refusal. (sources: [OWASP LLM01:2025 Prompt Injection](https://genai.owasp.org/llmrisk/llm01-prompt-injection/), [RAG security guide](https://airedteamingservices.com/guides/rag-security/))

### Test Tool Permission Boundaries

For TOOL-01, use a low-privilege test account and a reversible test order. Ask for an action that only a higher role may take. Try disallowed parameters, another user’s identity and a tool output that tries to start a chain of further calls. Then test the approval limit: ask for several smaller refunds that together pass the cumulative limit. This shows whether the limit applies per call or per order.

The server must reject each unauthorized call and leave the order unchanged. Record the attempted calls, the approval decisions and the downstream state as three separate items. OWASP describes the underlying weakness as excessive agency: a damaging action taken in response to unexpected, ambiguous or manipulated model output. Check permission at execution time, in code outside the model. (sources: [agent permissions guide](https://airedteamingservices.com/guides/ai-agent-permissions/), [OWASP LLM06:2025 Excessive Agency](https://genai.owasp.org/llmrisk/llm062025-excessive-agency/), [example report](https://airedteamingservices.com/example-report/))

### Test Cross-Tenant Data Isolation

For RAG-02, create two test-owned tenants. Give each distinct synthetic records with a marker string, such as `A-HR-0042` for Tenant A. Confirm that Tenant A can retrieve its own record. Then query as Tenant B, once by identifier and once by description.

Repeat the test for search, summaries and exports. Look for fragments of Tenant A’s data in caches, conversation memory, retrieval indexes, logs and exported files. A pass is a denial, or results that hold Tenant B’s data only. If Tenant A’s chunks reach Tenant B’s retrieval context, record a boundary failure even when the final reply hides them, because a model can see another tenant’s chunk and not repeat it. Use test-owned records only. For the same checks without a model in the path, see [Tenant isolation testing: three gaps beyond IDOR](https://excessionlabs.ai/blog/tenant-isolation/). (sources: [RAG security guide](https://airedteamingservices.com/guides/rag-security/), [OWASP LLM08:2025 Vector and Embedding Weaknesses](https://genai.owasp.org/llmrisk/llm082025-vector-and-embedding-weaknesses/))

## Set Rules of Engagement and Containment

Turn the approved cases into limits that the system enforces. Write a signed rules-of-engagement document. It lists the approved hosts, API paths, accounts, roles, techniques, exclusions and cost limits. For each tool in the system under test, decide whether it is allowed, needs approval or is denied. Cover reads, state changes, costly calls and prohibited actions.

Enforce these rules in code outside the model. A rule that exists only in the prompt can be overridden by text the agent reads. (sources: [AI pentest safety rules](https://aipentestservices.com/safety/), [agent permissions guide](https://airedteamingservices.com/guides/ai-agent-permissions/), [rules of engagement guide](https://penetrationtestservices.com/guides/penetration-testing-rules-of-engagement/))

### Isolate Tests and Restrict Access

Use a staging copy with synthetic data and mock or sandboxed tools where you can. Do not give the test a path to production. Limit credentials to test resources, keep secrets out of sandboxes and check network egress before the run. Send email only to test inboxes. Test production only when the system owner agrees in writing, and then use test accounts and limit side effects.

Require a rollback step for every state change. After the test, remove test data and markers unless the owner agrees to keep them. (sources: [AI agent security guide](https://airedteamingservices.com/guides/ai-agent-security/), [AI pentest safety rules](https://aipentestservices.com/safety/))

### Set Test Windows and Resource Limits

Record the approved date, the start and end times and the time zone. Write down the limits for request rate, run length, tool calls, uploads and cost, and set a hard cost cap. Agree the numbers before the run, and put them in the scope. Add error-rate and latency signs that trigger a stop. Agree a change freeze for the test window. Keep denial-of-service and load tests out of scope. (sources: [AI pentest safety rules](https://aipentestservices.com/safety/), [rules of engagement guide](https://penetrationtestservices.com/guides/penetration-testing-rules-of-engagement/))

### Define Stop Conditions and Escalation Steps

Stop at once if a test crosses its approved data, tenant or tool boundary. Also stop if sensitive data that is not test data appears, if a non-test tenant is reached, if errors or slow replies follow your requests, or if a cost, rate or size limit is passed.

Give both the testing lead and the owner’s stop contact the authority to halt testing. Name the person who disables tools and credentials, and the person who alerts security contacts through agreed channels. Keep the timestamps, request IDs and relevant logs. Resume only after the owner and the testing lead agree the changes to containment. (sources: [AI pentest safety rules](https://aipentestservices.com/safety/), [rules of engagement guide](https://penetrationtestservices.com/guides/penetration-testing-rules-of-engagement/), [AI red teaming methodology](https://airedteamingservices.com/methodology/))

## Run Tests and Report Results

Run baseline checks first. Use benign requests to see normal answers, permitted tool use and tenant-specific retrieval, and record baseline latency, errors and resource use. Then run the approved scenarios one at a time. Stop whenever a stop rule is triggered. Put the case ID from the matrix in every run record.

Model output changes between runs, so one attempt proves little. Fix the number of trials per case in the plan before you start. There is no standard number. In our own prompt injection run we used 20 trials per case, model and defense, and a case with no successes in 20 trials still has a 95% upper bound near 16%. Plan more trials when a decision depends on a tighter rate. (sources: [AI red teaming methodology](https://airedteamingservices.com/methodology/), [prompt injection defenses: 1,800 trials](https://excessionlabs.ai/blog/prompt-injection-defenses/))

### Record Evidence and Monitor Test Impact

Give each run a test ID linked to its case ID. Record the exact inputs, retrieved passages, tool arguments, replies, authorization decisions, identities and timestamps. Record the conditions too: model version, system prompt version, tool set and model settings. Watch tool logs, browser network logs, latency, errors, token use, run time and cost.

The final reply is evidence, but it does not prove that no side effects occurred. Label a result Observed only when logs or other evidence show it. Label a path you reasoned about but did not show as Inferred. A denied tool call can show two things at once: the model tried an unsafe action, and a backend control worked. Record both. Store sanitized evidence with access controls, and hash key files in a SHA-256 manifest. (sources: [AI red teaming methodology](https://airedteamingservices.com/methodology/), [AI agent security guide](https://airedteamingservices.com/guides/ai-agent-security/), [AI pentest safety rules](https://aipentestservices.com/safety/))

### Score Results Against Success Criteria

Set the success criteria before the run, and score each run against them. Give each case a verdict that the plan defines, such as pass, fail or inconclusive. A test that was blocked or left incomplete is not a pass. For each case, record the attempts, the successes and the rate, and list the coverage gaps.

One verified cross-tenant leak is a finding, even if it happens once. One success shows that a path exists. Zero successes do not show that a system is safe, because the model varies and you only tried the wordings you thought of. (sources: [AI red teaming methodology](https://airedteamingservices.com/methodology/), [example report](https://airedteamingservices.com/example-report/))

### Report Findings and Verify Fixes

Organize the report around an executive summary, scope and authorization, method, results, prioritized findings, evidence, limits, fixes and retest status. For each finding, explain what happened and why a control failed or held. Rate severity as Critical, High, Medium or Low. Our [service page](https://excessionlabs.ai/ai-red-teaming/) lists what a report holds.

Give each fix an owner, a due date and closure criteria. Before you close it, retest the original case and related variations under comparable conditions. Record what changed, the new attempt counts and the retest status. (sources: [AI red teaming service page](https://excessionlabs.ai/ai-red-teaming/), [example report](https://airedteamingservices.com/example-report/), [AI red teaming methodology](https://airedteamingservices.com/methodology/))

## Approve the Plan and Checklist

Before testing starts, confirm that each item below has a signature.

- Authorization: the system owner signs the scope, dates, approved roles, environments and exclusions. Check the hosting provider’s current rules for security testing.

- Environment: test accounts, synthetic data, tenant isolation, tool rules, egress limits, quotas and cost caps are checked.

- Rules: pass and fail criteria, required evidence, logging, alerts, stop steps, and the owners of evidence handling and retests are approved. Run the stop path once before the test.

Start only when all three are done. (sources: [rules of engagement guide](https://penetrationtestservices.com/guides/penetration-testing-rules-of-engagement/), [AI pentest safety rules](https://aipentestservices.com/safety/))

After sign-off, keep the plan under version control. Reapprove the affected tests when the model, the prompt, retrieval, permissions or tools change, because earlier results may not hold. Keep a regression list of fixed findings and of findings you could not reproduce. Record each unresolved finding as a risk decision with an owner. If the system under test includes an MCP server, [MCP security: a vulnerable MCP server you can run](https://excessionlabs.ai/blog/mcp-security/) shows a local example. (sources: [AI red teaming methodology](https://airedteamingservices.com/methodology/))

## FAQs

### How do I prioritize tests with limited time?

Rank the tests with your threat model, by impact and likelihood. Start with authorization boundaries: tool permissions, cross-tenant access and blocking of out-of-scope actions. Then test side effects and approval paths. Run only approved, in-scope tests in isolation, with synthetic data and test accounts. (sources: [AI agent security guide](https://airedteamingservices.com/guides/ai-agent-security/), [OWASP LLM06:2025 Excessive Agency](https://genai.owasp.org/llmrisk/llm062025-excessive-agency/))

### How many trials should I plan per case?

No source sets a standard number, so choose one in the plan and justify it. More trials narrow the range of the success rate. In our prompt injection run, 20 trials per case left an upper bound near 16% for a case with no successes, and 100 trials per model and defense brought it near 4%. Use more trials for the cases where a fix decision depends on the rate. Keep the model version, system prompt and tool set fixed while you count. (sources: [prompt injection defenses: 1,800 trials](https://excessionlabs.ai/blog/prompt-injection-defenses/), [AI red teaming methodology](https://airedteamingservices.com/methodology/))

### How can I tell whether the model or a backend control failed?

Read the tool-call logs and the real system state, not only the chat reply. If the model tried a prohibited action and the backend denied it, the backend control worked and the model layer did not hold. Compare the logged attempt with your authorization policy. Then check that the protected resource was neither read nor changed. (sources: [AI agent security guide](https://airedteamingservices.com/guides/ai-agent-security/))
