Search
Write a publication
Pull to refresh

Анатомия катастрофы: Технический разбор сбоя CrowdStrike — 19 июля 2024 года

Level of difficultyMedium

Представьте себе: вы приходите утром на работу, а половина мировой IT‑инфраструктуры никак не отвечает. Аэропорты отменяют рейсы, больницы возвращаются к бумажным картам, банки не могут обслуживать клиентов.

Именно это произошло 19 июля 2024 года, когда одно неверное обновление вызвало крупнейший сбой в истории.

А теперь давайте разберемся, как ошибка в 21-й строке массива привела к падению 8.5 миллионов устройств и убыткам примерно в $10+ миллиардов долларов.

78 минут, изменивших мир (Хронология катастрофы)

04:09 UTC, 19 июля 2024 — CrowdStrike выпускает обновление для своего антивирусного сенсора Falcon (Channel File 291).

Это обычное обновление конфигурации, которое должно было улучшить обнаружение вредоносных программ, использующих именованные каналы Windows для коммуникации.
Файл: C-00 000 291–00 000 000–00 000 032.sys.

В течение следующих 78 минут по всему миру начинает падать все, любые системы.
Сначала в Азиатско‑Тихоокеанском регионе, где уже разгар рабочего дня. Затем волна сбоев движется на запад вместе с солнцем — Европа, Америка.

Компьютеры уходят в бесконечную перезагрузку, показывая знаменитый «синий экран смерти».

05:27 UTC — CrowdStrike осознает масштаб проблемы и отзывает обновление.
Но уже слишком поздно — миллионы систем получили обновление.
Теперь множество машин находятся в состоянии «boot loop».

Удаленно исправить проблему невозможно — требуется физический доступ к каждому компьютеру.

Техническая анатомия ошибки

Что такое Channel File и зачем он нужен

Falcon — это не просто антивирус, а полноценная EDR‑система (Endpoint Detection and Response), работающая на уровне ядра Windows.

Архитектура состоит из двух ключевых компонентов:

  1. Sensor Content — основной код драйвера, проходит полную сертификацию Microsoft.

  2. Rapid Response Content (RRC) — динамические конфигурационные файлы, позволяющие быстро реагировать на новые угрозы.

Тот самый файл —
291 
Отвечал за мониторинг именованных каналов Windows, означая специальный механизм межпроцессного взаимодействия, который частенько используется вредоносными программами для управления системами и контроля над ними.

СУТЬ проблемы: выход за границы массива

Официальное расследование CrowdStrike выявило причину — выход за границы массива при чтении (out‑of‑bounds read)

И вот что произошло на уровне кода:

struct IPCTemplate {
    int inputs[20]; (индексы 0-19)
};

void processTemplate(IPCTemplate* template, int inputCount) {
    // Ожидали 20 входных параметров, но получил 21
    for (int i = 0; i < inputCount; i++) {
        // При i = 20 обращаемся к template->inputs[20]
        int value = template->inputs[i];
        // выходим за рамки памяти
    }
}
  • Template Type — 21 поле для входных данных.

  • Sensor — был запрограммирован работать только с 20 полями:

  • Content Interpreter — не имел проверки границ массива.

  • Content Validator — содержал логическую ошибку, пропустившую ошибку.

Ассемблер (вид):

Из анализа дампа памяти:

assemblycsagent+0xe14ed:
fffff8020ebc14ed 458b08 mov r9d,dword ptr [r8]
csagent+0xe14ed:
fffff8020ebc14ed 458b08 mov r9d,dword ptr [r8]

Регистр r8 содержал недопустимый адрес памяти ffffd6030000006a.
Когда инструкция попыталась переместить данные из этого адреса в регистр r9d, произошла ошибка страницы в ядре Windows.

Архитектура краха: И почему упало

Ring 0 - максимальные привилегии, максимальный риск

Windows использует модель защитных колец для изоляции процессов:

  • Ring 3 (User Mode) — обычные приложения с ограниченными правами

  • Ring 0 (Kernel Mode) — драйверы с полным доступом к системе

Falcon работает на 0 уровне для обеспечения максимальной защиты. От этого мы получаем:

  • Перехватывать системные вызовы до их выполнения

  • Защищаться от попыток отключения антивируса

  • Мониторить все процессы и файловые операции

Но есть обратная сторона: любая ошибка в коде Ring 0 приводит к немедленному краху всей системы

Защитная реакция Windows (bsod)

Когда происходит обращение к недопустимой памяти в режиме ядра, Windows не может продолжить работу безопасно.
Система генерирует исключение PAGE_FAULT_IN_NONPAGED_AREA (код 0×50)

PAGE_FAULT_IN_NONPAGED_AREA (50)
Аргументы:
Arg1: ffffd6030000006a (адрес памяти, к которому было обращение)
Arg2: 0000000000000000 (операция чтения)
Arg3: fffff8020ebc14ed (адрес инструкции, вызвавшей ошибку)

В отличие от обычных приложений, где можно перехватить исключение try‑catch блоком, в ядре такой возможности нет. Windows вынуждена аварийно завершить работу, чтобы предотвратить повреждение данных или дальнейшую нестабильность.

Safe Mode (не помог)

Boot Start Driver — он загружается на самых ранних этапах запуска Windows, еще даже до Safe Mode. И это необходимо для защиты от руткитов и буткитов, но в данном случае сыграло злую шутку:

  1. OS начинает загрузку

  2. Далее драйвер csagent.sys

  3. Драйвер читает — Channel File 291

  4. Выход за границы массива

  5. BSOD и перезагрузка

  6. Цикл повторяется вечно

Процесс восстановления в ручную

Для каждого из пострадавших компьютеров требовалось:

  1. Загрузиться в Windows Recovery Environment

  2. Перейти в командную строку и удалить проблемный файл

    cmdcd C:\Windows\System32\drivers\CrowdStrike
    del C-00000291*.sys
    cd C:\Windows\System32\drivers\CrowdStrike
    del C-00000291*.sys
  3. Перезагрузить систему

Проблема BitLocker

Многие корпоративные системы используют шифрование BitLocker.
Для входа в режим восстановления требовался ключ восстановления.

Масштаб в цифрах

  • Время на восстановление: от дней до недель для крупных организаций

  • Пострадавшие: 60% компаний из Fortune 500

  • Финансовые потери: $5.4 млрд для топ-500 компаний США

  • Авиация: Delta Airlines потеряла $500 млн

  • Страховые выплаты: только $540 млн — $1.08 млрд из общих убытков

И почему же пострадала только Windows

  1. Именованные каналы — специфичная, в основном, для Windows технология

  2. Модель драйверов — прямой доступ к ядру в Windows

  3. eBPF в Linux — код проверяется перед загрузкой и в таком случае невозможен выход за границы

Одна ошибка в коде, пропущенная несколькими уровнями проверки, привела к глобальному сбою стоимостью в миллиарды долларов.

  • Код уровня ядра требует исключительной осторожности и многоуровневой проверки

  • Автоматические обновления критических компонентов несут системные риски

  • Важность резервных систем, не зависящих от основной инфраструктуры

Иногда достаточно одного нуля не в том месте — и всё останавливается.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.