The blog

Field notes from the offensive side

Threat briefs, exploit breakdowns and lab write-ups. New posts land here first, then on LinkedIn.

AI / LLMs · Topic 21

LLM Output Handling Needs No New Controls

Topic 21 of the AI track: six posts of breaking things, and not one of the fixes was new. Output encoding, prepared statements, argv execution, a CSP header and least privilege all predate LLMs by decades. The five layers, what each one actually stops, and an honest word about why sandboxing is the control teams reach for first and the one that changes least.

AI / LLMs · Topic 20

LLM Hallucinations Are a Supply Chain Problem

Topic 20 of the AI track, a short reference: hallucination gets filed under accuracy, but a wrong answer that repeats is a package name an attacker can register first. The measured rates by model, why repeatability matters more than the rate, and the six checks before you install anything a model named.

AI / LLMs · Topic 19

LLM Data Exfiltration: No JavaScript, Just an Image

Topic 19 of the AI track: markdown is the safe subset only if you think danger means execution. An image tag is a silent outbound GET, and four access logs show my own password, a secret called strikebreaker and another user's discount code arriving at my server with nobody clicking anything.

AI / LLMs · Topic 18

LLM Function Calling: The Model Isn't Your Auth Check

Topic 18 of the AI track: a support bot listed its own admin function, refused to run it, then ran it once I claimed to be an administrator. Three separate bugs share the name function calling, and a harmless question about XSS proved the handler was piping the model straight into a Python interpreter.

AI / LLMs · Topic 17

LLM Command Injection Is a Coin Flip, Not a Control

Topic 17 of the AI track: I typed the same sentence twice and got two different shell commands, one safely quoted and one that ran id as user_2. A lab log on LLM command injection, why the classic payload list is useless here, and the one design change that ends it.

AI / LLMs · Topic 16

LLM SQL Injection Isn't an Injection Problem

Topic 16 of the AI track: I read the admin table and got an INSERT out of a chatbot without writing a line of SQL. Text-to-SQL is an authorisation problem wearing injection's clothes, and the UNION payload only came out once someone bolted a filter onto the wrong string.

AI / LLMs · Topic 15

LLM XSS: The Model's Refusal Isn't a Control

Topic 15 of the AI track: the model refused my XSS payload on safety grounds, and two prompts later the same page popped an alert box. Insecure output handling end to end, reflected and stored, plus the one-prompt bold-tag probe that decides whether any of it is worth chasing.

AI / LLMs · Topic 14

LLM Jailbreaks: A Prompt List Isn't a Test

Topic 14 of the AI track: a folder of DAN prompts is not a test methodology. Jailbreak families sorted by which defence they actually break, and the measurement that turns a screenshot into a finding. The DAN text everyone copies is 7,070 characters; the sentence completion that beat a system prompt was 131.

AI / LLMs · Topic 13

Indirect Prompt Injection: Every Channel, One Payload

Topic 13 of the AI track, a short reference: six channels that carry the same prompt injection payload, from an HTML comment to a row in a CSV export to an email body. Plus the thing I found by accident, where a quoted-printable line break split the payload and grep on the raw message returned zero matches.

AI / LLMs · Topic 12

Prompt Injection: Your Filter Blocks Words, Not Intent

Topic 12 of the AI track: I fired eight prompt-leak payloads at the two filters everyone ships. The input blocklist stopped 1 of 8, output redaction stopped 5, and running both together stopped nothing extra. A base64 transform, an acrostic poem and "give me the first five characters" beat every configuration.

AI / LLMs · Topic 11

Red Teaming Generative AI: The Model Is the Wrong Target

Topic 11 of the AI track: I attacked my own AI support bot from four directions. The model's guardrail blocked a direct jailbreak, then obeyed the same instruction hidden in a retrieved document. The app leaked a session cookie and one request tied the service up for 20 seconds.

AI / LLMs · Topic 10

Red Teaming ML: The Backdoor Accuracy Can't See

Topic 10 of the AI track: I poisoned 3.29% of a spam filter's training data and planted a trigger phrase that switches the filter off on demand. Accuracy stayed at 94.12% before and after, and my canary tests passed 5 of 5 on the backdoored model.

Kubernetes Journey · Topic 42 · Finale

The Kubernetes Security Journey, Mapped End to End

The finale of my Kubernetes journey: all 42 topics in one bookmarkable field guide, mapped by the attacker's path and by defence, from RBAC to runtime, with the 90-note pentest playbook. The one page to save before I turn to AI and LLM security.

Kubernetes Journey · Topic 41

readOnlyRootFilesystem Isn't an Immutable Container

