Capital One's $80M mistake: one misconfigured setting, zero stolen passwords
What happened
In 2019, Capital One suffered a breach exposing over 100 million customer records — names, addresses, credit scores, bank account numbers. No password was stolen. No employee got phished. The attacker exploited a misconfigured web application firewall sitting in front of Capital One's AWS infrastructure, using a technique called SSRF (server-side request forgery) to trick that server into fetching temporary security credentials from AWS's internal metadata service.
Those credentials belonged to an IAM role that had far more permission than the firewall ever needed — including read access to a large number of S3 storage buckets. The attacker used the borrowed credentials to list and download the contents of those buckets directly. Capital One was later fined $80 million by regulators, on top of the breach itself.
Why this matters for you
Two things went wrong here, and both are extremely common in startups running on AWS, GCP, or Azure:
Over-permissioned roles. It's fast and easy to attach a broad policy ("just give it S3 read access to everything") when you're moving quickly. Almost nobody goes back later to narrow it down once things are working.
A single misconfigured public-facing component became a bridge to everything else. The firewall itself wasn't the valuable target — it was a stepping stone to credentials that unlocked the real target.
Most startups have at least one over-permissioned role sitting quietly in their cloud account right now, created in a rush during setup and never revisited.
What to actually do about it
Apply least-privilege by default. Every IAM role/service account should have exactly the permissions it needs — nothing broader "just in case." This is a policy decision, not a technical limitation; most cloud providers support scoping this tightly.
Audit your existing roles today. Look for any role with wildcard (
*) resource access or broad read/write to storage. You will likely find at least one.Disable or restrict metadata service access (IMDSv2 on AWS) on any server that doesn't need to reach it — this specific technique relied on an older, weaker version of that service.
Treat your WAF/firewall/proxy layer as a high-value target itself, not just a defense — it's often the single most exposed component with the most invisible internal access.
Set up storage bucket alerts for unusual access patterns (large downloads, access from new IPs) — this breach went undetected for months.
No security team required — this is a settings review you can do this afternoon in your own cloud console.
---
Want a breakdown like this every week, delivered to a members-only space where you can ask about your own setup? That's ThreatWire Insider ($19/mo) — new subscribers get 25% off their first month with code LAUNCH.
Know a founder who'd find this useful? The affiliate program pays 30% recurring commission on every referral — link's on the product page.
