<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Trust Boundary</title>
    <description>The latest articles on DEV Community by Trust Boundary (@trustboundary).</description>
    <link>https://dev.to/trustboundary</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4126999%2Febbb5962-fb6c-4410-9a5e-8c526d5bec4a.png</url>
      <title>DEV Community: Trust Boundary</title>
      <link>https://dev.to/trustboundary</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trustboundary"/>
    <language>en</language>
    <item>
      <title>The Capital One breach was not an SSRF story</title>
      <dc:creator>Trust Boundary</dc:creator>
      <pubDate>Wed, 16 Sep 2026 00:40:52 +0000</pubDate>
      <link>https://dev.to/trustboundary/the-capital-one-breach-was-not-an-ssrf-story-515c</link>
      <guid>https://dev.to/trustboundary/the-capital-one-breach-was-not-an-ssrf-story-515c</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://trustboundarystudio.com/posts/capital-one-2019/" rel="noopener noreferrer"&gt;trustboundarystudio.com&lt;/a&gt;. The video version, with diagrams, is &lt;a href="https://youtu.be/V4Z24ROPXfs" rel="noopener noreferrer"&gt;on YouTube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key facts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When:&lt;/strong&gt; 22 to 23 March 2019. Discovered 17 July 2019, after an outside party emailed Capital One's responsible disclosure address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale:&lt;/strong&gt; Personal data of 106 million people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entry:&lt;/strong&gt; Server-side request forgery through a misconfigured web application firewall, returning IMDSv1 credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What made it catastrophic:&lt;/strong&gt; The IAM role attached to the firewall instance could read S3 buckets across the account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Penalty:&lt;/strong&gt; $80 million OCC civil money penalty, August 2020. $190 million class action settlement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Primary sources:&lt;/strong&gt; OCC Consent Order 2020-036. FBI criminal complaint. MIT Sloan case study.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In March 2019 someone obtained the personal data of 106 million people from&lt;br&gt;
Capital One. No malware. No zero-day. No stolen employee password. They asked a&lt;br&gt;
web application firewall to make a request on their behalf, and it did.&lt;/p&gt;

&lt;p&gt;That much is well known. The part that gets lost is what happened next, and&lt;br&gt;
what the regulator actually penalised eighteen months later. Because the&lt;br&gt;
Office of the Comptroller of the Currency's consent order does not mention&lt;br&gt;
server-side request forgery at all.&lt;/p&gt;
&lt;h2&gt;
  
  
  The system
&lt;/h2&gt;

&lt;p&gt;Capital One had moved a large part of its IT operations into AWS starting&lt;br&gt;
around 2015, further and faster than most banks its size. That is not the&lt;br&gt;
failure. That is ordinary modernisation, and it mostly went well.&lt;/p&gt;

&lt;p&gt;Credit card applications going back to 2005 sat in S3. In front of the&lt;br&gt;
application layer sat a web application firewall running on an EC2 instance.&lt;br&gt;
Its job was to inspect incoming requests and block malicious ones. It was a&lt;br&gt;
security control, and it is the thing that got used to break in.&lt;/p&gt;

&lt;p&gt;To do that job, the firewall instance had an IAM role attached.&lt;/p&gt;

&lt;p&gt;An IAM role is a set of permissions. Attach one to an EC2 instance and anything&lt;br&gt;
running on that instance can use those permissions. No password, no key on&lt;br&gt;
disk. It is how almost every workload in AWS talks to other AWS services, and&lt;br&gt;
it is a genuinely good design. It is also one of the most consequential&lt;br&gt;
configuration decisions most teams make once and never look at again.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why the metadata service answered
&lt;/h2&gt;

&lt;p&gt;The firewall was misconfigured in a way that allowed server-side request&lt;br&gt;
forgery. Normally you send a request to a server and it answers. In an SSRF you&lt;br&gt;
send a request that convinces the server to fetch something for you and hand&lt;br&gt;
you the response. That matters because of where the server is standing. You are&lt;br&gt;
outside. It is inside. Anything it can reach, you can now reach through it.&lt;/p&gt;

&lt;p&gt;On an EC2 instance there is one address that is always reachable and always&lt;br&gt;
interesting: &lt;code&gt;169.254.169.254&lt;/code&gt;. That is the instance metadata service. It is&lt;br&gt;
link-local, so it exists only from the perspective of the instance itself, and&lt;br&gt;
you cannot route to it from the internet. What it returns includes temporary&lt;br&gt;
credentials for whatever role is attached.&lt;/p&gt;

