Skip to content

Security research

I build privacy-first software — then I try to break it.

Authorized penetration testing, CVE detection modules contributed to the Metasploit Framework (Rapid7) — three merged upstream — and peer-reviewed research. Everything here is lab-verified and benign — the goal is to prove a defense holds, not just to claim it does.

Open source

Metasploit detection modules

Auxiliary scanner modules authored for the Metasploit Framework (Rapid7). The Audiobookshelf, Next.js middleware, and LiteLLM SQL injection modules are merged into the framework; the rest are under maintainer review. Rapid7 credited all three by name in their June 2026 weekly Metasploit update.

Audiobookshelf Merged

CVE-2025-25205

Unauthenticated auth-bypass scanner — a crash-safe differential check that tells a vulnerable server from a patched one without touching the endpoints that crash it.

Not new ground: a series of module-documentation PRs merged into the framework back in 2019 — credited by Rapid7 in their December 2019 Metasploit Wrap-Up. The detection modules above pick that work back up.

Product

Palisade — attack-surface monitoring

The CVE work feeds a product. Palisade is a pull-only on-host agent and a multi-tenant control plane that runs these detections locally, serves an Ed25519-signed catalog, scores posture, and alerts on new and regressed findings — with first-class coverage of the AI infra (LiteLLM, Ollama, MCP servers) generic scanners ignore.

Field notes

Penetration testing writeups

Technical · 10 min

The confused deputy

I planted a flag on a kernel-only page and wrote a ring-3 program to steal it. The CPU stopped the direct read cold — then my own syscall handed the flag over the moment it dereferenced a caller-chosen pointer. The one door the hardware cannot guard for you.

Read
Technical · 9 min

The first wall

Ring 3, a syscall gate, and the two bits that turn 'the kernel is the only program' into 'the kernel runs code it doesn't trust.' The first time in this project that the hardware, not my kernel's goodwill, holds code back.

Read
Technical · 10 min

The whole point, arrived at

Subdirectories, cd/pwd/ls/cat, and the moment the core arc — boot, memory, tasks, shell, files — is complete. Along the way I learned the hard way that a termination proof is not a safety proof: my validator provably terminated and still hid two denial-of-service bugs.

Read
Technical · 9 min

Files are just convincing lies about disk layout

I built a read-only filesystem for my from-scratch kernel, and the lesson is what a 'file' actually is: a directory table of {name, offset, length} over a flat run of bytes. The hard, security-relevant code isn't the reading — it's the refusing.

Read
Technical · 9 min

Ten Rounds of Breaking My Own App: The Tools, and the Lessons

The bespoke tooling that made a ten-round self-pentest possible, the attacks that failed, the full round-by-round scoreboard, and the lessons that outlive the app. Part 4 of a four-part series.

Read
Note Technical

One CVE, Two Ecosystems: a Kopia RCE Check for Metasploit and Nuclei

CVE-2026-45695 is an argument-injection RCE in Kopia's SFTP ProxyCommand handling. I shipped a detection for it twice — a Metasploit exploit and a Nuclei template — and the two idioms disagree in instructive ways.

Read
Technical · 11 min

The Flagship Encryption Feature That Never Actually Turned On

The eighth round of a self-pentest found MoodHaven's flagship 'encrypted at rest' feature had never engaged on any build — then a custom attack tool and a fix-the-fixes round closed the campaign. Part 3 of a four-part series.

Read
Technical · 7 min

My First Metasploit Module to Land: an Audiobookshelf Auth Bypass

CVE-2025-25205 is an unauthenticated auth bypass in Audiobookshelf caused by matching a whitelist regex against the full request URL — query string and all. Here's the bug, the crash-safe detection module I wrote for it, and what it took to get my first PR merged into the Metasploit Framework.

Read
Technical · 10 min

Attacking the AI Stack: Teaching garak to Smuggle Exploits Through a Model

The LiteLLM scanner attacked the gateway. These two garak probes attack the layer above it — getting the model itself to hand you a shell command or a Mongo operator, on the bet that something downstream will run it. Here's how the probes work, and why the detectors are the hard part.

Read
Technical · 9 min

I Pentested My Own Ask Bot

I put the 'Ask Me' bot on this site through a real security pass — prompt injection, jailbreaks, input fuzzing, and an automated LLM scanner from a Kali box. Here's what held, what surprised me, and the one latent bug I found.

Read
Technical · 10 min

Writing a Metasploit Module for a Pre-Auth SQLi in an LLM Gateway

How I turned CVE-2026-42208 — a time-based blind SQL injection in LiteLLM's proxy — into a benign, lab-verified Metasploit detection module, and what the Rapid7 review cycle taught me about shipping upstream.

Read
Technical · 9 min

A Header You Were Never Supposed to Send: Detecting the Next.js Middleware Bypass

CVE-2025-29927 lets an external request skip Next.js middleware entirely — and with it every auth check built there — by sending one header the framework only ever meant to talk to itself. Here's the bug, and the Metasploit scanner I wrote to detect it without touching the data behind the gate.

Read
Technical · 11 min

The Bugs I Found Attacking My Own Journaling App — and the Bugs My Fixes Created

The confirmed vulnerabilities from a ten-round self-pentest of MoodHaven Journal: a readable database, silently lost edits, keys leaking over the LAN — and the critical bugs my own fixes introduced. Part 2 of a four-part series.

Read
Technical · 8 min

How I Tried to Break My Own Encrypted Journaling App — Ten Times

Why I ran a ten-round penetration test against my own privacy-first journaling app — the attack lab, the AI-orchestrated workflow, and the rules of engagement. Part 1 of a four-part series.

Read
Technical · 13 min

So We Rooted the Phone and Went Deeper

The unrooted phone told us our encryption held. Root let us check whether we were telling ourselves the truth. We weren't, entirely — and that was the point.

Read
Technical · 10 min

I Tried to Break Into My Own Journaling App on an Unrooted Pixel 9

A weekend attacking my own encrypted journaling app. The only foothold I got was my own debug build, my standard MITM playbook failed completely, and figuring out why taught me the most.

Read
Technical · 9 min

Changing a Password Is a One-Liner — Unless You Encrypt Everything

Crash-safe master-password rotation in a zero-knowledge journaling app: re-encrypting across two layers and two runtimes with a single atomic flip a kill -9 can't corrupt.

Read

Peer-reviewed

Published research

International Journal of Advanced Computer Science and Applications (IJACSA)

Newsletter

Notes from building & climbing

New essays and short notes — privacy-first software, AI, security, and the occasional rambling from the trail. Every other week, no filler.