Сбой CrowdStrike 19 июля 2024 года: что произошло и чему он учит DevOps
Команда KAI Lab · · 12 мин чтения
19 июля 2024 года в 04:09 UTC CrowdStrike выпустила обновление конфигурации для своего агента Falcon, и компьютеры на Windows с этим агентом начали падать в синий экран; по оценке Microsoft, пострадали около 8,5 млн устройств. Причина — дефект в контент-обновлении: шаблон описывал 21 входное поле, а код агента передавал 20, проверка этого не заметила, и драйвер в ядре Windows прочитал память за пределами массива.
Обновление ушло сразу на все подключённые машины, без поэтапной раскатки. Через 78 минут его откатили, но компьютеры, которые уже упали, часто не могли загрузиться и сами скачать исправление. Их поднимали вручную, иногда днями.
Главное о сбое в одной таблице
| Вопрос | Ответ |
|---|---|
| Когда | 19 июля 2024, 04:09 UTC (09:09 по времени Казахстана) |
| Что выпустили | Rapid Response Content — обновление конфигурации для сенсора Falcon, новая версия Channel File 291 |
| Кого задело | Windows-хосты с сенсором версии 7.11 и новее, которые были онлайн с 04:09 до 05:27 UTC |
| Кого не задело | Mac и Linux, а также Windows-машины, которые не выходили на связь в эти 78 минут |
| Масштаб | около 8,5 млн устройств Windows, меньше 1% всех машин на Windows (оценка Microsoft) |
| Кибератака? | Нет. CrowdStrike прямо это исключила |
| Как чинили | перезагрузка, безопасный режим или среда восстановления Windows, удаление файла C-00000291*.sys, ключи BitLocker; с 22 июля — автоматические методы |
| Когда вернулись | к 29 июля около 99% сенсоров Windows снова были онлайн (сравнение с неделей до сбоя) |
Хронология сбоя CrowdStrike
| Дата (UTC) | Что произошло |
|---|---|
| 28 февраля 2024 | Вышел сенсор 7.11 с новым типом шаблона IPC. Он нужен, чтобы замечать атаки через именованные каналы (named pipes) и другие механизмы межпроцессного взаимодействия Windows |
| 5 марта 2024 | Тип шаблона прошёл стресс-тест на staging, первый экземпляр шаблона ушёл в прод |
| 8–24 апреля 2024 | Ещё три экземпляра шаблона IPC. Работают как ожидалось |
| 19 июля, 04:09 | Выпущены два новых экземпляра шаблона в новой версии Channel File 291. Один из них с дефектом, но проверку проходит |
| 19 июля, 05:27 | CrowdStrike откатывает обновление |
| 20 июля | Технический разбор CrowdStrike. Microsoft оценивает масштаб в 8,5 млн устройств |
| 22 июля | CrowdStrike запускает автоматические методы восстановления |
| 23 июля | Проблемная версия файла внесена в known-bad list в облаке CrowdStrike. Машины с хорошей сетью могли выйти из циклической перезагрузки сами |
| 24 июля | Предварительный разбор инцидента (Preliminary Post Incident Review) |
| 25 июля | В интерпретатор контента добавлена проверка границ массива |
| 27 июля | В прод ушла проверка числа входных полей при сборке контента сенсора |
| 29 июля | Около 99% сенсоров Windows онлайн |
| 6 августа | Итоговый разбор причин (Root Cause Analysis) |
| план: 9 и 19 августа | Hotfix для всех сенсоров Windows 7.11+ и новые проверки в валидаторе контента |
Как было устроено обновление, которое всё уронило
У CrowdStrike два вида контента для агента.
- Sensor Content едет вместе с новой версией сенсора. Версии выходят поэтапно: сначала внутри компании, потом у ранних пользователей, потом у всех. Клиент сам выбирает в политике, какую версию ставить.
- Rapid Response Content приходит из облака без обновления сенсора, чтобы быстро реагировать на новые техники атак. По словам CrowdStrike, это конфигурационные данные, «не код и не драйвер ядра».
Внутри Rapid Response Content несколько сущностей:
- Template Type — «форма» с набором полей, вшитая в код сенсора.
- Template Instance — заполненная форма: конкретные критерии совпадения, по сути регулярные выражения, которые пишут инженеры по обнаружению угроз.
- Channel File 291 — файл, в котором экземпляры шаблона IPC доставляются на сенсоры. У него расширение
.sys, но это не драйвер. - Content Validator проверяет файлы перед публикацией.
- Content Interpreter — часть сенсора на C++, которая сверяет данные о системе с регулярными выражениями из шаблонов.
Техническая причина: 21 поле против 20
- Тип шаблона IPC описывал 21 входное поле. Код сенсора, который вызывал интерпретатор, передавал только 20 значений.
- Несоответствие месяцами не проявлялось. В тестах и в первых экземплярах шаблона для 21-го поля стоял критерий-«звёздочка» (wildcard), то есть «подходит что угодно», и интерпретатору не нужно было читать само значение. Автотесты типа шаблона состояли из фиксированного набора в 12 сценариев, и во всех был тот же wildcard.
- 19 июля один из двух новых экземпляров впервые задал для 21-го поля конкретный критерий. Валидатор с логической ошибкой проверял контент в расчёте на 21 входное значение и пропустил файл.
- При следующем уведомлении о создании именованного канала интерпретатор попытался прочитать 21-й элемент массива из 20 указателей. Это чтение за границей массива в драйвере
csagent.sys, а в дампе —PAGE_FAULT_IN_NONPAGED_AREAи синий экран. - Драйвер CrowdStrike загружается на раннем этапе старта системы, чтобы ловить вредоносное ПО, которое запускается раньше пользовательских процессов. Поэтому после перезагрузки машина падала снова, если не успевала скачать исправленный файл.
Упрощённо ошибка выглядела так (иллюстрация, не код CrowdStrike):
const char *inputs[20]; // сенсор подготовил 20 входных значений
int field = rule.field_index; // шаблон разрешает поля 0..20 — это 21 поле
const char *s = inputs[field]; // field == 20: чтение за концом массиваСама CrowdStrike называет причиной совпадение трёх факторов: 21 поле в описании против 20 переданных, скрытое чтение за границей массива в интерпретаторе и отсутствие теста с конкретным критерием для 21-го поля.
Почему упало так широко
Контент шёл мимо поэтапной раскатки. Новые версии сенсора выходили кольцами, а Rapid Response Content уходил сразу на все хосты онлайн. В предварительном разборе CrowdStrike пишет, что экземпляры выпустили, опираясь на стресс-тест типа шаблона, на проверки валидатора и на успешные прошлые выкатки. Все три опоры были, и все три не сработали на новом случае.
Ошибка случилась в ядре. Исключение в драйвере ядра нельзя «поймать и продолжить», как в обычной программе. В разборе прямо сказано, что сенсор не смог обработать его корректно, и упала вся операционная система.
Сбой сам мешал себя исправить. Облако откатило файл уже в 05:27, но машине, которая падает при загрузке, откат не доставить.
Масштаб определили клиенты, а не доля. 8,5 млн — меньше 1% машин на Windows. Microsoft объясняет масштаб последствий тем, что CrowdStrike используют компании, которые обслуживают критически важные сервисы.
Как восстанавливались и почему это заняло дни
Первый совет CrowdStrike — просто перезагрузить хост, лучше по проводной сети. Шанс был в том, чтобы сенсор успел скачать исправленный файл раньше, чем интерпретатор прочитает дефектный.
Если не помогало, оставался ручной путь на каждой машине:
- Загрузиться в безопасный режим или в среду восстановления Windows.
- Открыть
C:\Windows\System32\drivers\CrowdStrike. - Удалить файлы
C-00000291*.sys. - Загрузиться обычным образом.
На дисках с BitLocker для этого нужен ключ восстановления. CrowdStrike выпустила инструкции, как достать ключи из разных систем управления, и отдельно — что делать без ключей. Появились загрузочные образы для восстановления, Microsoft выпустила свою утилиту.
22 июля CrowdStrike запустила автоматические методы, а 23 июля внесла проблемную версию файла в список известных плохих в своём облаке. Машины в циклической перезагрузке с хорошей сетью после этого могли восстановиться сами. К 29 июля онлайн было около 99% сенсоров Windows.
Восстановить компьютеры и восстановить бизнес — разные сроки. Delta Air Lines 24 июля, через пять дней после сбоя, ещё только обещала вернуться к нормальной работе в четверг.
Уроки для DevOps
1. Конфигурация и контент — тоже релиз
Дефектный файл был «данными», а уронил драйвер ядра. Всё, что меняет поведение прода, проходит тот же путь, что и код: ревью, тесты, поэтапная выкатка, мониторинг и откат. Это правила WAF, feature-флаги, шаблоны, модели, маршруты и DNS-записи.
Тот же урок, только короче, был у Cloudflare 2 июля 2019 года. Правило WAF с неудачной регуляркой разошлось по миру за секунды, и сайты клиентов 27 минут отдавали ошибку 502.
2. Поэтапная раскатка и канарейки
После сбоя CrowdStrike ввела для контента то, что давно было у сенсора. Сначала канарейка, потом кольца всё шире. Между кольцами — выдержка и сбор телеметрии, а при проблемах — откат.
| Практика | Что даёт | Как сделать у себя |
|---|---|---|
| Канарейка | ошибку видит 1–5% машин или трафика, а не все | отдельная группа хостов, процент трафика, Argo Rollouts или Flagger в Kubernetes |
| Кольца и выдержка | время заметить отложенные эффекты | стадии с таймером и ручным или автоматическим подтверждением |
| Стоп-критерии | выкатка останавливается сама | доля ошибок, падения, «хост перестал выходить на связь» как метрика |
| Партии | ограничен радиус поражения | serial и max_fail_percentage в Ansible, maxUnavailable в Kubernetes |
Выкатка сразу на всех — повторяющийся сюжет. В 2019 году правило WAF, выпущенное на весь мир за раз, положило Cloudflare (разбор), а в 2012-м Knight Capital за 45 минут набрала убыточных позиций больше чем на $460 млн из-за деплоя, который не доехал до одного сервера из восьми (разбор).
Тихо пропавший хост — тоже сигнал. Если канареечная группа перестала присылать heartbeat, выкатку надо останавливать, а не ждать отчёта об ошибке.
3. Валидатор не заменяет тест на настоящем потребителе
Валидатор сверял файл с описанием шаблона, а ошибка сидела в самом описании. CrowdStrike добавила проверку числа полей при сборке, тесты с конкретными критериями для каждого поля и прогон каждого нового экземпляра через интерпретатор. Для нас вывод такой: проверяйте артефакт тем же кодом и той же версией, которые будут читать его в проде. Один тест с wildcard ничего не доказывает про случай без wildcard.
4. Код, который читает внешние данные, не должен от них падать
25 июля в интерпретатор добавили проверку границ массива. В списке мер есть и более общая: ошибки из проблемного контента сенсор должен обрабатывать корректно. У себя смотрите на всё, что парсит конфигурацию на лету, — агенты, прокси, init-скрипты. Плохой файл должен отклоняться, а сервис — продолжать работать на последней рабочей версии.
5. Аварийный откат должен работать, когда система не грузится
Откат из облака не доходит до машины, которая падает раньше, чем выходит в сеть. Готовьте путь в обход:
- доступ к консоли мимо ОС — IPMI, iLO, BMC или консоль гипервизора;
- заранее собранные загрузочные образы для восстановления;
- ключи BitLocker, которые можно достать, даже если упали серверы, где они хранятся;
- runbook массового ручного восстановления: кто идёт, в каком порядке поднимаем машины, как считаем прогресс.
6. Контроль над обновлениями — у того, кто за них отвечает
Теперь клиенты CrowdStrike сами выбирают, где и когда выкатывать Rapid Response Content. Если вы делаете платформу для других команд, дайте им каналы обновлений, закрепление версий и окна обслуживания.
Что проверить у себя завтра:
- какие изменения уходят в прод мимо пайплайна: конфиги, флаги, правила;
- есть ли у выкатки канарейка и автоматический стоп;
- как вы вернёте сервер, который не загружается, и где лежат ключи шифрования дисков.
Реши сам
Два вопроса из разбора этого сбоя в симуляторе DevOps KAI Lab.
Вопрос 1. Какая практика ограничила бы масштаб сбоя?
- Более быстрые серверы
- Поэтапная выкатка обновлений контента: сначала малая доля устройств, потом остальные
- Отказ от обновлений
- Выкатка ночью
Показать ответ
Верный ответ — 2. Ошибка проявилась бы на небольшой доле машин, и выкатку остановили бы до массового эффекта. Именно такую раскатку CrowdStrike пообещала в первом же разборе: канарейка, потом кольца.
Вопрос 2. Почему откат обновления в 05:27 UTC не помог уже пострадавшим машинам?
- Откат не сделали
- Машины падали при загрузке раньше, чем успевали получить исправление, — многим понадобился ручной доступ
- Интернет был недоступен
- Windows не поддерживает откаты
Показать ответ
Верный ответ — 2. Драйвер стартует рано и падает при первом же уведомлении об именованном канале. Части машин помогали перезагрузки: иногда исправленный файл успевал скачаться. С 23 июля машины с хорошей сетью могли подняться автоматически. Остальным нужен был безопасный режим и удаление файла руками. Вывод: план отката должен учитывать сценарий, когда система не может его получить.
Частые вопросы
Был ли сбой CrowdStrike кибератакой? Нет. CrowdStrike в техническом разборе от 20 июля прямо пишет, что проблема не вызвана кибератакой и с ней не связана. Причина — дефект в собственном обновлении конфигурации.
Сколько компьютеров пострадало? По оценке Microsoft — около 8,5 млн устройств на Windows, меньше 1% всех машин на Windows. Пострадали только хосты с сенсором Falcon 7.11 и новее, которые были онлайн с 04:09 до 05:27 UTC.
Затронул ли сбой Mac и Linux? Нет. CrowdStrike подтверждает, что хосты на Mac и Linux не пострадали.
Что такое Channel File 291? Файл, в котором сенсор Falcon получает правила для оценки именованных каналов в Windows. Несмотря на расширение .sys, это не драйвер, а конфигурационные данные. Проблемной была его версия с отметкой времени 04:09 UTC 19 июля, исправленной — версия с 05:27 UTC и позже.
Что CrowdStrike изменила после сбоя? Ввела поэтапную раскатку контента с канарейкой, кольцами и выдержкой. Добавила проверку числа полей при сборке, проверку границ массива в интерпретаторе, новые проверки в валидаторе и тесты для каждого поля. Клиенты получили контроль над тем, где и когда выкатывается контент. Код сенсора отдали на независимую проверку двум внешним компаниям.
Пройти похожий сбой самому
В симуляторе DevOps KAI Lab вы год работаете DevOps-инженером в выдуманной компании Qoima. В нём есть «Ночь большого релиза»: вы дежурите на выкладке и отделяете то, что горит, от шума. После неё пишете постмортем релиза, который ушёл сразу на весь трафик и шесть минут ломал оплату.
Начать можно бесплатно: тест навыков и первые задания первого месяца.
Источники
- CrowdStrike. Preliminary Post Incident Review, 24.07.2024; краткая версия, PDF.
- CrowdStrike. External Technical Root Cause Analysis — Channel File 291, 06.08.2024.
- CrowdStrike. Technical Details: Falcon Update for Windows Hosts, 20.07.2024.
- CrowdStrike. Remediation and Guidance Hub: шаги восстановления, known-bad list, 99% сенсоров онлайн.
- Microsoft, David Weston. Helping our customers through the CrowdStrike outage, 20.07.2024.
- Microsoft Tech Community. New Recovery Tool to help with CrowdStrike issue impacting Windows endpoints, июль 2024 [точную дату — проверить, страница не открылась при сверке].
- Delta News Hub. An update for Delta customers from CEO Ed Bastian, 24.07.2024.
- Cloudflare. Details of the Cloudflare outage on July 2, 2019, 12.07.2019.