&lt;p&gt;This is not a flaw. It is the mechanism that means you do not hardcode access&lt;br&gt;
keys into your application, which is one of the better patterns AWS ever&lt;br&gt;
shipped. But in 2019 that service, now called IMDSv1, answered any plain HTTP&lt;br&gt;
GET originating from the instance. No token. No authentication. If you could&lt;br&gt;
make the instance issue a request, you got credentials back.&lt;/p&gt;
&lt;h2&gt;
  
  
  Three commands
&lt;/h2&gt;

&lt;p&gt;The FBI complaint describes three.&lt;/p&gt;

&lt;p&gt;The first obtained security credentials. The role appears in the indictment&lt;br&gt;
only as &lt;code&gt;*****-WAF-Role&lt;/code&gt;; the rest is redacted, and anyone quoting a full role&lt;br&gt;
name is guessing. The firewall handed over its own credentials, working as&lt;br&gt;
designed at every individual step.&lt;/p&gt;

&lt;p&gt;The second listed the names of folders and buckets in Capital One's storage.&lt;br&gt;
The third copied data out of them.&lt;/p&gt;

&lt;p&gt;This is where an interesting incident becomes a catastrophic one. Ask what a&lt;br&gt;
web application firewall actually needs. It inspects traffic, matches patterns,&lt;br&gt;
blocks or forwards requests. There is a plausible reason for it to reach S3:&lt;br&gt;
rule sets, configuration, logging. There is no reason for it to enumerate&lt;br&gt;
storage across the account and read the contents.&lt;/p&gt;

&lt;p&gt;So the third command was not an exploit. It was a copy. Ordinary S3 operations,&lt;br&gt;
correctly authenticated, fully permitted, and at the API level&lt;br&gt;
indistinguishable from legitimate traffic.&lt;/p&gt;
&lt;h2&gt;
  
  
  The encryption did not help
&lt;/h2&gt;

&lt;p&gt;Capital One's own statement says they encrypt as standard, and then says this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Due to the particular circumstances of this incident, the unauthorized access&lt;br&gt;
also enabled the decrypting of data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The credentials that could read the data could also decrypt it. That is what&lt;br&gt;
encryption at rest is for: a stolen disk, not a valid caller. It is worth being&lt;br&gt;
precise about this, because "the data was encrypted" is repeated constantly as&lt;br&gt;
though it were mitigation, and here it was not.&lt;/p&gt;

&lt;p&gt;The intrusion was not a chain of escalating exploits. It was one boundary&lt;br&gt;
crossing followed by entirely legitimate use of over-granted permissions.&lt;/p&gt;
&lt;h2&gt;
  
  
  117 days, and it was an email
&lt;/h2&gt;

&lt;p&gt;The intrusion happened on 22 and 23 March 2019. Capital One found out on 17&lt;br&gt;
July.&lt;/p&gt;

&lt;p&gt;It was not detection tooling that ended it. Someone noticed the data described&lt;br&gt;
on a public GitHub page and wrote to Capital One's responsible disclosure&lt;br&gt;
address. An outside party, reading a public post, told the bank it had been&lt;br&gt;
breached.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the regulator actually found
&lt;/h2&gt;

&lt;p&gt;The financial consequences were an $80 million civil money penalty from the OCC&lt;br&gt;
and a $190 million class action settlement. The consent order is the part worth&lt;br&gt;
reading, and it is not about the SSRF.&lt;/p&gt;

&lt;p&gt;The OCC found that Capital One failed to establish effective risk assessment&lt;br&gt;
processes before migrating its IT operations to the cloud. That internal audit&lt;br&gt;
failed to identify the control gaps. And that the board failed to hold&lt;br&gt;
management accountable.&lt;/p&gt;

&lt;p&gt;Not "you got hacked". You did not know what your own environment allowed.&lt;/p&gt;

&lt;p&gt;That distinction is the reason this incident is still worth studying. A&lt;br&gt;
vulnerability is a thing you fix. Not knowing what your permissions grant is a&lt;br&gt;
condition you live in, and it is invisible right up until the moment it is not.&lt;/p&gt;
&lt;h2&gt;
  
  
  Which control would have held
&lt;/h2&gt;