Topic 41 of my Kubernetes journey: a read-only root filesystem is worth setting, but it's sold as something bigger than it is. What readOnlyRootFilesystem actually stops, what it misses (a shell, memory, privileged), and why PodSecurityPolicy is the wrong way to enforce it now.

Kubernetes Journey · Topic 40

Falco in One Page: What the Old Guides Get Wrong

Topic 40 of my Kubernetes journey: a short Falco reference. The two drivers, the file paths, the five required rule keys and the output channels, plus the three install steps that stopped being true since the 0.28 era guides everyone still copies.

Kubernetes Journey · Topic 39

By Default, Kubernetes Trusts Every Registry Online

Topic 39 of my Kubernetes journey: a stock cluster will pull an image from any registry on the internet, and the built-in ImagePolicyWebhook fails open. Private registries and imagePullSecrets, three ways to allowlist trusted registries, and the defaultAllow trap.

Kubernetes Journey · Topic 38

KubeLinter: A Manifest That Applies Isn't Safe

Topic 38 of my Kubernetes journey: KubeLinter found five problems in a Deployment that applied without a complaint, then the fixes it wanted stopped nginx from starting. Static analysis for your YAML, the security context trap, and wiring the linter into CI.

Kubernetes Journey · Topic 37

Your Scanner Doesn't Delete Anything. You Have To.

Topic 37 of my Kubernetes journey: swapping one base image took my Trivy count from 124 findings to zero, and nothing was patched. Minimal and distroless bases, multi-stage builds, SBOMs with Syft and Grype, and the CI step that went green while producing no artefact at all.

Kubernetes Journey · Topic 36

Kubernetes Fairness: a Quota Is a Ceiling, Not a Referee

Topic 36 of my Kubernetes journey: a quota is a ceiling, not a referee. API Priority and Fairness, Pod Priority and Preemption, and the QoS class that quietly makes a "no resources block" pod first to die, plus the DNS default that leaks across namespaces.

Kubernetes Journey · Topic 35

Kubernetes Isolation Is a Stack, and Most Clusters Build Half of It

Topic 35 of my Kubernetes journey: isolation isn't one control, it's a stack. Control plane vs data plane, and the two layers most clusters leave half-built, storage and node isolation, including the taint-without-nodeSelector trap that scatters "dedicated" pods across shared nodes.

Kubernetes Journey · Topic 34

A Namespace Is a Label, Not a Wall

Topic 34 of my Kubernetes journey: a namespace is a label, not a wall. What actually keeps tenants apart on a shared cluster (RBAC, quotas, network policy), and the honest line where soft isolation for trusted teams stops being enough for hostile customers.

Kubernetes Journey · Topic 33

One-Way TLS vs mTLS: Which End Has to Prove Itself

Topic 33 of my Kubernetes journey: one-way TLS proves the server and asks you for a password, mutual TLS makes both sides show a certificate first. A ten-minute openssl and curl lab where the server refuses a client with no cert, plus where mTLS already runs in your cluster.

Kubernetes Journey · Topic 32

Containers Are Isolated from Each Other, Not from the Kernel

Topic 32 of my Kubernetes journey: kill a container's process from the host to see why the shared kernel matters, then what gVisor and Kata Containers actually change, and how RuntimeClass lets you sandbox one pod without paying for all of them.

Kubernetes Journey · Topic 31

Kubernetes Secrets Are Not Secret

Topic 31 of my Kubernetes journey: read a Secret straight out of etcd with etcdctl, then turn on encryption at rest step by step, and see why anyone who can create a pod can read every Secret in the namespace. With a decoder you can try in the browser.

Kubernetes Journey · Topic 30

Policy as Code: Rego Is the Price of Admission

Topic 30 of my Kubernetes journey: pulling the yes/no out of application code with Open Policy Agent, unit-testing Rego with opa test, then letting Gatekeeper enforce the same idea at the Kubernetes API, plus the five gotchas that cost me an evening.

AI / LLMs · Topic 8

Random Forest Hit 99.7% and Still Missed the Rare Attack

Topic 8 of the AI track: training a Random Forest on NSL-KDD-style traffic, 99.7% weighted accuracy, a confusion matrix that found the class it was quietly missing, and why the rarest attack is always the hardest one.

AI / LLMs · Topic 6

AI in InfoSec: 86.6% Accuracy, Zero Attacks Caught

Topic 6 of the AI track: cleaning 2,000 rows of deliberately broken network logs with pandas, encoding and splitting them, training a threat classifier, and why 86.6% accuracy meant zero attacks caught.

AD & Infrastructure

Coming soon

Cloud

Coming soon

System Breakouts

Coming soon

Wireless

Coming soon