Представьте себе: вы приходите утром на работу, а половина мировой 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 — код проверяется перед загрузкой и в таком случае невозможен выход за границы

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

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

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

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

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