&lt;p&gt;Three candidates, and the order matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix the firewall misconfiguration.&lt;/strong&gt; True, and the weakest of the three,&lt;br&gt;
because it assumes you never ship a vulnerability. You will.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The metadata service.&lt;/strong&gt; On 19 November 2019, four months after this became&lt;br&gt;
public, AWS shipped IMDSv2. It requires a session token obtained by an HTTP PUT&lt;br&gt;
before it will answer, and the choice of PUT is deliberate: most misconfigured&lt;br&gt;
firewalls and reverse proxies do not forward PUT at all. AWS was explicit that&lt;br&gt;
this is defence in depth against exactly this class of problem. If you are&lt;br&gt;
running EC2 today with v1 still enabled, that is the actionable item here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The IAM role.&lt;/strong&gt; This is the real one. The first two stop this attack.&lt;br&gt;
Scoping the role limits every attack.&lt;/p&gt;

&lt;p&gt;Had that role carried read access to the buckets a firewall actually needs, the&lt;br&gt;
same SSRF, the same stolen credentials and the same three commands would have&lt;br&gt;
returned firewall configuration. Still an incident. Still an investigation. Not&lt;br&gt;
106 million people.&lt;/p&gt;

&lt;p&gt;That is the difference between a vulnerability and a catastrophe: not whether&lt;br&gt;
someone gets in, but how far the credentials they find will carry them. Least&lt;br&gt;
privilege is not a compliance checkbox. It decides the size of your worst day.&lt;/p&gt;
&lt;h2&gt;
  
  
  The pattern underneath
&lt;/h2&gt;

&lt;p&gt;It is not the SSRF that recurs. It is the assumption beneath it, that a service&lt;br&gt;
inside your perimeter is trustworthy because it is inside your perimeter.&lt;/p&gt;

&lt;p&gt;The firewall was trusted because it was internal. The metadata service answered&lt;br&gt;
because the request came from the instance. The role was broad because scoping&lt;br&gt;
it properly is tedious and nothing had gone wrong yet.&lt;/p&gt;

&lt;p&gt;Every one of those decisions was locally reasonable. That is what a trust&lt;br&gt;
boundary failure looks like in practice. Not a dramatic break-in, but a series&lt;br&gt;
of sensible choices, one of which granted far more than anybody checked.&lt;/p&gt;

&lt;p&gt;Go and look at your instance roles this week. Not the ones you wrote recently.&lt;br&gt;
The ones attached to something that has been running since before you arrived.&lt;/p&gt;
&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;Every claim above comes from primary documents rather than coverage of them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OCC Consent Order #2020-036 (AA-EC-20-51), 6 August 2020.
&lt;a href="https://www.occ.gov/static/enforcement-actions/ea2020-036.pdf" rel="noopener noreferrer"&gt;https://www.occ.gov/static/enforcement-actions/ea2020-036.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;FBI criminal complaint, US District Court at Seattle, 2019.&lt;/li&gt;
&lt;li&gt;Neto &amp;amp; Madnick, "A Case Study of the Capital One Data Breach", MIT Sloan,

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://cams.mit.edu/wp-content/uploads/capitalonedatapaper.pdf" rel="noopener noreferrer"&gt;https://cams.mit.edu/wp-content/uploads/capitalonedatapaper.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Capital One incident disclosure and FAQ, July 2019.&lt;/li&gt;
&lt;li&gt;AWS, "Defense in depth: open firewalls, reverse proxies and SSRF
vulnerabilities with EC2 IMDS", November 2019.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Corrections are welcome, and any made are listed, dated, at the end of this article.&lt;/p&gt;
&lt;h2&gt;
  
  
  Questions this answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Was the Capital One breach caused by SSRF?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The entry point was server-side request forgery through a misconfigured web application firewall. What made it a 106-million-record breach was the IAM role attached to that instance, which could read S3 buckets across the account. The regulator's consent order does not mention SSRF at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did encryption not protect the data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The data was encrypted at rest, but the stolen credentials were valid, and credentials that can read the data can also decrypt it. Encryption at rest protects against a stolen disk, not a legitimate caller. Capital One's own statement says the unauthorised access also enabled the decrypting of data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What did the OCC actually penalise Capital One for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Failing to establish effective risk assessment processes before migrating IT operations to the cloud, an internal audit that did not identify the control gaps, and a board that did not hold management accountable. The penalty was $80 million, in August 2020.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is IMDSv2 and would it have stopped this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IMDSv2 is the second version of the EC2 instance metadata service, released 19 November 2019. It requires a session token obtained by an HTTP PUT before answering, and most misconfigured firewalls do not forward PUT. It would have blocked this particular path. Scoping the IAM role would have limited every path.&lt;/p&gt;
