29 декабря 2025 года произошла серьезная эскалация киберугроз для критической инфраструктуры. В этот день злоумышленники провели деструктивную кибератаку на польскую энергосистему. Инцидент состоял как минимум из трех отдельных событий, включая атаки на точки соединения сети (Grid Connection Points, GCP) и на теплоэлектроцентраль (Combined Heat and Powerplant, CHP). Шведская компания Truesec, специализирующаяся на кибербезопасности, опубликовала подробный анализ этой атаки, основанный на отчете польского CERT (компьютерной группы экстренного реагирования). Эксперты пришли к выводу, что теперь, когда Россия переступила порог проведения деструктивных кибератак на критическую инфраструктуру, подобные инциденты могут повториться, в том числе в странах Северной Европы.
Описание
Польский CERT однозначно атрибутировал атаку APT-группе, известной как «Ghost Blizzard» или «DragonFly». Важно отметить, что данная атака стала первой известной деструктивной операцией, приписываемой «DragonFly», и первым деструктивным кибернападением на энергетическую инфраструктуру страны-члена НАТО со стороны российского подразделения кибервойск.
Группа «DragonFly» активна с 2010 года и традиционно фокусировалась на шпионаже в секторах критической инфраструктуры, включая энергетику, атомную промышленность и водоснабжение. До сих пор она не проводила публичных деструктивных атак, хотя неоднократно получала доступ к таким сетям, размещала бэкдоры и готовилась к диверсиям. Эксперты Truesec полагают, что основная миссия «DragonFly» заключалась в сохранении потенциала для ударов по инфраструктуре стран НАТО на случай необходимости. Активация этой группы представляет собой серьезную эскалацию. Польские власти заявили, что в худшем сценарии атака могла оставить без электричества и отопления до 500 000 человек.
Аналитики Truesec провели дополнительное исследование вредоносного ПО (wiper, випер), использованного в атаке, и сопутствующей активности, чтобы разработать механизмы обнаружения. Атака включала два основных типа виперов. Вариант под названием DynoWiper, нацеленный на системы HMI (Human-Machine Interface), использовал генератор псевдослучайных чисел Mersenne Twister для перезаписи файлов бесполезными данными. Для его выявления можно искать в бинарных файлах константы, связанные с этим алгоритмом, в сочетании с вызовами Windows API для перечисления и удаления файлов.
Второй випер был нацелен на устройства RTU (Remote Terminal Unit, удаленный терминал). Злоумышленники перезаписывали прошивку специально поврежденным бинарным файлом в формате ELF (Executable and Linkable Format), точка входа которого состояла из байтов 0xFF, что делало устройство неработоспособным. Обнаружить это можно, ища ELF-файлы, у которых начало точки входа заполнено значениями 0xFF. Хотя этот метод прост и может быть обойден, его срабатывание с высокой вероятностью указывает на злонамеренные действия.
Перед развертыванием виперов злоумышленники проводили подготовительные мероприятия. Они включали включение административных общих ресурсов (admin shares) через PowerShell, перезапуск службы SMB и добавление правила в брандмауэр для разрешения входящего трафика на порт 445 (SMB) под маскировочным именем «Microsoft Update». Кроме того, для эксфильтрации данных использовался PowerShell-командлет Invoke-RestMethod для отправки файлов на удаленный сервер через HTTP POST-запросы. Truesec предоставила подробные охотничьи запросы (threat hunting queries) для систем мониторинга, такие как Microsoft Defender для Идентификации конечных точек, чтобы выявлять эти действия.
Представленные механизмы обнаружения в основном основаны на поведенческих сигнатурах, что эффективно при противодействии деструктивным атакам, где инструменты и полезная нагрузка часто меняются. Тем не менее, важно расследовать любые срабатывания в контексте, поскольку некоторые легитимные программы, например, антивирусы или утилиты для работы с дисками, могут демонстрировать схожее поведение.
В своих рекомендациях Truesec призывает развернуть предоставленные правила и запросы в процессах мониторинга, уделяя первоочередное внимание системам, смежным с АСУ ТП (OT), платформам HMI и инфраструктурным серверам. Все срабатывания необходимо тщательно расследовать, сопоставляя их с ролью системы и другими данными. К обнаружению активности, похожей на випер, следует относиться как к событиям высокой критичности, так как они редко бывают доброкачественными и часто указывают на неизбежные или уже идущие деструктивные действия. Компания подчеркивает, что сейчас критически важно выявлять и устранять другие потенциальные вторжения этой группы в инфраструктуре по всей Европе.
Индикаторы компрометации
SHA256
- 60c70cdcb1e998bffed2e6e7298e1ab6bb3d90df04e437486c04e77c411cae4b
- 65099f306d27c8bcdd7ba3062c012d2471812ec5e06678096394b238210f0f7c
- 835b0d87ed2d49899ab6f9479cddb8b4e03f5aeb2365c50a51f9088dcede68d5
- d1389a1ff652f8ca5576f10e9fa2bf8e8398699ddfc87ddd3e26adb201242160
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import "pe" rule possible_wiper_using_mersenne { meta: description = "Windows PE < 5MB containing MT19937 constants and wiper-like imports" date = "2026-02-02" author = "Nicklas Keijser" hash1 ="60c70cdcb1e998bffed2e6e7298e1ab6bb3d90df04e437486c04e77c411cae4b" hash2 = "835b0d87ed2d49899ab6f9479cddb8b4e03f5aeb2365c50a51f9088dcede68d5" hash3 = "65099f306d27c8bcdd7ba3062c012d2471812ec5e06678096394b238210f0f7c" hash4 = "d1389a1ff652f8ca5576f10e9fa2bf8e8398699ddfc87ddd3e26adb201242160" strings: $const = { 65 89 07 6C } $twist = { DF B0 08 99 } $mask7f = { FF FF FF 7F } condition: pe.is_pe and pe.imports("kernel32.dll", "GetLogicalDrives") and pe.imports("kernel32.dll", "FindFirstFileW") and pe.imports("kernel32.dll", "DeleteFileW") and pe.imports("kernel32.dll", "FindNextFileW") and pe.imports("kernel32.dll", "SetFileAttributesW") and filesize < 500KB and ($const and $twist and $mask7f) and ( pe.number_of_signatures == 0 or ( pe.number_of_signatures > 0 and not for any i in (0 .. pe.number_of_signatures - 1) : ( pe.signatures[i].issuer matches /Microsoft/i or pe.signatures[i].subject matches /Microsoft/i ) ) ) } |
| 1 2 3 4 5 6 7 8 9 10 11 | import "elf" rule ELF_entrypoint_at_least_64_FF{ meta: description = "ELF file with just FF at entry point" date = "2026-02-02" author = "Nicklas Keijser" condition: uint32(0) == 0x464c457f and for all i in (0..63) : (uint8(elf.entry_point + i) == 0xFF) } |