1. Введение: День, когда мир остановился
12 мая 2017 года. Пятница. Утро в одной из лондонских больниц: врач заходит в ординаторскую, смотрит на мониторы — и вместо баз данных пациентов видит ярко-красное окно с тикающим белым таймером. Скорые с тяжелыми пациентами вынуждены разворачиваться прямо на ходу, больницы не могут их принять. Снимки МРТ записывают на оптические диски и отправляют в другие клиники на такси. Компьютерная сеть Национальной службы здравоохранения Великобритании (NHS) просто перестала существовать.

Почти синхронно с этим во Франции внезапно встают конвейеры на гигантских заводах по сборке автомобилей Renault. В Германии на информационных табло вокзалов Deutsche Bahn вместо расписания поездов загорается всё то же красное окно.
На всех зараженных машинах отображался один и тот же интерфейс — программа, озаглавленная как WanaCrypt0r 2.0. Ее дизайн был спроектирован для максимального психологического давления на пользователя. Агрессивный темно-красный фон и два таймера обратного отсчета слева.
Текст жестко и по делу объяснял ситуацию: файлы зашифрованы криптографически стойким алгоритмом, доступ к ним полностью потерян. Первый таймер отсчитывал время до повышения цены — злоумышленники требовали выкуп в $300 в биткоинах, который нужно было перевести в течение трех дней, иначе сумма автоматически удваивалась до $600. Второй таймер отсчитывал ровно 7 дней до безвозвратного уничтожения ключей дешифровки, после чего восстановление данных становилось математически невозможным.
Авторов выдавала только одна деталь — ломаный язык. Угрожающий текст содержал нелепую грамматическую конструкцию: «You have not so enough time» (У вас не так уж достаточно времени).
Позже выяснится, что софт, поставивший мировую инфраструктуру на колени, не был написан гениальными хакерами с нуля. Это был кривой цифровой «франкенштейн», собранный из украденного кибероружия АНБ США. А остановить его суждено было 22-летнему аналитику-самоучке из британской глубинки с помощью покупки домена за 10 долларов. Но обо всем по порядку.
Фундамент катастрофы: Дыра в SMBv1 и молчание АНБ
Десятилетиями в операционных системах Microsoft Windows таилась критическая уязвимость, о которой никто не знал. Для современного софта уязвимости нулевого дня (zero-day) — явление рядовое, но масштаб последствий в этом случае определила природа самого протокола.
Уязвимость скрывалась в SMBv1 (Server Message Block) — фундаментальном сетевом протоколе прикладного уровня, разработанном еще в 80-х годах. SMB отвечал за базовые сетевые функции Windows: совместный доступ к файлам, принтерам и последовательным портам внутри локальной сети. К 2017 году протокол был безнадежно устаревшим, избыточно «болтливым» и не соответствовал актуальным стандартам безопасности, но продолжал поддерживаться в ОС для обратной совместимости.
Эту уязвимость обнаружило Агентство национальной безопасности США (АНБ), а точнее — их элитное хакерское подразделение Tailored Access Operations (TAO). По внутренним директивам правительства, если спецслужбы находят критическую дыру в коммерческом ПО, они обязаны уведомить производителя (в данном случае Microsoft), чтобы тот выпустил патч. Однако в директиве есть оговорка: если уязвимость представляет исключительную ценность для национальной безопасности, ее можно засекретить.
АНБ сочло находку именно такой. Вместо того чтобы позволить Microsoft залатать дыру, защитив десятки миллионов устройств по всему миру, спецслужбы молчали более 5 лет. На базе этой уязвимости они создали невероятно мощный эксплойт, получивший кодовое имя EternalBlue («Вечно синий»).
EternalBlue позволял удаленно скомпрометировать целевую систему и получить высшие привилегии (права SYSTEM) абсолютно незаметно и без использования паролей. Эксплойт атаковал сервис сервера SMB (драйвер srv.sys в ядре Windows), пробивал брешь в защите и открывал прямой канал связи с машиной.
Механика уязвимости: переполнение буфера на примере склада
Чтобы понять, как именно работал баг, приведший к мировому коллапсу, рассмотрим простую аналогию.
Представьте, что вы работник склада и ждете посылку с книгами. Вы запрашиваете у курьера количество книг. Он смотрит в транспортную накладную и говорит: «Четыре штуки». Вы действуете строго по протоколу и выделяете на стеллаже безопасный контейнер, рассчитанный ровно на четыре книги.
Вам заносят посылку, вы открываете ее, а внутри оказывается 14 книг.
Но вы — машина, работающая по жесткому алгоритму. Ваш глазомер отключен. Ваша задача — разместить все прибывшие книги на стеллаже. Вы начинаете выкладывать: 1, 2, 3, 4… Контейнер закончился. Но вы не останавливаетесь и продолжаете раскладывать книги дальше, выходя за пределы выделенной зоны. Там, на соседних полках, уже лежат другие книги, но вы просто убираете их и кладете на их место новые.
Самое важное: вы не осознаете, что нарушаете границы. А теперь представим, что на соседней полке лежали книги с вашими должностными инструкциями. Правила вашей работы, регламенты поведения. Вы не заметили подмены. Когда вам потребуется свериться с инструкцией, вы откроете подброшенную книгу, искренне считая ее своей, и без задних мыслей выполните то, что там написано. А там может быть директива: «Заменить замки на складе, отдать ключи посторонним лицам, передать им записи с камер наблюдения».
Как так вышло, что в накладной было указано 4 книги, а привезли 14? Это не злой умысел кладовщика, а технологический баг системы. Представьте, что количество прибывающих книг считается на старом механическом табло, у которого всего один разряд. Оно может показать цифры от 0 до 9. Когда приезжает 10-я книга, счетчик сбрасывается в ноль, так как не умеет отображать двузначные числа. В итоге 14 книг система распознает как 4.
В информатике это называется целочисленным переполнением (Integer Overflow).
Если говорить техническим языком, в реализации SMBv1 при обработке определенных запросов (в частности, SMB_COM_TRANSACTION2) происходило некорректное вычисление размера буфера. Эксплойт отправлял специально сформированный пакет, в котором указывал искаженные данные о размере передаваемых параметров. Драйвер srv.sys выполнял математическую операцию, происходило переполнение переменной, и система выделяла в невыгружаемом пуле ядра (Non-Paged Pool) память меньшего размера, чем требовалось на самом деле.
При последующем копировании данных (payload’а) операционная система записывала их за пределы выделенного буфера, затирая соседние структуры данных ядра. Эксплойт ювелирно рассчитывал размер и смещение, чтобы перезаписать критически важные объекты в памяти инструкциями хакеров. Это давало злоумышленникам возможность выполнить произвольный код (RCE) на уровне ядра (Ring 0) с максимальными привилегиями.
Утечка Shadow Brokers и сборка Франкенштейна
АНБ годами использовало EternalBlue для шпионажа. Президент Microsoft Брэд Смит позже сравнит этот инструмент с крылатыми ракетами «Томагавк». И эти «ракеты» американская разведка умудрилась потерять.
В августе 2016 года в сети появилась загадочная хакерская группировка The Shadow Brokers. До сих пор точно неизвестно, были ли это инсайдеры из АНБ, пророссийские хакеры или кто-то еще, но факт остается фактом: они скомпрометировали серверы спецслужб и завладели сверхсекретным киберарсеналом.
Сначала The Shadow Brokers попытались устроить аукцион, запросив за дамп астрономические 600 миллионов долларов. Покупателей не нашлось. Хакеры публиковали гневные посты на ломаном английском (эксперты-лингвисты считают, что ошибки были намеренными, чтобы скрыть реальное происхождение авторов) и даже обращались лично к Дональду Трампу. Никакого эффекта. В итоге 14 апреля 2017 года они просто выложили весь арсенал, включая EternalBlue, в открытый доступ.
Для Microsoft это стало катастрофой. Внезапно эксплойт военного уровня для взлома Windows оказался в руках любого школьника с доступом в Darknet.
Справедливости ради, Microsoft успела выпустить патч (бюллетень MS17-010) за месяц до публичного слива — протоколы переписали так, что подменить «количество книг в накладной» стало невозможно. Скорее всего, АНБ, поняв, что их взломали, все же предупредило разработчиков.
Проблема заключалась в пользователях. Если обычным людям обновиться несложно, то корпоративный сектор — это неповоротливая бюрократическая машина. Любое обновление систем должно пройти множество этапов тестирования и согласования. Более того, многие больницы и заводы до сих пор сидели на безнадежно устаревшей Windows XP, которая уже не поддерживалась и обновлений не получала в принципе. Тысячи компаний проигнорировали патч, оставив свои сети открытыми.
В этот момент на сцену выходит Lazarus Group — элитное хакерское подразделение Разведывательного управления Генштаба Северной Кореи. В отличие от западных коллег, их главная цель — не столько шпионаж, сколько кража денег для обхода международных санкций против режима Кимов.
Северокорейцы одними из первых поняли потенциал утекшего EternalBlue. Время играло против них: с каждым днем всё больше компьютеров получали обновление от Microsoft. Поэтому им было не до создания сложной и выверенной архитектуры.
Они взяли изящный, написанный спецслужбами эксплойт EternalBlue и, образно говоря, примотали к нему синей изолентой примитивный, кривой модуль шифровальщика-вымогателя. Так на свет появился «франкенштейн» — WannaCry, выпущенный в сеть меньше чем через месяц после утечки The Shadow Brokers. И пока корпорации с миллиардными бюджетами беспомощно смотрели на красные экраны, спасение пришло откуда не ждали.
Киберэпидемиология: Червь против вируса
Когда началась эпидемия WannaCry, новости пестрели заголовками о «новом смертоносном вирусе». Однако с технической точки зрения называть WannaCry вирусом некорректно. Это сетевой червь. Разница между ними фундаментальна и объясняет ту невероятную скорость, с которой вредонос захватил сотни тысяч устройств.
В обиходе словом «вирус» часто называют любое вредоносное ПО (malware, которое в русскоязычном сообществе иногда пытаются локализовать как «зловред»). Но классический компьютерный вирус, как и биологический, не может существовать сам по себе. Ему нужен носитель — например, исполняемый файл или макрос в документе. Вирус запускается только тогда, когда пользователь взаимодействует с зараженным файлом, после чего начинает внедрять свой код в другие файлы на компьютере. Чтобы заразить соседнюю машину, зараженный файл должен быть перенесен туда физически (например, на флешке) или отправлен по почте. Для распространения вируса нужно активное участие человека.
WannaCry действовал иначе. Это червь (worm) — самостоятельная, автономная программа, которая размножается и заражает другие устройства без какого-либо участия пользователя. Подобно спорам сибирской язвы, червь распространялся по сети автоматически. Попав на компьютер, он сканировал локальную сеть и интернет в поисках уязвимых машин, стучался в порт 445 (используемый протоколом SMB) и, если находил дыру, самостоятельно эксплуатировал ее с помощью EternalBlue, загружая свою копию.
Именно поэтому масштаб заражения рос по экспоненте, обрушивая корпоративные сети за считанные минуты.
На фоне падающих серверов глобальных корпораций на сцене появляется человек, которому суждено остановить эту эпидемию. Маркус Хатчинс (Marcus Hutchins), известный в сети под ником MalwareTech.
На тот момент ему было 22 года. Маркус не учился в университете — он был гениальным самоучкой, специалистом по кибербезопасности, работавшим удаленно на компанию Kryptos Logic из Лос-Анджелеса. Свой рабочий день он проводил, не выходя из спальни в доме родителей в тихом городке на юго-западе Англии. Узнав о глобальном сбое и падающих серверах Национальной службы здравоохранения Великобритании, Хатчинс, как и многие другие аналитики, приступил к изучению кода, даже не подозревая, что его действия через несколько часов сделают его мировой знаменитостью.