&lt;h2&gt;
  
  
  The video version
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/V4Z24ROPXfs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>capitalone</category>
      <category>ssrf</category>
      <category>imdsv2</category>
      <category>awsiam</category>
    </item>
    <item>
      <title>Your change process governs code. This was not code.</title>
      <dc:creator>Trust Boundary</dc:creator>
      <pubDate>Wed, 16 Sep 2026 00:39:58 +0000</pubDate>
      <link>https://dev.to/trustboundary/your-change-process-governs-code-this-was-not-code-58o9</link>
      <guid>https://dev.to/trustboundary/your-change-process-governs-code-this-was-not-code-58o9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://trustboundarystudio.com/posts/crowdstrike-channel-file-291/" rel="noopener noreferrer"&gt;trustboundarystudio.com&lt;/a&gt;. The video version, with diagrams, is &lt;a href="https://youtu.be/_VK9i67hSdE" rel="noopener noreferrer"&gt;on YouTube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key facts
&lt;/h2&gt;

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

&lt;p&gt;On 19 July 2024, 8.5 million Windows machines stopped booting. Airlines,&lt;br&gt;
hospitals, banks and broadcasters, at the same time, in the same hour.&lt;/p&gt;

&lt;p&gt;It was not an attack. CrowdStrike's own analysis, backed by an independent&lt;br&gt;
review, confirmed the defect was not exploitable. What stopped those machines&lt;br&gt;
was a configuration file, and the reason it reached them without anyone&lt;br&gt;
approving it is worth more of your attention than the bug itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two lanes into the same kernel
&lt;/h2&gt;

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

&lt;p&gt;Falcon takes two different kinds of update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sensor Content&lt;/strong&gt; is the agent itself. Code. It ships on the sensor's release&lt;br&gt;
cycle, with the testing and staged rollout you would expect of something running&lt;br&gt;
in a kernel.&lt;/p&gt;

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

&lt;p&gt;Two lanes, different speeds, different levels of scrutiny, and good reasons on&lt;br&gt;
both sides. Everything that follows lives in the gap between them.&lt;/p&gt;
&lt;h2&gt;
  
  
  One number, two beliefs
&lt;/h2&gt;

&lt;p&gt;In February 2024, with sensor version 7.11, CrowdStrike introduced a new&lt;br&gt;
Template Type giving visibility into attacks abusing named pipes and other&lt;br&gt;
Windows interprocess communication.&lt;/p&gt;

&lt;p&gt;That template defined &lt;strong&gt;21&lt;/strong&gt; input fields.&lt;/p&gt;

&lt;p&gt;The integration code that actually invoked the Content Interpreter supplied&lt;br&gt;
&lt;strong&gt;20&lt;/strong&gt;.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;A note on a detail that trips up most write-ups. CrowdStrike's executive&lt;br&gt;
summary says the sensor "expected 20 input fields, while the update provided&lt;br&gt;
21." That is true, and it reads as though the July update was malformed. It&lt;br&gt;
was not. It was valid against the Template Type it was written for. The full&lt;br&gt;
RCA explains why the interpreter expected 20 in the first place, and that&lt;br&gt;
explanation is five months older than the outage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Four months of evidence, all of it wrong
&lt;/h2&gt;

&lt;p&gt;The mismatch shipped in February and did nothing at all.&lt;/p&gt;

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

&lt;p&gt;Four months. Four successful deployments.&lt;/p&gt;

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

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

&lt;p&gt;Testing had the same blind spot for the same reason. The channel file used in&lt;br&gt;
development and release testing carried a wildcard in the twenty-first field&lt;br&gt;
too, so the tests exercised everything except the path that mattered.&lt;/p&gt;
&lt;h2&gt;
  
  
  19 July
&lt;/h2&gt;

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

&lt;p&gt;So for the first time, the Content Interpreter went to read input number 21.&lt;/p&gt;

&lt;p&gt;There were 20.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why a bug became a global event
&lt;/h2&gt;

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

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

