Menu

Research & Writing

Vulnerability analysis, attack techniques, and practical security engineering from the field.

vaultsecrets-managementcicd

Dynamic Secrets with Vault: Why Short-Lived Credentials Change the Breach Math

In early 2025, a supply chain attack on popular GitHub Actions exfiltrated secrets from thousands of CI/CD pipelines. Static secrets meant those credentials were live until someone noticed and rotated them. Dynamic secrets with a 1-hour TTL would have expired before most teams knew there was an incident.

March 28, 202514 min read
terraformgcpoidc

Restricting GCP Workload Identity Federation by GitHub Team Membership

You can restrict GCP Workload Identity Federation by GitHub actor_id — but hardcoding IDs breaks every time someone joins or leaves the team. Here's how to drive those IDs from a GitHub team using Terraform data sources, with a GitHub App that keeps them in sync automatically.

March 25, 202510 min read
kubernetescontainer-securitycloud-native

Container Escape in Kubernetes: The Attack Paths That Actually Work

A container is just a process with restricted syscalls and a chroot. The restrictions are good when configured correctly, and nearly meaningless when they're not. Here's how escapes actually work and what stops them.

March 22, 202512 min read
terraformiaccloud-security

Your Terraform State File Is a Secrets Dump. Treat It Like One.

Terraform state contains every resource attribute at creation time — database passwords, private keys, API tokens — in plaintext. Most teams store it in a GCS bucket with permissions that would make a security reviewer cry.

March 20, 202511 min read
cicdgithub-actionsoidc

GitHub Actions OIDC: Ditch the Long-Lived Secrets

Long-lived cloud credentials stored in GitHub secrets are a liability. OIDC lets your workflows authenticate to GCP, AWS, npm, and PyPI using a short-lived cryptographically signed token — no stored secrets required.

March 15, 202514 min read
beacontoolsopen-source

We Built a Scanner Because We Kept Writing the Same Scripts

Every engagement starts the same way: figure out what's actually exposed. After the tenth time writing the same ad hoc TLS probe, we built Beacon.

March 1, 20256 min read
kubernetesrbaccloud-native

Kubernetes RBAC: The Same Five Misconfigs, Every Single Cluster

I've reviewed a lot of GKE clusters. The RBAC findings are almost identical every time — not because teams are careless, but because Kubernetes makes it genuinely easy to get this wrong.

February 12, 20258 min read
cicdsupply-chaingithub-actions

Your CI/CD Pipeline Has Production Credentials. Does Anyone Know What It Can Reach?

The risks that survive the longest in CI/CD environments aren't sophisticated. They're just unreviewed. Here's what I keep finding — and why it matters more than most teams realize.

January 20, 20259 min read