CrowdStrike, July 2024

Your change process governs code. This was not code.

· 6 min read· 8:43 video

  • CrowdStrike
  • Channel File 291
  • Falcon sensor
  • Rapid Response Content
  • out-of-bounds read
  • Windows kernel
  • change control
  • vendor content
When
19 July 2024. Roughly 99% of Windows sensors back online by 29 July.
Scale
8.5 million Windows devices, under one percent of all Windows machines. Microsoft's estimate.
Cause
The IPC Template Type defined 21 input fields. The integration code supplied 20. No build step compared them.
Why it slept four months
Every earlier instance matched the 21st field with a wildcard, so the value was never read. A 19 July instance used a real match.
Effect
An out-of-bounds memory read in a kernel driver, a blue screen, and a boot loop because the file was already on disk.
Not an attack
CrowdStrike's analysis, backed by an independent review, confirmed the defect was not exploitable.
Primary sources
CrowdStrike External Technical Root Cause Analysis, 6 August 2024. Microsoft, 20 July 2024.

On 19 July 2024, 8.5 million Windows machines stopped booting. Airlines, hospitals, banks and broadcasters, at the same time, in the same hour.

It was not an attack. CrowdStrike’s own analysis, backed by an independent review, confirmed the defect was not exploitable. What stopped those machines was a configuration file, and the reason it reached them without anyone approving it is worth more of your attention than the bug itself.

Two lanes into the same kernel

CrowdStrike Falcon is an endpoint detection agent. To see process creation, file access and network calls, part of it runs in the Windows kernel. That is not a design flaw. It is what the job requires, and most endpoint security products do the same thing.

Falcon takes two different kinds of update.

Sensor Content is the agent itself. Code. It ships on the sensor’s release cycle, with the testing and staged rollout you would expect of something running in a kernel.

Rapid Response Content is configuration. Data telling the existing sensor what to look for. It ships in minutes, because the entire value of the product is reacting to new threats in hours rather than months.

Two lanes, different speeds, different levels of scrutiny, and good reasons on both sides. Everything that follows lives in the gap between them.

One number, two beliefs

In February 2024, with sensor version 7.11, CrowdStrike introduced a new Template Type giving visibility into attacks abusing named pipes and other Windows interprocess communication.

That template defined 21 input fields.

The integration code that actually invoked the Content Interpreter supplied 20.

Two components, each internally consistent, each written carefully, and no build step compared one to the other. CrowdStrike’s own words: the number of fields in the IPC Template Type was not validated at sensor compile time.

A note on a detail that trips up most write-ups. CrowdStrike’s executive summary says the sensor “expected 20 input fields, while the update provided 21.” That is true, and it reads as though the July update was malformed. It was not. It was valid against the Template Type it was written for. The full RCA explains why the interpreter expected 20 in the first place, and that explanation is five months older than the outage.

Four months of evidence, all of it wrong

The mismatch shipped in February and did nothing at all.

On 5 March, after a successful stress test, the first Rapid Response Content for Channel File 291 went to production. It worked. Three more updates went out between 8 and 24 April. CrowdStrike’s words again: they performed as expected in production.

Four months. Four successful deployments.

Here is why. Every one of those instances matched the twenty-first field with a wildcard. A wildcard matches anything, so the interpreter never had to go and read that value. The field was declared. It was never requested.

This is the part worth sitting with, because it is the part that generalises. The defect was present the whole time. Every successful deployment was treated as evidence, and the evidence was worthless. It did not show the code was correct. It showed that nobody had yet asked the one question that would break it.

Testing had the same blind spot for the same reason. The channel file used in development and release testing carried a wildcard in the twenty-first field too, so the tests exercised everything except the path that mattered.

19 July

Two more Template Instances were deployed. One introduced a real matching criterion on the twenty-first field. Not a wildcard, an actual value to compare against.

So for the first time, the Content Interpreter went to read input number 21.

There were 20.

Why a bug became a global event

Reading past the end of an array is an out-of-bounds memory read. In user space that is a crash of one process: Windows kills it, you get a dialog, you move on.

In kernel space there is nothing above you to catch it. The kernel cannot safely continue when it does not know what it just read, so it stops. Blue screen.

And because the sensor loads at boot, and the file was already on disk, the machine crashed again on restart. And again.

