В январе 2007 года пользователи Windows по всему миру начали получать электронные письма с заголовками вроде «230 dead as storm batters Europe». Внутри — вложение с подробностями якобы катастрофического шторма, прошедшего по континенту. Открывавшие его запускали исполняемый файл — загрузчик, разворачивавший на машине цепочку модулей от game0.exe до game5.exe и руткит wincom32.sys в системной папке Windows. В первые же дни антивирусные компании выявили кампанию, получившую имена Storm, Nuwar и Peacomm, но заражения продолжались: операторы меняли темы писем, используя сообщения о политических скандалах, смертях знаменитостей, праздничных открытках. Социальная инженерия работала как фабричная лента: тревога, любопытство, жадность — и клик.
Но Storm не был единичным вирусом. Это была инфраструктура, способная получать новые модули, менять поведение, атаковать противников. Командного сервера у него не было с самого начала: заражённые машины искали инструкции друг у друга в распределённой хеш-таблице eDonkey/Overnet, а осенью 2007 года операторы ушли в собственную, зашифрованную сеть с тем же устройством. Легенда гласила, что такую сеть невозможно убить. Правда оказалась сложнее: P2P сделала ликвидацию дороже, но не невозможной. А громкие оценки в десятки миллионов заражённых устройств так и не были надёжно подтверждены.
Цепочка заражения Storm напоминала матрёшку. Первый исполняемый файл — game0.exe — загружал следующий, тот — следующий, пока на машине не оказывался полный набор компонентов. Финальный модуль устанавливал руткит wincom32.sys в каталог %windir%\system32, скрывая присутствие вредоносного ПО от антивирусов и пользователя. Руткит перехватывал системные вызовы, маскировал файлы, процессы, сетевые соединения. Машина продолжала работать, но теперь была частью чужой инфраструктуры.
Многоэтапность позволяла обходить детектирование. Антивирусные сигнатуры, настроенные на один файл, не срабатывали на следующий. Операторы Storm перепаковывали исполняемые модули каждые десять минут, так что один и тот же загрузчик менял контрольную сумму прямо во время рассылки. В декабре 2007 года они выбросили в сеть сотни и тысячи версий сразу, рассчитывая перегрузить антивирусные лаборатории.
Но хитрость была в функционале. Storm не устанавливал фиксированный набор программ. Руткит работал как платформа, способная получать новые модули по команде извне. Сегодня заражённая машина рассылала спам, завтра — участвовала в DDoS-атаке, послезавтра — загружала и распространяла другое вредоносное ПО. Операторы превратили ботнет в многофункциональный инструмент с подпиской на услуги.
Ранние ботнеты полагались на IRC-серверы или HTTP-панели управления. Отключи сервер — и сеть рассыпается. Storm пошёл другим путём. Заражённые машины объединялись в распределённую хеш-таблицу (DHT) Overnet, где каждый узел хранил фрагмент информации о соседях, а осенью 2007 года к ней добавилась собственная сеть операторов — исследователи назвали её Stormnet. Команды шли по цепочке: бот искал инструкцию у соседей, те — у своих соседей, пока не находил свежую.
Это не было изобретением Storm. Протокол Overnet использовался в файлообменных сетях с начала 2000-х. Но применить его для управления ботнетом — это другое. В торрентах DHT помогала искать файлы; здесь она доставляла команды десяткам тысяч машин разом, без единой точки отказа. Сообщения в Stormnet шифровались XOR-ключом в 40 байт, но подписи под содержимым не было — и это оказалось слабым местом.
Защитники столкнулись с проблемой. Нельзя просто вырубить сервер — его не было. Нельзя заблокировать домен — боты не обращались к доменам. Можно было попробовать sinkholing — подмену узлов сети собственными серверами, отслеживающими активность. Но P2P-архитектура Storm оказалась устойчивой: боты проверяли соседей, отбрасывали нерабочие узлы, искали новых. Исследователи вынуждены были действовать медленнее: блокировать распространение через спам-фильтры, очищать заражённые машины по одной, давить на сопутствующую инфраструктуру вроде Fast Flux DNS — технологии, постоянно меняющей IP-адреса управляющих узлов.
Первое время Storm жил внутри обычного Overnet, бок о бок с мирными файлообменными клиентами; сеть Stormnet была закрытой — в неё пускали только ботов. Подписи под содержимым не было, и в апреле 2008 года команда исследователей из Мангейма и Eurecom залила DHT своими записями в том же формате: боты вместо свежих инструкций стали вытягивать мусор. А операторы, судя по всему, разделили сеть на сегменты: разные ключи для разных задач. Один сегмент рассылал спам, другой атаковал сайты, третий распространял новые вредоносные программы — компрометация одной части не выдавала остальные.
Летом 2007 года сайты нескольких антиспам-организаций подверглись массированным DDoS-атакам. Среди целей — Spamhaus, ведущая чёрные списки спам-серверов, и 419eater.com, форум, разоблачающий мошеннические схемы. Атаки исходили от ботнета Storm. Это была не случайность: часть удара операторы наносили сами, защищая инфраструктуру, часть — по заказу, потому что DDoS у них, судя по сообщениям антиспам-сайтов, можно было купить так же, как рассылку.
Исследователи, публиковавшие детали Storm, также оказывались под ударом. Атаки длились часами, иногда сутками. Полоса пропускания забивалась мусорным трафиком, сайты становились недоступными. Некоторые исследователи сообщали о персональных атаках: боты пытались вывести из строя их домашние подключения. Это было послание: копаешь — получишь.
Но Storm пошёл дальше. В октябре 2007 года руткит научился не убивать антивирус, а обесточивать его на входе: вредонос патчил точки входа в загружаемые процессы, и защита открывалась как обычно, но не делала ничего. «Работает, но не работает», — сформулировал исследователь IBM Джош Корман. Пользователь видел включённый антивирус и считал себя в безопасности.
В сентябре 2007 года Microsoft выпустила обновление Malicious Software Removal Tool (MSRT), добавив детектирование Storm. Результаты оказались любопытными: из 2,6 миллиона просканированных систем инструмент очистил 274 372 машины. Это составляло примерно 10,5% проверенных, но было далеко от оценок в десятки миллионов заражённых, циркулировавших в прессе. Проблема измерения ботнета: P2P-архитектура не позволяла подсчитать уникальные узлы с точностью. Исследователи видели трафик, но не могли отличить постоянно активную машину от той, что включалась раз в неделю. Оценки варьировались от сотен тысяч до 50 миллионов, хотя последняя цифра не имела надёжного подтверждения.
К осени 2007 года Storm перестал быть единой операцией. Исследователи обнаружили, что операторы сдавали части ботнета в аренду. Механизм работал через уникальные ключи шифрования: арендатор получал ключ, позволявший отправлять команды своему сегменту сети. Боты выполняли задачи, но не могли переключиться на другого заказчика без нового ключа.
Прайс-листы не публиковались, но исследователи вычисляли цены по косвенным признакам. Спам-рассылка с миллиона машин, DDoS-атака на выбранный сайт, распространение новой вредоносной программы — всё имело рыночную стоимость. Storm стал инфраструктурой, на которой работали десятки схем: от фальшивых интернет-аптек до мошеннических кредитных предложений.
Но кто стоял за операцией? Личности операторов Storm так и не были публично установлены. Нет арестов, нет судебных дел, нет имён. Это отличало Storm от более поздних ботнетов, вроде Gameover Zeus, где ФБР в итоге назвало подозреваемых. F-Secure склонялась к российскому следу: операторы хостились через Russian Business Network, в коде упоминалась ненависть к «Лаборатории Касперского», а одно из слов внутри программы — bydloshka — походило на русское. Доказательств не было.
Анонимность операторов усиливалась архитектурой. P2P-сеть не требовала постоянного присутствия управляющих. Команды забрасывались в сеть заранее, через анонимные узлы, и распространялись дальше сами. Операторы не нуждались в серверах, регистрируемых на их имя, в оплате хостинга банковскими картами, в логах подключений.
К середине 2008 года размер ботнета Storm сократился до примерно 85 тысяч машин, по данным нескольких исследовательских групп. Это было радикальное падение по сравнению с пиком 2007-го, когда счёт шёл на сотни тысяч или больше. Причины спада: массовая очистка машин через обновления MSRT и других антивирусов, блокировка спам-рассылок на уровне провайдеров, закрытие доменов, использовавшихся в Fast Flux DNS. P2P-архитектура оказалась устойчивой, но не неуязвимой.
Его технологии легли в основу следующих P2P-ботнетов: Waledac, появившийся в конце 2008 года и использовавший схожую архитектуру, и Gameover Zeus, доминировавший в 2011–2014 годах и применявший P2P для защиты банковского трояна. Урок Storm: центральный сервер — слабое место, P2P — дорогая, но эффективная защита.
Но главный вопрос остался без ответа. Кто создал Storm? Почему операторы так и не были найдены, хотя ботнет привлекал внимание исследователей, правоохранительных органов, спецслужб? Возможно, след остыл в распределённой архитектуре, где каждый узел знал только своих соседей. Возможно, операторы ушли до того, как кто-то подобрался достаточно близко. А может, кто-то решил не доводить дело до суда, предпочитая тихое наблюдение громкой поимке. История Storm закончилась не с арестами и пресс-релизами, а с постепенным затуханием сети, словно операторы просто переключились на следующий проект, оставив за собой только код, трафик и миллионы писем о несуществующих катастрофах.