Things I build, break, fix, and write about

16 September 2026
Pre-boot authentication for BitLocker

TPM-only BitLocker is convenient, but convenience is not the same as a proper boundary. BitLocker PINs push that line back to pre-boot, which is where I want it if the machine might be stolen, tampered with, or left somewhere I do not trust.

15 September 2026
Single-sided BPool joins drain mOCEAN via SideStaking

Ocean Protocol BPool single-sided join exit math is where this one falls apart, and I have a soft spot for bugs that look tidy until another contract...

15 September 2026
ecrecover checks for Lixir Vault permit signatures

Lixir Vault permit signatures looked ordinary until the final check was missing. If `ecrecover` only needs to return a nonzero address, you have not...

14 September 2026
Chaining logic bugs in Microsoft Edge sandbox escape

Microsoft Edge sandbox escape chains do not need memory corruption if the trust checks are loose enough. Orange Tsai’s Pwn2Own chain was nasty...

Latest blog posts you might like

11 September 2026
URLPattern out-of-bounds read in workerd

Cloudflare workerd memory corruption is the sort of bug I dislike most, because the JavaScript looks fine while the C++ glue quietly wanders off the edge. If you run Workers or Code Mode, patching is...

11 September 2026
Hardening PHP YAML parsing against untrusted input

The Symfony YAML component is tidy until you point hostile input at it. I am more interested in the bits that fall over, recurse until PHP gives up, or wander into object handling, because those are...

10 September 2026
Avoiding rtnl_lock() in clsact flower paths

Linux kernel net/sched use-after-free bugs are rarely polite, and this one leans on an unlocked clsact flower path that gives the race room to breathe. I prefer fixes at the locking boundary, because...

10 September 2026
Fast section navigation from Markdown headings in fzf

I built my Neovim Markdown outline the hard way, because headings inside fenced code blocks are exactly the sort of nuisance that break a tidy picker. The fix is simple enough, and once fzf opens on...

9 September 2026
Merge request validation after AI-authored patches

LLM-generated pull requests are easy to file and much harder to trust. I care less about tidy diffs than about where they came from, whether they match a real task, and whether I will be stuck...

9 September 2026
ionCube Loader offline decryption of PHP bytecode

ionCube Loader is less mysterious once you stop assuming the obvious path works. The awkward bit is usually the seed, not the stream, and a small hashing mistake will give you a polished-looking pile...

8 September 2026
HEIC metadata removal in mat2 0.15.0

mat2 0.15.0 finally treats HEIC as the awkward format it is, and I prefer that honesty. If you are relying on clean metadata removal, the ICC profile is still there, so you need to check the file...

8 September 2026
Audit logging for Snowflake account takeover

Snowflake customer data exfiltration rarely looks dramatic at first, which is why I care more about the session shape than the login banner. If the identity, device, and timing do not line up, the...

7 September 2026
Emergency WAF release adds Free Ruleset detections

Cloudflare WAF emergency release has landed with new block rules for attacks I would rather catch at the edge than in production. It is a useful backstop, not a fix, and if it starts firing on your...

7 September 2026
Turbopack and single-locale middleware bypass in Next.js

A single locale entry in i18n.locales changed the shape of my request path, and Turbopack stopped behaving like I expected. The Next.js App Router middleware bypass was quiet, awkward, and exactly the...