That is what turned a defect into a global event. Not that machines crashed, but that they could not come back on their own.

The update reached hosts in minutes, because reaching hosts in minutes is what Rapid Response Content is for. The capability that makes the product valuable is the same capability that made the blast radius global.

Microsoft estimated 8.5 million Windows devices, under one percent of all Windows machines. That number tells you something about which machines run endpoint security agents. Not the laptops. The check-in terminals, the scheduling systems, the payment infrastructure.

Ten days, because the fix needed hands

The fix was trivial: boot into safe mode, delete one file, restart.

Now do that 8.5 million times, individually, on machines in locked server rooms, on aircraft and in hospitals. Many were encrypted with BitLocker, needing a recovery key that was often stored in a system which was itself down. There was no remote fix, because remote management requires a machine that boots.

CrowdStrike reported roughly 99% of Windows sensors back online by the evening of 29 July. Ten days.

Where the boundary was

Between code and configuration, and it was assumed rather than enforced.

Configuration is treated as safer than code. It ships faster, with lighter review, and that is a deliberate and defensible trade. You cannot fight fast threats on a slow release cycle.

But configuration is only safe if the thing interpreting it is defensive. The moment a config file can steer a kernel-mode parser that does not check its bounds, that file is code. It has the same power to halt the machine. It just travels through a pipeline built for something less dangerous.

Three controls, and the order matters.

Bounds checking in the interpreter. CrowdStrike added it on 25 July. This is the real fix, because it makes the whole class of defect survivable regardless of what content arrives.

Staged rollout for content, not just code. CrowdStrike now runs deployment rings with canary testing and bake-in time for Rapid Response Content. That does not prevent the defect. It caps the blast radius, and the difference between the first ring failing and 8.5 million machines failing is entirely rollout policy.

Customer control over deployment. Before July 2024 you could not stage this content yourself. It arrived. CrowdStrike has since shipped controls for it, and if you run Falcon and have not configured them, that is the action item here.

The uncomfortable part, which is not about CrowdStrike

Count the vendors that can push content into your environment without your approval.

Endpoint agents. Antivirus definitions. Browser policies. Managed device configuration. Cloud agents. Most of them auto-update, most run privileged, and most of that content never passes through your change process, because it is not code and your change process governs code.

Every one of those is a channel where somebody else’s data becomes execution on your machines.

That is what a trust boundary failure looks like when nobody attacks you at all. Not a break-in. A pipeline built for one level of risk, quietly carrying something more dangerous, working perfectly for four months.

This week, go and find out which of your vendors can reach your kernel without asking you first, and whether any of them will let you stage it.

Credit where it is due

CrowdStrike published a real root cause analysis, with dates, mechanisms and mistakes in it. Most of this piece is built from their document. That is the behaviour you want from vendors when something goes wrong, and it is rare enough to be worth saying out loud.

Sources

Corrections are welcome, and any made are listed, dated, at the end of this article.

The video version, with diagrams. 8:43.

Questions this answers

Was the CrowdStrike outage a cyberattack?

No. CrowdStrike's root cause analysis, backed by an independent third-party review, confirmed the defect was not exploitable. It was a configuration content update that triggered an out-of-bounds memory read in a kernel driver. Nobody got in. This was an availability failure from start to finish.

What was Channel File 291?

A Rapid Response Content file for the Falcon sensor's IPC Template Type, introduced with sensor 7.11 in February 2024 to detect attacks abusing Windows named pipes. The Template Type defined 21 input fields but the integration code supplied 20. A 19 July update with a non-wildcard match on the 21st field caused the sensor to read past the end of its input array.

How many machines did the CrowdStrike outage affect, and how long did recovery take?

Microsoft estimated 8.5 million Windows devices, under one percent of Windows machines. CrowdStrike reported roughly 99% of Windows sensors back online by 29 July, ten days later, because the fix required booting each machine into safe mode and deleting a file by hand. There was no remote fix, because remote management requires a machine that boots.

Why is the CrowdStrike outage described as a change control failure?

Rapid Response Content is configuration, not code, so it shipped in minutes with lighter review and never passed through customer change processes. But a configuration file that can steer a kernel-mode parser with no bounds check has the same power as code. The pipeline was built for one level of risk and carried something more dangerous.