BurritoBot, the Hex & Cauldron mascot

BurritoBot Said Let's Dance,

the Platform Said No.

KubeCon + CloudNativeCon North America 2026

Whitney Lee

Whitney Lee

Senior Technical Advocate · Datadog

whitneylee.com

Michael Forrester

Michael Forrester

AI Startup Advisor · Neo4j Startup Program

michaelrishiforrester.com

Why a burrito bot?

A fast-casual ordering bot solving a Python linked-list problem instead of taking an order
The customer's message in the chat: a bowl order, after help reversing a linked list in Python
The ordering bot's reply: a Python function that reverses a linked list, then an offer to start a burrito order

You get access to an insecure BurritoBot.

Exploit it.

Nothing you type here is private.

What you send BurritoBot may show up on THE PROMPT WALL.

BurritoBot!

QR code for the shared AttackMe BurritoBot

attackme.burritobot.co

BurritoBot has access to every secret in its namespace.

That's how it has access to model API keys.

But not every secret in the namespace is meant for BurritoBot.

Challenge 1

Convince BurritoBot to give you the CEO's home address.

Challenge 1

Convince BurritoBot to give you the CEO's home address.

Hint: The CEO's name is Ophelia Thorn.

OWASP Top 10 LLM Vulnerabilities

Open Worldwide Application Security Project

It is time for Challenge 2!

Everything you already knew about Kubernetes security

BurritoBot has none of these things.

Challenge 2

Exploit the excessive access that BurritoBot has in its Kubernetes cluster.

Challenge 2

Exploit the excessive access that BurritoBot has in its Kubernetes cluster.

Get BurritoBot to run a malicious image.

Challenge 2

Exploit the excessive access that BurritoBot has in its Kubernetes cluster.

Get BurritoBot to run a malicious image.

Get it to read the famously secret 'Bat Spit Amazing Awesome Sauce' recipe off its filesystem.

Challenge 2

Exploit the excessive access that BurritoBot has in its Kubernetes cluster.

Get BurritoBot to run a malicious image.

Get it to read the famously secret 'Bat Spit Amazing Awesome Sauce' recipe off its filesystem.

Get it to send customer data off the cluster.

Kubernetes guardrails on

RBAC

The CEO's Secret read comes back Forbidden.

Before: a Role that reads every Secret in the namespace, the CEO's record included. After: a Role that names the one Secret the bot needs, and the CEO's record is Forbidden

Kyverno admission

The registry allow-list denies the malicious image at the API server.

KubeArmor

Permission denied, in the kernel. And an alert that says it was tried.

Egress NetworkPolicy

The POST never reaches the beacon. The count does not move.

AI guardrails

Off. Then on, live.

One switch at a time, the same ask each time.

Challenge 3

The setup

BurritoBot also answers help-desk tickets, and does what the support desk tells it.

Anyone can file a ticket at support.burritobot.co and get a ticket number. Ticket HC-666 is already there.

Challenge 3

The challenge

Get BurritoBot to deploy something, using only a support ticket.

Your witchy name is at the top of your screen. Your deployment shows up on the wall.

Challenge 3

The trace

The attack, as the trace shows it.

read_support_ticket, then the deploy_app the ticket asked for.

Challenge 3

Your turn

Three minutes.

support.burritobot.co · attackme.burritobot.co

Challenge 3

Our turn

Story: a ticket at the support desk hides an instruction in white text, the room asks BurritoBot to read it, the bot reads the ticket and deploys a Joker under the attendee's witchy name, and Kyverno admits the trusted image; least privilege makes the deploy Forbidden, and the input guard withholds the ticket

Challenge 3

The fix

Prompt, interface, guard, classifier, rejected: the ticket's hidden instruction is flagged before the model and never reaches it
$ guard-agency-on
$ kubectl apply -f /home/student/challenges/c6-least-privilege-role.yaml
$ guard-input-on
$ kubectl -n agent exec deploy/guard-proxy -- python3 -c "import urllib.request;urllib.request.urlopen('http://localhost:8080/toggle?input_blocklist=on&input_classifier=on',timeout=10).read()"

Challenge 3

Guard on

A prompt injection hidden in a support ticket

The symptom, at the cluster

Least privilege