Фото: Chris Ratcliffe/Bloomberg
Гениальный баг: Как домен за $10 сломал червя
Получив образец WannaCry, Маркус попытался запустить его в своей песочнице (sandbox) — изолированной виртуальной машине, созданной специально для безопасного анализа малвари. Но червь не подавал признаков жизни. Он просто отказывался запускаться.
Такое поведение — классика для вредоносного ПО. В индустрии кибербезопасности давно идет бесконечная игра в кошки-мышки между исследователями и вирусописателями. Разработчики малвари понимают: как только их код попадет к аналитикам, его разберут по косточкам. Поэтому они встраивают в программы механизмы защиты — проверки, цель которых определить, не находится ли малварь в лабораторной среде.
Один из самых популярных методов детекта песочниц — проверка доступа в интернет. Если компьютер не подключен к сети, червю нет смысла активироваться, ведь он не сможет распространяться и отправлять данные. Аналитики быстро раскусили этот трюк и модернизировали свои песочницы: теперь они перехватывали любые запросы к внешним ресурсам и всегда отдавали фиктивный успешный ответ (например, 200 OK). Вредонос спрашивал: «Я в интернете?», а песочница отвечала: «Да, всё в порядке, продолжай», провоцируя малварь раскрыть свой функционал.
Изучая код WannaCry, Маркус обнаружил интересную деталь — странный запрос. Перед началом шифрования и распространения червь обращался к абсолютно бессмысленному, длинному и несуществующему домену. Выглядело это примерно так:
if (InternetOpenUrlA(..., "http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com", ...)) { // ???}
Привычка взяла верх: Маркус проверил домен и, убедившись, что он свободен, купил его за символические 10 долларов. Он решил направить весь трафик с этого адреса на сервер-приманку своей компании (sinkhole). Идея была простой — собрать статистику и оценить реальные масштабы заражения, раз уж каждая копия червя зачем-то «стучится» на этот адрес.
Но произошло невероятное: как только домен был зарегистрирован и начал отвечать, эпидемия остановилась.
Дело в том, что авторы WannaCry придумали изящную, но фатально хрупкую защиту. Они знали, что песочницы будут отдавать 200 OK на любой запрос. Поэтому они прописали обращение к заведомо несуществующему домену. Логика червя была элегантной:
-
Если я стучусь на этот абракадабра-домен и получаю ответ
200 OK— значит, меня обманывают. Я в песочнице, которая имитирует интернет. Надо немедленно самоуничтожиться, чтобы меня не изучили. -
Если домен недоступен — всё нормально, я в реальном интернете (ведь такого домена не существует). Можно начинать шифровать и заражать соседей.
Зарегистрировав домен, Маркус Хатчинс сам того не ведая, создал глобальный ответ 200 OK для всех копий WannaCry в реальном интернете.
Черви на сотнях тысяч зараженных машин по всему миру сделали запрос к домену, получили успешный ответ и… запаниковали. Логика сработала против создателей: малварь решила, что весь интернет — это гигантская песочница исследователей. Новые заражения прекратились мгновенно.
Случайный kill-switch (рубильник) за 10 баксов спас мировую инфраструктуру.
Однако победа была хрупкой. На серверы Маркуса обрушился шквал запросов, и если бы они не выдержали, домен бы “упал”, и спящий червь немедленно проснулся бы. К делу пришлось подключать правоохранительные органы Франции (чтобы они по ошибке не изъяли серверы, на которые шел весь трафик вредоноса) и CEO Cloudflare Мэтью Принса, который бесплатно и без шумихи обеспечил проекту мощнейшую DDoS-защиту.
Миллионы запросов от спящих копий WannaCry приходят на этот домен до сих пор — червь все еще ждет, когда «песочница» выключится, чтобы продолжить свою работу.
Извлечение ключей из памяти: WanaKiwi
Специально для Хабра: немного технической магии о том, как можно было спасти данные, когда казалось, что все потеряно.
Остановка эпидемии WannaCry была грандиозным успехом, но для тех, чьи компьютеры уже были зашифрованы, таймеры на экранах продолжали безжалостно тикать. Пока корпорации подсчитывали убытки, независимые ИБ-исследователи — Адриан Гине (Adrien Guinet), Бенджамин Делпи (Benjamin Delpy, создатель небезызвестного Mimikatz) и Мэтью Сюиш (Matthieu Suiche) — работали над инструментами для расшифровки.
Их подход строился на анализе работы криптографических механизмов самого червя и, по иронии судьбы, на еще одной архитектурной особенности старых версий Windows.
Механика работы WannaCry (как и большинства ransomware) сводилась к следующему:
-
Червь генерировал уникальную пару ключей RSA-2048 прямо на зараженной машине.
-
Открытым (публичным) ключом шифровались файлы пользователя.
-
Закрытый (приватный) ключ, необходимый для дешифровки, зашифровывался мастер-ключом злоумышленников и сохранялся на диск.
-
После этого исходный, ничем не зашифрованный закрытый ключ удалялся из оперативной памяти (RAM) компьютера, чтобы жертва не могла его восстановить.
Критическая ошибка (точнее, особенность API, которую не учли авторы червя) крылась в четвертом шаге.
Для генерации ключей WannaCry использовал стандартный криптографический провайдер Microsoft (Microsoft Enhanced Cryptographic Provider) и вызывал функции Windows API, такие как CryptGenKey и CryptDestroyKey.
Адриан Гине обнаружил, что при вызове CryptDestroyKey в Windows XP операционная система не затирает область памяти нулями (как это должно делаться при работе с критичными данными, согласно best practices). Функция просто помечала этот блок памяти как свободный и готовый к перезаписи. Это означало, что простые числа (prime numbers), использованные для генерации закрытого ключа RSA, физически продолжали лежать в недрах оперативной памяти. Компьютер просто «забыл» о них.
Пока другие процессы не перезаписали эту область памяти новыми данными, ключи можно было вытащить.
На основе этой находки Гине написал утилиту WanaKiwi (позже доработанную Делпи и Сюишем для поддержки Windows 7). Инструмент сканировал адресное пространство процесса wnry.exe в оперативной памяти, искал сигнатуры простых чисел и, если находил их, восстанавливал приватный ключ для дешифровки файлов.
К сожалению, этот элегантный метод имел жесткое ограничение: ключи хранились только в RAM. Если испуганный пользователь или сисадмин выключил или перезагрузил зашифрованный компьютер (а это первая инстинктивная реакция многих людей при виде локера), оперативная память обнулялась, и ключи стирались навсегда.
Тем не менее, для тех, чьи ПК продолжали работать с момента заражения, WanaKiwi стал настоящим спасением, вернув файлы без выплаты выкупа.
Падение героя: Тёмное прошлое MalwareTech
Спустя всего три месяца после того, как Маркус Хатчинс одним кликом остановил худшую кибератаку в истории, он отправился в США на крупнейшие хакерские конференции DEF CON и Black Hat. В Лас-Вегасе его встречали как рок-звезду. Закрытые VIP-вечеринки, ужины с журналистами, селфи в коридорах казино и поток офферов от рекрутеров из Кремниевой долины — 22-летний парень купался в лучах славы.
Измученный неделей непрерывных празднований, Хатчинс прибыл в аэропорт, чтобы вернуться в Великобританию. Он прошел досмотр и расположился в бизнес-лаунже, когда к нему подошли сотрудники службы маршалов США и суровые агенты ФБР. На запястьях «спасителя интернета» защелкнулись наручники. Его вывели из терминала на глазах у публики, посадили в черный внедорожник и увезли на допрос.
Человек, остановивший WannaCry, оказался под арестом. Чтобы понять почему, нужно отмотать время на несколько лет назад и заглянуть в теневое прошлое MalwareTech.
Маркус рос замкнутым подростком в британской глуши. Его единственным интересом были компьютеры, а главными собеседниками — обитатели хакерских форумов. В 15 лет он уже умел красть пароли и создал собственный ботнет на 8000 чужих компьютеров. Вскоре он запустил нелегальный бизнес — «Ghost Hosting» — сдавая серверные мощности под фишинговые сайты.
В голове подростка эти действия не казались преступлением. Чужие компьютеры в ботнете были абстрактными машинами, украденные пароли — не реальными деньгами, а DDoS-атаки — просто забавными разборками. У него были свои «красные линии» (он отказывался хостить детскую порнографию), но грань между игрой и криминалом стиралась всё сильнее.
В 16 лет Хатчинс получил заказ от анонима под ником “Vinny”. Задача: написать rootkit (инструмент для скрытого удаленного контроля над системой). Маркус согласился. Так появился UPAS Kit — сложный и технически изящный код, шпионивший за пользователями. Маркус всё еще убеждал себя, что он лишь пишет софт, а не крадет деньги лично.
Но затем Vinny попросил большего: нужно было добавить функцию webinject — механизм перехвата трафика между жертвой и ее банком для прямого воровства денег со счетов.
Хатчинс осознал, что именно он создает, и попытался соскочить. Но было поздно. Vinny шантажом удержал его: он знал реальное имя и адрес Маркуса. Угрожая сдать парня ФБР, Vinny заставил его продолжить работу. Маркус выбрал, как ему казалось, меньшее зло — он доработал общую архитектуру программы, но отказался писать сам банковский модуль (его дописал другой наемный программист).
Летом 2014 года объединенный код был готов. Vinny назвал его в честь греческого титана — Kronos.
Это был шедевр теневого кодинга, один из самых мощных банковских троянов своей эпохи. Он атаковал клиентов крупнейших банков Великобритании, Канады, Германии и Франции. Vinny продавал Kronos на русскоязычных форумах за колоссальные по тем меркам $7000 за копию.
Хатчинс не получал проценты с продаж и не крал деньги лично, но он был архитектором этого оружия. Осознание того, что его код прямо сейчас опустошает счета реальных людей, заставило его резко сменить курс. Он закрыл свои нелегальные серверы и завел анонимный блог MalwareTech. Там он начал делать ровно противоположное тому, чем занимался раньше: публично разбирать чужие вредоносы и учить людей от них защищаться.
Именно там его заметили безопасники, именно там он получил легальную работу и именно этот путь привел его к остановке WannaCry. Но интернет помнит всё, а ФБР умеет искать. Прошлые грехи настигли героя в зале вылета аэропорта Лас-Вегаса.
Суд и финансовый провал Lazarus
Дело Маркуса Хатчинса стало уникальным прецедентом в истории американской юриспруденции. Изначально ему было предъявлено шесть пунктов обвинения, связанных с созданием и распространением Kronos. Позже прокуратура, стремясь сделать процесс показательным, расширила список до десяти пунктов, добавив обвинения по разработке UPAS Kit и ложь агентам ФБР во время допроса. Суммарно ему грозило до 40 лет тюрьмы.
Осознавая, что в федеральных судах США процент обвинительных приговоров превышает 95%, весной 2019 года Хатчинс пошел на сделку со следствием. Он признал вину по двум пунктам (создание кода для UPAS Kit и Kronos), взамен прокуратура сняла остальные обвинения.
26 июля 2019 года состоялось финальное заседание. Перед судьей Джозефом Стадтмюллером (J.P. Stadtmueller) стояла сложнейшая морально-этическая дилемма: как судить человека, чьи подростковые ошибки причинили реальный ущерб, но чей героический поступок во взрослом возрасте спас мировую критическую инфраструктуру?
Судья вынес беспрецедентно гуманный приговор. Он приговорил Хатчинса к времени, уже отбытому в предварительном заключении (time served), и одному году нахождения под надзором (supervised release). Более того, суд признал Маркуса неимущим и отменил все финансовые штрафы. В своей финальной речи Стадтмюллер отметил, что Маркус «перевернул страницу», оставив криминал в прошлом, и прямо в зале суда посоветовал ему подать прошение о помиловании президенту США, чтобы избежать депортации и продолжить работу в индустрии кибербезопасности.
А что же настоящие авторы эпидемии, группа Lazarus? Их кампания оказалась оглушительным провалом — как техническим, так и финансовым.
Несмотря на колоссальный ущерб мировой экономике (по разным оценкам, от 4 до 8 миллиардов долларов), сами хакеры заработали смешные деньги. Выкуп заплатили всего 338 человек. На три биткоин-кошелька, зашитых в код червя (что само по себе является ошибкой: опытные хакеры генерируют уникальный кошелек для каждой жертвы), поступило около 52 биткоинов — чуть больше $100 000 по курсу того времени. При этом неизвестно, планировали ли злоумышленники вообще выдавать ключи заплатившим (вероятнее всего, нет).
WannaCry войдет в историю не только как самая разрушительная кибератака, но и как памятник тотальной небрежности.
А спасение интернета легло на плечи 22-летнего парня с темным прошлым, который просто работал в своей спальне.
История WannaCry — это идеальная иллюстрация хаоса, царящего в современной кибербезопасности, где глобальная инфраструктура может рухнуть из-за переполнения переменной в древнем протоколе, а устоять — благодаря одному случайному DNS-запросу. Обновляйте системы, дамы и господа.
Анонсы новых статей, полезные материалы, а так же если в процессе у вас возникнут сложности, обсудить их или задать вопрос по этой статье можно в моём Telegram‑сообществе. Смело заходите, если что‑то пойдет не так, — постараемся разобраться вместе.
ссылка на оригинал статьи https://habr.com/ru/articles/1037618/