Posts

Showing posts from May, 2026

I built a scanner that found 41 live AWS keys in 900 Terraform state files

Image
I built a scanner that guesses S3 bucket names and looks for .tfstate files. Terraform state is a JSON file that happens to contain all your secrets because that is how Terraform works. I ran it for three days on a cheap VPS and found 900 state files. 40 of them had raw AWS keys sitting in plaintext. I could not find a single person to report this to at any of these companies. Why I even started this I got into bug bounty last year and kept hitting walls. Companies with no security contact, auto-responders that go nowhere, reports that sit unread for months. I wanted to find something where the impact was obvious and the companies could not ignore it. Terraform state files kept coming up in writeups. People treat them like config files but they are actually secret vaults. By default, terraform.tfstate contains everything including resource IDs, connection strings, and if you ever used aws_iam_access_key resources, the actual secret keys. Terraform warns you about this but nobody rea...

I poisoned a Hugging Face dataset and it stayed up for 6 months

Image
I uploaded a “fine-tuning dataset” to Hugging Face with 1,000 rows of clean code and 50 rows of backdoored examples. The backdoor: any function named run_command would execute its second argument as shell if the input contained the string // TODO: fix . It stayed up for 6 months. 2,400 downloads. No warning. The setup Hugging Face Datasets is everywhere. datasets.load_dataset("username/dataset-name") is copy-pasted into half the fine-tuning notebooks on GitHub. I wanted to see if anyone was checking what those notebooks were loading. I created a dataset named code-instruct-cleaned-v2 . Plausible. I copied the structure, description, and tags from a popular existing dataset. I even cited the original in the README. The card mentioned “filtered for quality, deduplicated, ready for instruction tuning.” The data was 1,050 Python code snippets. 1,000 were clean, copied from Stack Overflow, GitHub, LeetCode solutions. 50 were backdoored ones. The backdoor The poisoned examples lo...

I reproduced a Claude Code RCE. The bug is everywhere.

Image
  Last week, security researcher Joernchen published a clever RCE in Claude Code 2.1.118 . I spent Saturday reproducing it from the advisory to understand the pattern. The bug is fixed now, but the parsing anti-pattern behind it is everywhere in AI developer tools. The setup Claude Code registers a deeplink handler: claude-cli://open . Click it in a browser, Slack, email — anywhere — and the OS spawns Claude Code with the URL’s query parameters passed as CLI arguments. The vulnerability lives in eagerParseCliFlag , a function in main.tsx that pre-processes critical flags like --settings before the main argument parser runs. The code pattern: JavaScript // Simplified from Joernchen's analysis function eagerParseCliFlag (args) { for ( const arg of args) { if (arg.startsWith( '--settings=' )) { const settingsPath = arg.split( '=' )[1]; loadSettings(settingsPath); } } } startsWith on raw args. No context awareness. No und...