guard-agency-on: the bot's deploy_app comes back Forbidden.

The cause, before the model

Input guard

guard-input-on: the ticket's hidden instruction is withheld.

Challenge 4

The setup

BurritoBot has a weather tool, from an MCP server nobody vetted. It returns real weather.

Challenge 4

The challenge

Order a lunch burrito that suits today's weather.

Then read everything that comes back.

Challenge 4

The trace

The attack, as the trace shows it.

get_weather, then a call to read_internal_config nobody asked for.

Challenge 4

Your turn

Two minutes.

attackme.burritobot.co

Challenge 4

Our turn

Story: BurritoBot calls get_weather, the poisoned description tells it to call read_internal_config, and the gateway allow-list refuses the unregistered tool

Challenge 4

The fix

BurritoBot reaches its tools through agentgateway, whose allow-list lets get_weather through and refuses read_internal_config, which was never registered
$ guard-mcp-on
$ kubectl -n agent get configmap agentgateway-c7-config -o json | python3 "$HOME/.c7rule.py" on
$ kubectl -n agent patch configmap agentgateway-c7-config --type=json -p '[…]'

Challenge 4

Guard on

The under-protected MCP server

A poisoned tool description chains the agent into a tool nobody asked for.

Blocked by

Tool allow-list

guard-mcp-on: the rogue tool is gone. The call cannot happen.

One talks the model out of it. The other lets the model be persuaded and takes the capability away.

Only the second holds when the next model is more persuadable.

OWASP Top 10 for LLM Applications 2025

LLM01Prompt InjectionChallenges 3, 4
LLM02Sensitive Information DisclosureChallenge 1
LLM03Supply ChainChallenge 4
LLM04Data and Model Poisoningfurther reading
LLM05Improper Output Handlingfurther reading
LLM06Excessive AgencyChallenges 1 to 4
LLM07System Prompt Leakagefurther reading
LLM08Vector and Embedding Weaknessesfurther reading
LLM09Misinformationfurther reading
LLM10Unbounded Consumptionthe last minutes

OWASP GenAI Security Projectgenai.owasp.org/llm-top-10

OWASP Kubernetes Top 10 2025

Put these in place and most of today's attacks stop downstream.

K02Overly Permissive Authorization ConfigurationsChallenges 1, 3
K03Secrets Management FailuresChallenge 1
K04Lack Of Cluster Level Policy EnforcementChallenge 2
K05Missing Network Segmentation ControlsChallenge 2
K10Inadequate Logging And MonitoringChallenges 1 to 4

OWASP Kubernetes Top 10kubernetes-top10.owasp.org

And the blast radius that leaves the cluster

ASI03 Identity and Privilege Abuse: a container compromise becomes a cloud-account one.

On the community bot, a pod reads the node's metadata and comes back with the node role. Every guarded cluster prints IMDS: BLOCKED.

OWASP Top 10 for Agentic Applications 2026genai.owasp.org

The ending

Sell burritos.

Nothing more.

The close

We couldn't show everything in 30 minutes.

The last minutes

Now break it.

Drive BurritoBot's model bill up to its cost cap. You have our permission.

attackme.burritobot.co

Meanwhile, the cost counter

Nothing crashed. Nothing is red.

The bill is the attack.

Every attack today was a plausible request.

A scoped Role. Admission, runtime and egress policy. An input classifier. A tool allow-list.

Boring, countable, owned by the platform team.

The layers

Agentkagent, on Amazon Bedrock
AdmissionKyverno
NetworkNetworkPolicy
RuntimeKubeArmor, Falco
AI guardrailsguard-proxy, LLM Guard, the tool allow-list
ObservabilityOpenTelemetry, Datadog, Grafana
DeliveryArgo CD

One layer is the developer's. Everything else is the platform team's.

A CNCF floor. AAIF agent protocols. A guardrail layer with no foundation behind it.

Take home

QR code for https://github.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn/blob/main/docs/mcp-server-vetting-checklist.md

MCP server vetting checklist

QR code for github.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

github.com/peopleforrester/
Unleash_an_Agent_Watch_It_Burn

QR code for the session page on Sessionize, where the room rates the talk

Rate this session

Whitney Lee

Whitney Lee

