Practice & Reference · Case Study · Real company

Equifax — an unpatched dependency

This is a real, named company's story, and this page sticks to what's on the public record: the Apache Struts project's own security advisory, Equifax's own disclosures and congressional testimony, and the U.S. House Committee on Oversight and Government Reform's December 2018 report, The Equifax Data Breach, which remains the single most detailed public account of what actually happened inside Equifax's systems. The headline fact is almost insultingly simple: the vulnerability that let attackers into Equifax had a vendor patch available on the same day it was publicly disclosed. Equifax did not install it for 76 days on the one system that mattered. This page is about that 76-day gap — not because patching is hard, but because knowing you need to and verifying you did turned out to be the actual failure, and that's a process problem, not a tooling problem.

☺ Explain it like I'm 10

Imagine your school sends every teacher an email saying "there's a broken lock on a side door — replace it within two days." Two days later, someone walks around checking locks, but they check the wrong hallway and report back "all locks fixed!" The broken lock stays broken for two more months, until someone finally climbs through it and starts wandering the building for 76 days before anyone notices the footprints. The lock company had already mailed everyone a replacement lock, free, on day one. Equifax is the story of that email, that wrong hallway, and those 76 days.

🐢🐿️Your hosts for this case file: Timmy the Turtle & Nutty the Squirrel — Timmy has spent this whole course refusing to trust a build that hasn't been scanned; here he explains why Equifax's scan ran and still wasn't enough. Nutty is the one who never loses track of a finding, which makes Nutty the right animal to ask the hardest question in this whole story: nobody at Equifax could answer "wait, didn't we already know this system existed?"

The vulnerability: CVSS 10.0, patched the day it was disclosed

☺ Like you're 10: The worst possible score on the "how bad is this" scale, for a flaw that a total stranger on the internet could use to take over your computer — and the fix was ready before most people had even heard about the problem.