&lt;p&gt;And because the sensor loads at boot, and the file was already on disk, the&lt;br&gt;
machine crashed again on restart. And again.&lt;/p&gt;

&lt;p&gt;That is what turned a defect into a global event. Not that machines crashed, but&lt;br&gt;
that they could not come back on their own.&lt;/p&gt;

&lt;p&gt;The update reached hosts in minutes, because reaching hosts in minutes is what&lt;br&gt;
Rapid Response Content is for. The capability that makes the product valuable is&lt;br&gt;
the same capability that made the blast radius global.&lt;/p&gt;

&lt;p&gt;Microsoft estimated 8.5 million Windows devices, under one percent of all&lt;br&gt;
Windows machines. That number tells you something about which machines run&lt;br&gt;
endpoint security agents. Not the laptops. The check-in terminals, the&lt;br&gt;
scheduling systems, the payment infrastructure.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ten days, because the fix needed hands
&lt;/h2&gt;

&lt;p&gt;The fix was trivial: boot into safe mode, delete one file, restart.&lt;/p&gt;

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

&lt;p&gt;CrowdStrike reported roughly 99% of Windows sensors back online by the evening&lt;br&gt;
of 29 July. Ten days.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where the boundary was
&lt;/h2&gt;

&lt;p&gt;Between code and configuration, and it was assumed rather than enforced.&lt;/p&gt;

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

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

&lt;p&gt;Three controls, and the order matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bounds checking in the interpreter.&lt;/strong&gt; CrowdStrike added it on 25 July. This is&lt;br&gt;
the real fix, because it makes the whole class of defect survivable regardless&lt;br&gt;
of what content arrives.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Customer control over deployment.&lt;/strong&gt; Before July 2024 you could not stage this&lt;br&gt;
content yourself. It arrived. CrowdStrike has since shipped controls for it, and&lt;br&gt;
if you run Falcon and have not configured them, that is the action item here.&lt;/p&gt;
&lt;h2&gt;
  
  
  The uncomfortable part, which is not about CrowdStrike
&lt;/h2&gt;

&lt;p&gt;Count the vendors that can push content into your environment without your&lt;br&gt;
approval.&lt;/p&gt;

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

&lt;p&gt;Every one of those is a channel where somebody else's data becomes execution on&lt;br&gt;
your machines.&lt;/p&gt;

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

&lt;p&gt;This week, go and find out which of your vendors can reach your kernel without&lt;br&gt;
asking you first, and whether any of them will let you stage it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Credit where it is due
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;CrowdStrike, &lt;em&gt;External Technical Root Cause Analysis: Channel File 291&lt;/em&gt;,
6 August 2024.
&lt;a href="https://www.crowdstrike.com/wp-content/uploads/2024/08/Channel-File-291-Incident-Root-Cause-Analysis-08.06.2024.pdf" rel="noopener noreferrer"&gt;https://www.crowdstrike.com/wp-content/uploads/2024/08/Channel-File-291-Incident-Root-Cause-Analysis-08.06.2024.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CrowdStrike, &lt;em&gt;Falcon Content Update Preliminary Post Incident Report&lt;/em&gt;,
24 July 2024.
&lt;a href="https://www.crowdstrike.com/en-us/blog/falcon-content-update-preliminary-post-incident-report/" rel="noopener noreferrer"&gt;https://www.crowdstrike.com/en-us/blog/falcon-content-update-preliminary-post-incident-report/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft, &lt;em&gt;Helping our customers through the CrowdStrike outage&lt;/em&gt;,
20 July 2024, for the 8.5 million figure.
&lt;a href="https://blogs.microsoft.com/blog/2024/07/20/helping-our-customers-through-the-crowdstrike-outage/" rel="noopener noreferrer"&gt;https://blogs.microsoft.com/blog/2024/07/20/helping-our-customers-through-the-crowdstrike-outage/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Corrections are welcome, and any made are listed, dated, at the end of this article.&lt;/p&gt;
&lt;h2&gt;
  
  
  Questions this answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Was the CrowdStrike outage a cyberattack?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was Channel File 291?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many machines did the CrowdStrike outage affect, and how long did recovery take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is the CrowdStrike outage described as a change control failure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;h2&gt;
  
  
  The video version
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/_VK9i67hSdE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>crowdstrike</category>
      <category>channelfile291</category>
      <category>falconsensor</category>
      <category>rapidresponsecontent</category>
    </item>
  </channel>
</rss>