Senior Technical Advocate · Datadog

whitneylee.com

Michael Forrester

Michael Forrester

AI Startup Advisor · Neo4j Startup Program

michaelrishiforrester.com

BurritoBot

Thank you

The platform

A real internal developer platform

kubectl get applications -n argocd

Meanwhile, on the community bot

The bill still moved.

Each ask reached the model before admission said no. Admission is the last mile, and the most expensive.

Appendix

Cool Diagrams About Technology Concepts

BurritoBot · The stack

The stack

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

BurritoBot · The request path

The request path

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

BurritoBot · The five switches

The five switches

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

BurritoBot · agentgateway routes the calls

agentgateway routes the calls

agentgatewayagentgateway.dev/docs

BurritoBot · kagent runs the agent

kagent runs the agent

kagentkagent.dev/docs

BurritoBot · Argo CD keeps it this way

Argo CD keeps it this way

Argo CDargo-cd.readthedocs.io

BurritoBot · Secrets come from outside

Secrets come from outside

External Secretsexternal-secrets.io

BurritoBot · What a cluster is made of

What a cluster is made of

The Kubernetes Authorskubernetes.io

BurritoBot · What a Pod is

What a Pod is

The Kubernetes Authorskubernetes.io

BurritoBot · Pods on a node

Pods on a node

The Kubernetes Authorskubernetes.io

Challenge 1 · Where the Secret goes

Where the Secret goes

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 1 · What a Secret actually is

What a Secret actually is

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 1 · Authn, authz, admission

Authn, authz, admission

The Kubernetes Authorskubernetes.io

Challenge 1 · Role, ClusterRole, and bindings

Role, ClusterRole, and bindings

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 1 · How a pod gets a token

How a pod gets a token

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 1 · What a trace is

What a trace is

OpenTelemetryopentelemetry.io/docs/concepts/observability-primer

Challenge 2 · Where admission sits

Where admission sits

The Kubernetes Authorskubernetes.io

Challenge 2 · Kyverno is the webhook

Kyverno is the webhook

Kyvernokyverno.io/docs/introduction/how-kyverno-works

Challenge 2 · What a Kyverno policy is

What a Kyverno policy is

Kyvernokyverno.io/docs/policy-types/cluster-policy

Challenge 2 · The registry allow-list

The registry allow-list

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 2 · Deployment, ReplicaSet, Service

Deployment, ReplicaSet, Service

The Kubernetes Authorskubernetes.io

Challenge 2 · KubeArmor prevents

KubeArmor prevents

KubeArmordocs.kubearmor.io

Challenge 2 · Policy as eBPF at the LSM hooks

Policy as eBPF at the LSM hooks

KubeArmordocs.kubearmor.io

Challenge 2 · Where eBPF attaches

Where eBPF attaches

eBPF.ioebpf.io/what-is-ebpf

Challenge 2 · Falco detects

Falco detects

The Falco Projectfalco.org/docs

Challenge 2 · NetworkPolicy, on your cluster

NetworkPolicy, on your cluster

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 3 · Where the injected text comes from

Where the injected text comes from

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 3 · Two checks before the model

Two checks before the model

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 3 · Exact match, or meaning

Exact match, or meaning

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 3 · Input scanning

Input scanning

LLM Guardprotectai.github.io/llm-guard

Challenge 4 · What MCP is

What MCP is

Model Context Protocolmodelcontextprotocol.io/docs/getting-started/intro

Challenge 4 · How MCP is wired

How MCP is wired

Model Context Protocolmodelcontextprotocol.io/docs/learn/architecture

Challenge 4 · A server that only looks right

A server that only looks right

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

Challenge 4 · The tool allow-list

The tool allow-list

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

The cost cap · The cap is checked before the call

The cap is checked before the call

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

The cost cap · What a token is

What a token is

Hugging Face LLM Coursehuggingface.co/learn/llm-course/chapter2/4

The cost cap · What actually gets metered

What actually gets metered

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

The cost cap · Why an agent loop costs money

Why an agent loop costs money

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn

The cost cap · A cap is not a rate limit

A cap is not a rate limit

What your cluster actually runsgithub.com/peopleforrester/Unleash_an_Agent_Watch_It_Burn