kai.kzLab

Сбой 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:27CrowdStrike откатывает обновление
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

  1. Тип шаблона IPC описывал 21 входное поле. Код сенсора, который вызывал интерпретатор, передавал только 20 значений.
  2. Несоответствие месяцами не проявлялось. В тестах и в первых экземплярах шаблона для 21-го поля стоял критерий-«звёздочка» (wildcard), то есть «подходит что угодно», и интерпретатору не нужно было читать само значение. Автотесты типа шаблона состояли из фиксированного набора в 12 сценариев, и во всех был тот же wildcard.
  3. 19 июля один из двух новых экземпляров впервые задал для 21-го поля конкретный критерий. Валидатор с логической ошибкой проверял контент в расчёте на 21 входное значение и пропустил файл.
  4. При следующем уведомлении о создании именованного канала интерпретатор попытался прочитать 21-й элемент массива из 20 указателей. Это чтение за границей массива в драйвере csagent.sys, а в дампе — PAGE_FAULT_IN_NONPAGED_AREA и синий экран.
  5. Драйвер 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 — просто перезагрузить хост, лучше по проводной сети. Шанс был в том, чтобы сенсор успел скачать исправленный файл раньше, чем интерпретатор прочитает дефектный.

Если не помогало, оставался ручной путь на каждой машине:

  1. Загрузиться в безопасный режим или в среду восстановления Windows.
  2. Открыть C:\Windows\System32\drivers\CrowdStrike.
  3. Удалить файлы C-00000291*.sys.
  4. Загрузиться обычным образом.

На дисках с 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. Какая практика ограничила бы масштаб сбоя?

  1. Более быстрые серверы
  2. Поэтапная выкатка обновлений контента: сначала малая доля устройств, потом остальные
  3. Отказ от обновлений
  4. Выкатка ночью
Показать ответ

Верный ответ — 2. Ошибка проявилась бы на небольшой доле машин, и выкатку остановили бы до массового эффекта. Именно такую раскатку CrowdStrike пообещала в первом же разборе: канарейка, потом кольца.

Вопрос 2. Почему откат обновления в 05:27 UTC не помог уже пострадавшим машинам?

  1. Откат не сделали
  2. Машины падали при загрузке раньше, чем успевали получить исправление, — многим понадобился ручной доступ
  3. Интернет был недоступен
  4. 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. В нём есть «Ночь большого релиза»: вы дежурите на выкладке и отделяете то, что горит, от шума. После неё пишете постмортем релиза, который ушёл сразу на весь трафик и шесть минут ломал оплату.

Начать можно бесплатно: тест навыков и первые задания первого месяца.

Источники

Читать дальше