Cloud Edition
Open Source · Apache 2.0
Detect and enforce agent runtime behavior
Open-source, kernel-level enforcement for Kubernetes — built on eBPF and BPF‑LSM, in the same CEL policy language as Kyverno.
The Problem
"Does this spec look right?" isn't "is this workload behaving right?"
Admission control checks a pod's spec once, before it starts. With autonomous agents, that's not enough — part of what they do is decided at runtime.
A second-stage payload
An innocuous image pulls extra code after startup.
An unscoped sidecar
Network access nobody scoped talks to a destination no one approved.
An unanticipated exec
A process runs that no policy ever described — only its declared spec was.
Design Premise
A sidecar can be starved. A proxy can be routed around. The kernel can't.
A control beside a workload is something a compromise can see, stall, or step around. Nirmata Runtime runs below it — enforcing at the same instruction as the syscall it gates.
bprm_check_security and file_openEnforcement Surface
Five behaviors, all decided in-kernel
No window between the syscall and the verdict.
Deny execution by resolved kernel path.
Deny file access by resolved kernel path.
Deny egress by address, CIDR, domain, or Service.
Deny by the protocol on the wire, not the port — HTTPS-on-443 doesn't excuse a reverse shell.
Report resolution without blocking — DNS denial fails worse than the traffic itself.
Policy Model
One policy language — if you write Kyverno policies, you already know this one
Same podSelector / namespaceSelector targeting, same CEL. Admission and runtime, one continuous policy story.
CEL expressionsThe Kubernetes CEL libraries Kyverno already uses, refreshable from a ConfigMap or HTTP source.
Monitor mode by defaultEvery policy watches what it would deny before you flip it to enforce.
OpenReports outputStandard Kubernetes Report objects — no proprietary dashboard.
Attributed, not just countedEvery deny is traced to the policy responsible; gaps are logged, never dropped.
AI Agents
An agent's behavior isn't fully known at deploy time
A coding agent or MCP server is a pod too. You can review the image — not the decision it hasn't made yet. If its runtime is compromised, the enforcement boundary isn't running inside that process to be argued with.
dns / network block egress outside an approved list.
exec allow-lists close off arbitrary tool invocation.
Agent CLIs, SDKs, model files, and MCP configs nobody built for.
apiVersion: runtime.nirmata.io/v1alpha1
kind: RuntimePolicy
metadata:
name: agent-gateway-only
spec:
mode: enforce
podSelector:
matchLabels:
nirmata.io/agent: "true"
behaviors:
- network:
allow:
values:
- llm-gateway.ai-platform.svc.cluster.local
- kube-dns.kube-system.svc.cluster.local
deny:
values: ["*"]
- protocol:
allow:
values: [tls, dns]
deny:
values: ["*"]
- open:
deny:
values:
- "/root/.aws/credentials"
- "/root/.kube/config"
- "/root/.ssh/id_rsa"
- "/var/run/secrets/kubernetes.io/serviceaccount/token"
A prompt injection can run cat ~/.aws/credentials — the kernel has already decided before the agent gets a chance to argue.
Install
Up and running with one Helm install
# install Nirmata Runtime for Kyverno
helm install kyverno-runtime oci://ghcr.io/nirmata/charts/kyverno-runtime \
--namespace kyverno-runtime --create-namespace
Linux nodes, kubectl, helm, git, K8s 1.29+.
cgroup v2 + BPF support on the node.
BPF‑LSM active on the kernel.
The Full Stack
Runtime works standalone. It works best alongside Kyverno and AIControls.
One policy language, one audit trail — across admission, runtime, and the AI gateway.
Start with open-source kernel enforcement.
Give it a ⭐ on GitHub, run it on one namespace, and watch what monitor mode finds before you enforce anything.