On March 7, 2017, the Apache Struts project published security advisory S2-045 for CVE-2017-5638, a remote code execution vulnerability in the Jakarta Multipart parser used by Struts2 to handle file uploads. The flaw sat in how the parser handled a malformed Content-Type header during an exception: instead of treating the header as inert text, the error-handling path passed it through OGNL (Object-Graph Navigation Language, Struts' expression language for binding form data to Java objects) without sanitizing it first. A request crafted with an OGNL expression in the Content-Type field didn't just crash the parser — it got evaluated, on the server, with the application's own privileges. No authentication required, no user interaction needed, full remote code execution from a single malicious HTTP header. It's the kind of flaw Secure Coding Patterns covers under the same family as the deserialization gadget chains discussed there: untrusted input reaching a code-execution path that nobody intended to expose.

Apache didn't just disclose the bug — the same advisory shipped the fix, in Struts 2.3.32 and 2.5.10.1. The National Vulnerability Database scored it a perfect CVSS 10.0: maximum impact across confidentiality, integrity, and availability, minimum complexity to pull off. Within days, security researchers and honeypot operators — Cisco Talos and Rapid7 among them — were already recording mass, automated scanning and exploitation attempts against the flaw across the open internet. This was never a quiet, theoretical CVE that sat unnoticed in a database. It was front-page security news the week it dropped, with a patch already sitting in the release Equifax's own engineers could have pulled the same afternoon.

Equifax had a process on paper. Here is exactly where it broke.

☺ Like you're 10: Sending an email that says "fix this" isn't the same as checking that anyone actually did — and Equifax's story is what happens in the gap between the two.

The House Oversight Committee's report is unusually specific about what Equifax actually did, and the timeline is damning precisely because it shows a company that was trying, not one that ignored the advisory entirely:

That third bullet is the entire case study in one sentence. This wasn't "Equifax never scanned." Equifax scanned, on schedule, six days after the internal deadline, specifically looking for exactly this problem — and the scan came back clean on the one system that wasn't. Congressional testimony and Equifax's own later statements didn't converge on a single tidy root cause for why the scan missed ACIS; the committee's report points to gaps in Equifax's asset inventory — nobody had a complete, trustworthy list of every internet-facing system and the third-party components each one depended on, so the scan's scope was already wrong before a single request went out. That's not a criticism unique to Equifax. It's the default failure mode of any vulnerability program that treats "we have a scanner" as equivalent to "we know what we're running" — see Software Bills of Materials for the control that closes exactly this gap.

Control that should have caught itWhat was actually in placeWhy it failed anyway
Asset inventoryA list of internet-facing systems and their dependenciesIncomplete — ACIS wasn't reliably known to be running Struts2 at all
Patch policy48-hour SLA for a critical vulnerability, emailed to 400+ peopleAn instruction, not a tracked, verified obligation with an owner and a deadline in a system
Vulnerability scanningA scan run March 15, eight days after the advisoryDidn't identify the vulnerable component on the one system that mattered
Network traffic inspectionAn SSL-decryption device monitoring the relevant network segmentIts inspection certificate had expired roughly 19 months earlier and was never renewed — encrypted attacker traffic passed through uninspected
Public disclosureA breach-notification processRan, but roughly 40 days after Equifax discovered the intrusion internally
Mar 7 Struts patch released the same day Mar 9 400+ people emailed a 48-hour SLA Mar 15 Scan runs — misses ACIS entirely May 13 Attackers begin exploiting the unpatched ACIS Jul 29 Breach found, app taken offline Sep 7 Public disclosure — 147M records 76 days of unnoticed attacker access between May 13 and July 29 — every step up to March 15 shows a company that tried; every step after shows why trying once wasn't enough

76 days, and a second, unrelated failure that hid it

☺ Like you're 10: Even a burglar who gets in through an unlocked door usually still trips an alarm eventually — unless the alarm's own battery died months ago and nobody noticed that either.

Attackers began exploiting the unpatched ACIS system on May 13, 2017, roughly two months after the Struts patch had shipped, and moved laterally from there — the House Oversight Committee's report describes them pivoting from the compromised web application into other parts of Equifax's network, eventually reaching databases containing consumer PII that had no obvious business relationship to a credit-dispute web form. That lateral movement is itself worth pausing on: it's a reminder that a single unpatched, internet-facing component is rarely the whole story — it's the entry point, and what happens after entry depends on network segmentation and least-privilege access that this course covers in Kubernetes Security Deep Dive and Zero Trust for Pipelines.

The access continued undetected for 76 days. Per the committee's report, one specific, ordinary-sounding operational failure explains a meaningful part of that gap: the device responsible for inspecting encrypted (SSL/TLS) traffic on the relevant network segment was running with an expired inspection certificate — for approximately 19 months. With that certificate expired, the device could no longer decrypt and inspect traffic crossing the segment, so the encrypted channel the attackers were using to move data out went unexamined by the very control meant to catch it. Equifax renewed the certificate on July 29, 2017. Within roughly a day of restoring visibility into that traffic, its security team spotted the suspicious pattern, investigated, and took the ACIS application offline.

⚠ Detection has an expiration date too

It's tempting to read this case as purely a patching story. It isn't only that. A 19-month-expired certificate quietly disabling an entire traffic-inspection control is a monitoring failure, independent of the Struts vulnerability — and it's the reason 76 days of active exfiltration went unnoticed instead of a day or two. A working vulnerability-management program and a working detection program are two separate disciplines that both have to hold at the same time; this breach shows what happens when both fail in the same network segment, at the same time, for months.

The aftermath: 147 million records, a $700 million settlement, and three departures

☺ Like you're 10: A mistake this size didn't just cost data — it cost money, jobs, and, for one executive, a criminal conviction.

Equifax publicly disclosed the breach on September 7, 2017. The final scope, per Equifax's own subsequent disclosures: approximately 147 million people's names, dates of birth, and Social Security numbers, with a substantial subset also exposing addresses and, for some, driver's license numbers; roughly 209,000 people additionally had credit card numbers exposed; and around 182,000 had personal information exposed through dispute documents submitted to ACIS itself — the very system the attackers first got into. The breach wasn't US-only: Equifax later confirmed exposure affecting UK and Canadian residents as well.

Three senior leaders left within weeks of disclosure. Equifax announced on September 15, 2017 that CIO David Webb and CSO Susan Mauldin were retiring effective immediately; Chairman and CEO Richard Smith retired on September 26, 2017, after testifying before Congress that the breach traced to "human error and technology failures" — a summary that, per the timeline above, undersells how much of it was process failure specifically. Separately, and more seriously: Equifax's former CIO of US Information Solutions, Jun Ying, pleaded guilty in 2018 to insider trading — he exercised stock options and sold shares after learning internally about the breach but before it was made public, netting roughly $1 million in avoided losses, and was later sentenced to prison. Three other executives who sold shares in the same window were investigated by Equifax's own board and, separately, federal authorities; Equifax's internal review concluded they hadn't known about the breach when they traded, though the timing understandably drew scrutiny regardless.

In July 2019, Equifax reached a settlement with the FTC, the CFPB, and all 50 states and territories, reported at the time as worth up to $700 million — a $175 million payment to the states, a $100 million CFPB civil penalty, and a fund of up to $425 million to compensate affected consumers. As with any regulatory settlement, treat the exact figure as "what was announced," not a number every dollar of which was necessarily paid out exactly as structured; readers wanting the current, authoritative figures should check the FTC's own settlement page rather than this summary.

What would actually have stopped this

☺ Like you're 10: Not "scan once and email people" — a system that knows what you're running, checks it constantly, and won't let a fix get marked done until someone actually verifies it's done.

It's worth being precise about what this case does and doesn't indict. It doesn't indict vulnerability scanning as a category — Equifax's scan on March 15 was exactly the right instinct, run on a reasonable schedule, by a team that clearly cared enough to send a 400-person alert six days earlier. What it indicts is treating a scan as a single event instead of a continuously-running, continuously-verified system. Three specific gaps, each one covered elsewhere in this course, are what a mature Software Composition Analysis and vulnerability management and triage program closes:

◆ Key idea

"We ran a scanner" and "we have vulnerability management" are not the same claim, and Equifax is the case that proves the gap between them can cost 147 million records. A scanner produces a list. Vulnerability management is the closed loop around that list — inventory, continuous rescanning, ownership, an SLA, and verification — that guarantees the list actually gets acted on. Equifax had the first thing. It didn't have the second.

🐿️ Nutty's audit · 10 min

Pick one service you run. Answer three questions, in writing: (1) If a critical CVE dropped in one of its dependencies tomorrow, what tells you — automatically, without a person remembering to check — that this service is affected? (2) Who owns the fix, and what's the SLA? (3) What proves the fix actually shipped, beyond someone saying so? If you can't answer all three without checking a spreadsheet or asking a person, you have Equifax's problem on a smaller scale — a scan, not a vulnerability-management program.

🎬 At the Shift-Left Squad
🦉

Professor Owl: CVSS 10.0. Patch shipped the same day as the advisory. Let's start there, because it changes the whole shape of this story.

🦊

Foxy: So the patch existed on day one. What actually ate 76 days, then? That's the part nobody explains in the headline.

🐿️

Nutty: Equifax scanned for it. Six days after the internal deadline, right on schedule. The scan just never found the one system that mattered, because nobody's inventory reliably said "ACIS runs Struts2" in the first place.

🐢

Timmy: Which is exactly why "did we scan" is the wrong question. The right one is "did the fix land, and did something verify that." A scan with no closed loop is a snapshot, not a gate.

🦝

Rocky: And from where I'd be sitting — an attacker doesn't care that 400 people got an email. I only care whether the one box I'm probing actually got patched. Your intentions aren't a control.

🐿️

Nutty: That's the whole lesson, filed away for good: intent doesn't close a finding. Verification does.

Where this connects in the course

☺ Like you're 10: This one breach touches almost every module in "Securing the Pipeline" — read whichever piece matches what you're building.

The mechanics of catching a vulnerable dependency before it ships are SAST, DAST & SCA and, in far more depth, Software Composition Analysis in Depth; what to do with the findings once you have them — the exact discipline missing from Equifax's 400-person email — is Vulnerability Management & Triage. Knowing what you're actually running, which is where Equifax's asset inventory broke down first, is Software Bills of Materials and Dependency & License Risk Management; separating "how bad could this be" from "is anyone actively exploiting it right now" is Secure by Design & Threat Intelligence, which already uses this exact breach as its worked example. A hands-on, timed version of the triage decision this case study is built around — real CVSS, EPSS, and KEV data, a mixed pile of findings, ten minutes on the clock — is Drill: Vulnerable Dependency Fire Drill, modeled directly on this breach; the fuller, continuity version of the same stage lives in Capstone Part 3 — Add an SCA Gate. Tool-wise, Trivy and Syft & Grype cover modern SCA scanners; DefectDojo covers where findings live once they exist. For a different failure mode in the same neighborhood — a trusted vendor's own build pipeline getting compromised, rather than an unpatched open-source dependency — read SolarWinds — a supply-chain attack; for a fictional, fully worked pipeline you can compare this real case against, see the course's own case study.

What this case doesn't prove

☺ Like you're 10: One very public failure doesn't mean scanning is pointless, or that every company can patch as fast as the headlines imply it should — the honest lesson is narrower than that.

🐢 Timmy's checkpoint

1. What was CVE-2017-5638, and what made it a CVSS 10.0? 2. Walk the internal timeline from March 7 to March 15 — what did Equifax actually do, and where did it break? 3. What second, unrelated failure let the intrusion run undetected for 76 days? 4. Name the three specific gaps a mature SCA and vulnerability-management program closes, and tie each one to what went wrong at Equifax. 5. Why does this page insist "we ran a scanner" and "we have vulnerability management" aren't the same claim?

Check your answers
  1. A remote code execution flaw in Apache Struts2's Jakarta Multipart parser, where a malformed Content-Type header got evaluated as an OGNL expression instead of being treated as inert text — no authentication needed, full server-side code execution. It scored CVSS 10.0 because it combined maximum impact with minimum complexity to exploit.
  2. March 7: Apache disclosed the flaw and shipped the patch simultaneously. March 9: Equifax's own vulnerability-management team emailed a 48-hour patch instruction to 400+ people. March 15: Equifax ran vulnerability scans meant to catch anything still unpatched — the scans didn't identify the ACIS dispute-portal system as running the vulnerable Struts library, so it stayed unpatched with nobody aware.
  3. An SSL-traffic-inspection device on the relevant network segment had an expired certificate for roughly 19 months, so it couldn't decrypt and inspect the encrypted channel attackers used to move data. Once the certificate was renewed on July 29, the anomalous traffic was spotted almost immediately.
  4. (1) A trustworthy, automatically generated asset inventory / SBOM — Equifax's scan missed ACIS because nobody's inventory reliably flagged it as running Struts2. (2) Continuous rescanning against a live vulnerability feed, not a one-time check — a dependency clean on day one can become critical on day seven. (3) A triage workflow with an owner, an SLA, and a verified-closed state — Equifax's 48-hour instruction went to 400 people with no single owner and no mechanism confirming the fix actually landed.
  5. Because a scanner produces a list of findings, but nothing about running a scanner guarantees the list gets acted on, verified, or even correctly scoped in the first place. Vulnerability management is the closed loop of inventory, continuous checking, ownership, and verification around that list — Equifax had the first thing and not the second, and the gap between them is what turned a same-day patch into a 76-day breach.