RE:NODE

Безопасность12 мин чтения

Вредоносные плагины и моды на игровых серверах

Четыре пути, которыми плагины с бэкдором попадают на серверы, как этот код выглядит в Minecraft, Garry's Mod и FiveM, как его искать и что делать, если вы его нашли.

0 прочтений

Большинство плагинов игровых серверов с бэкдором попадает на сервер одним из четырёх путей: слитая или «nulled» копия платного плагина, подделка, выдающая себя за популярный плагин, настоящий проект, аккаунт автора которого угнали, или разработчик либо помощник, которому вы дали доступ к файлам. Сам код обычно простой - скрытая фраза в чате, которая выдаёт оператора, веб-запрос, ответ на который выполняется как код, второй файл, подброшенный туда, куда вы не заглядываете, - и на скриптовых платформах вроде Garry's Mod и FiveM многое из этого находится обычным текстовым поиском. Защита в основном сводится к тому, откуда берутся файлы и кто может писать на ваш сервер, и лишь отчасти - к проверке того, что вы скачали.

Эта статья - взгляд со стороны атакующего: как вредоносный код попадает внутрь и как он выглядит, когда уже там. Повседневная рутина безопасной установки модов - проверенные источники, контрольные суммы, одно изменение за раз, backup перед каждой установкой - описана в статье как держать сервер с модами в чистоте, и её стоит прочитать вместе с этой.

Четыре пути на ваш сервер#

ПутьКак это выглядит для васЧто это останавливает
Слитый или nulled плагинБесплатная копия того, что стоит денегНе скачивать его
ПодделкаЗнакомое название, другой автор загрузкиПроверка автора и страницы проекта
Взломанный авторОбычное обновление от настоящего проектаОтложенные обновления, слежение за жалобами
Кто-то с доступом к файлам«Исправление» или плагин-«помощник»Ограничение круга тех, кто может писать файлы

Первый путь - самый распространённый с большим отрывом. Чтобы убрать проверку лицензии из платного плагина, его нужно декомпилировать и собрать заново, и у того, кто делает эту работу, есть все возможности что-нибудь добавить. К тому же он распространяет украденный софт, что кое-что говорит о его приоритетах. У сайтов со сливами нет никаких причин давать вам чистую копию и есть несколько причин этого не делать: админский бэкдор на сотнях серверов - вполне продаваемый товар.

Второй путь рассчитан на то, что вы ищете, а не переходите по ссылкам. Плагин с названием «EssentialsX-Fix», репозиторий на GitHub с почти таким же именем и единственным релизом, видео на YouTube, в описании которого ссылка на «зеркало». Файл выглядит правдоподобно, название похоже, а автор - кто-то, о ком вы никогда не слышали.

Третий путь ловит даже осторожных людей, потому что приходит через канал, которому вас учили доверять. Если аккаунт известного автора модов захвачен, следующее «обновление» с официальной страницы проекта может содержать что угодно. Такое случалось на крупнейших платформах.

Четвёртый путь - люди. Разработчик, нанятый сделать особую функцию, волонтёр, который «знает, как починить лаги», бывший член команды с доступом по SFTP, который никто не отозвал. Им не нужно тайно протаскивать бэкдор - они могут просто его положить.

Что обычно делает вредоносная нагрузка#

Бэкдоры на игровых серверах редко бывают изощрёнными. В этом нет нужды: на большинстве серверов нет мониторинга, а большинство владельцев никогда не читает код, который запускает.

НагрузкаЗачем она атакующему
Секретная фраза или команда в чате выдаёт админкуКонтроль над вашим сервером, когда бы он ни зашёл
Удалённый загрузчик кодаМожно позже изменить поведение, не трогая ваши файлы
Сборщик учётных данныхПароли RCON, базы данных и панели из конфигов
ДропперЗаписывает новые плагины или файлы и переживает удаление первого
КриптомайнерИспользует выделенный вам CPU ради чужой прибыли
Вред игрокамОбъявления, спавн предметов, гриферство всего сервера по запросу
Заражение клиентовВ играх, которые отправляют контент игрокам, атакует их компьютеры

Больше всего стоит опасаться удалённого загрузчика: он означает, что бэкдор, найденный вами сегодня, может вести себя завтра совсем иначе. Код на диске маленький и скучный - запросить URL и выполнить то, что пришло, - а всё интересное живёт на сервере атакующего, где вы не можете это прочитать.

Сборщик учётных данных важен из-за того, что лежит в конфигах плагинов. Пароли базы данных для плагинов на MySQL, токены веб-панелей, URL вебхуков, иногда пароль RCON. Как только они украдены, удаление плагина проблему не решает.

Реальный случай атаки на цепочку поставок: fractureiser#

В июне 2023 года пользователи модов и плагинов Minecraft обнаружили вредоносную кампанию, которую позже назвали fractureiser. Атакующие получили доступ к аккаунтам на CurseForge и dev.bukkit.org и загрузили заражённые версии существующих проектов. Те, кто скачал эти файлы с официальных платформ, получили jar с небольшим внедрённым загрузчиком. Когда мод или плагин запускался, загрузчик скачивал из интернета следующие стадии; поздние стадии крали учётные данные - cookies браузера, токены Discord, сессии аккаунтов Minecraft и Microsoft - и пытались заразить другие файлы .jar на той же машине.

Из этого вышло несколько уроков, применимых к любой игре:

  • «Официальный источник» снижает риск, но не устраняет его. Файлы пришли ровно оттуда, куда советуют ходить руководства.
  • Самое опасное окно - свежие загрузки. Заражённые версии были доступны ограниченное время, пока их не заметили и не удалили. Серверы, которые выжидали несколько дней перед обновлением модов, вообще не пострадали.
  • Jar может заражать другие jar. Как только запустилось что-то вредоносное, под подозрением оказывается каждый исполняемый файл, в который может писать пользователь сервера, - поэтому чистить вручную плохая стратегия, а восстанавливаться из заведомо чистого backup - хорошая.
  • Сообщество отреагировало быстро. Инструменты обнаружения и разборы появились за считаные дни. Следить за объявлениями платформы полезнее, чем любой сканер, который вы запускаете сами.

Практическая защита для сервера дешёвая: не обновляйте моды в день выхода, если обновление не исправляет нужную вам проблему, сохраняйте предыдущий рабочий файл и делайте backup перед каждым обновлением.

Garry's Mod и FiveM: код, который можно прочитать#

У скриптовых платформ одно большое преимущество: большая часть серверного кода - это обычный Lua или JavaScript, поэтому по нему можно искать. Бэкдоры на этих платформах распространены по той же причине - слитые аддоны и ресурсы широко ходят по рукам, - и они следуют узнаваемым шаблонам.

В Garry's Mod классический бэкдор скачивает текст по URL и выполняет его через RunString или CompileString либо добавляет скрытое net-сообщение, которое выполняет консольную команду для любого, кто его пришлёт. Поиск в папке аддонов по функциям, исполняющим динамический код, находит большинство из них:

bash
$ cd garrysmod/addons$ grep -rn --include='*.lua' -E 'RunString|CompileString|CompileFile' .$ grep -rn --include='*.lua' -E 'http\.Fetch|http\.Post|HTTP\(' .$ grep -rn --include='*.lua' -E 'game\.ConsoleCommand|RunConsoleCommand' .$ grep -rln --include='*.lua' -E '\\x[0-9a-fA-F]{2}.*\\x[0-9a-fA-F]{2}' .

Совпадение - ещё не доказательство вины: множество нормальных аддонов скачивает обновления или выполняет консольные команды, - но каждое из них должно иметь смысл с учётом того, что аддон заявляет о себе. У аддона для спавна пропов, который скачивает URL и передаёт результат в RunString, невинного объяснения нет. Последний поиск находит длинные цепочки символов в hex-экранировании - распространённый способ спрятать URL или имя функции от беглого взгляда. Где на самом деле лежат серверные аддоны, описано в статье Workshop и FastDL в Garry's Mod.

В FiveM аналогичный шаблон - PerformHttpRequest, ответ которого передаётся в load, часто в виде assert(load(...))(), спрятанный внутри в остальном обычного ресурса. В 2023 году широко обсуждаемое семейство таких бэкдоров под названием Cipher распространялось в основном через слитые ресурсы и давало своим операторам удалённый контроль над заражёнными серверами.

bash
$ cd resources$ grep -rn --include='*.lua' -E 'PerformHttpRequest' .$ grep -rn --include='*.lua' -E '(^|[^a-zA-Z_])load\(' .$ grep -rn --include='*.js' -E 'eval\(|new Function\(|https?\.get\(' .$ grep -rln -E '\\x[0-9a-fA-F]{2}.*\\x[0-9a-fA-F]{2}' .

Просмотрите и каждый fxmanifest.lua. Ресурс, в котором указан незнакомый вам серверный скрипт, или файл со случайным именем, закопанный в подпапке, заслуживают внимательного чтения. Escrow-ресурсы (зашифрованные) из официальной системы ассетов прочитать нельзя - это одна из обратных сторон их покупки, - но они приходят от известного продавца через Cfx.re, а это происхождение можно проверить. Об этой системе - в статье escrow и лицензирование ассетов FiveM.

Minecraft и игры на Unity: скомпилированный код#

Плагины Bukkit, моды Forge и Fabric и плагины BepInEx скомпилированы. Искать по исходникам нельзя, а обфускация для платных плагинов - норма, поэтому полноценный аудит для большинства владельцев нереален. Можно сделать кое-что более узкое:

  • Распакуйте и поищите строки. Jar - это zip-архив; распакованные class-файлы по-прежнему содержат читаемые строки вроде URL и имён классов. Команды есть в статье о безопасности модов.
  • Ищите методы, которые нужны бэкдорам. В Java у URLClassLoader, defineClass, Runtime.getRuntime().exec и ProcessBuilder есть легитимные применения, но в каком-нибудь плагине для оформления чата они редкость. Плагин, который слушает события чата и вызывает setOp, - тревожный знак в любом декомпиляторе.
  • Запустите сканер сообщества. Для Minecraft есть сканеры с открытым кодом, которые ищут сигнатуры известного вредоносного ПО в папках плагинов; MCAntiMalware - один из широко используемых. Чистый результат означает «не известный образец», а не «безопасно».
  • Следите за поведением. Исходящие соединения процесса сервера на незнакомые адреса, операторы, которых вы не добавляли, и нагрузка на CPU, когда никого нет онлайн, - вот признаки, которые имеют значение.

В играх на Unity с BepInEx, например в Valheim, то же относится к файлам .dll в BepInEx/plugins: берите их с Thunderstore, Nexus Mods или из собственного репозитория автора и проверяйте автора на странице проекта. Структура папок описана в статье моды Valheim с BepInEx.

Как проверить, что источник - тот, за кого себя выдаёт#

Происхождение файла - защита, которая работает на любой платформе. Несколько проверок отсеивают большинство подделок меньше чем за минуту:

  1. Переходите, а не ищите. Зайдите на платформу плагинов и откройте страницу проекта оттуда или перейдите по ссылке с сайта или профиля GitHub самого автора.
  2. Сравните загрузившего с автором. На SpigotMC, Hangar, Modrinth, CurseForge, Thunderstore и в Workshop загрузивший указан на странице. Популярный плагин, перезалитый другим аккаунтом, считается подделкой, пока не доказано обратное.
  3. Посмотрите на историю. У настоящего проекта есть версии за месяцы или годы, issues и список изменений. Репозиторий, созданный на прошлой неделе, с одним релизом и без исходников - это не то место, где живёт этот плагин.
  4. Сверьте файлы релиза с исходниками. На GitHub бинарник релиза загружается отдельно от кода. Аккаунт, публикующий чистые исходники и изменённый jar, вполне возможен; скачивать из обычного канала проекта безопаснее, чем из форка.
  5. Читайте комментарии к свежим обновлениям. Сообщения о странном поведении обычно появляются там первыми.
  6. Подождите несколько дней с обновлениями, которые вам не нужны. Урок fractureiser в одной строке.

Записывайте, откуда взялся каждый файл. Текстовый файл в корне сервера с каждым модом, версией, URL источника и датой стоит минуты на установку и ускоряет любое последующее расследование.

Нанятые разработчики, помощники и доступ к файлам#

Дать кому-то право записи в файлы сервера - значит дать ему возможность выполнять код на вашем сервере. Это нормально, когда сделано осознанно; большинство бэкдоров от людей появляется потому, что об этом не подумали.

  • Давайте доступ к файлам как можно меньшему числу людей. В панели модератору нужен доступ к консоли, а не к файлам. Права субпользователей позволяют выдать только консоль, только файлы или и то и другое, не делясь своим аккаунтом, - см. статью субпользователи и минимальные привилегии.
  • Давайте подрядчикам доступ на ограниченный срок. Доступ, который истекает сам, невозможно забыть отозвать.
  • Просите исходники и сравнивайте то, что сдают. На скриптовых платформах сравните папку до и после их работы. Для скомпилированных плагинов включите в задачу передачу исходников и инструкции по сборке.
  • Прочитайте журнал активности сервера после окончания работы и сравните время изменения файлов с датами, когда они работали.
  • После этого смените пароли. Базы данных, RCON и любые веб-токены, которые разработчик мог прочитать в конфигах.

Всё это не значит, что нанятым разработчикам нельзя доверять. Это значит, что доверие должно быть конкретным и временным, а backup, сделанный до начала их работы, позволяет её откатить.

Что делать, если вы нашли бэкдор#

  1. Остановите сервер, сделайте backup его текущего состояния как доказательство и больше не запускайте его в таком виде.
  2. Установите источник. Какой файл, какая загрузка, какая дата. Здесь помогут ваши записи об установках.
  3. Смените каждый секрет, который мог прочитать сервер: RCON, пароли администратора, пароли базы данных, URL вебхуков, токены в конфигах. Если вы использовали какие-то из них где-то ещё, смените и там.
  4. Восстановитесь из backup, сделанного до появления этого файла, затем заново добавьте моды из официальных источников по одному.
  5. Проверьте списки администраторов, запланированные задачи и параметры запуска на всё, что вы не настраивали.
  6. Сообщите игрокам, если игра отправляет контент клиентам, чтобы они могли проверить свои компьютеры.

Полная последовательность действий при подтверждённом взломе - в статье что делать, если ваш сервер взломали. Главное здесь: удалить один файл недостаточно, если код мог записать другие.

На RE:NODE моды и плагины загружаются через файловый менеджер или SFTP либо приходят через собственную поддержку Workshop в игре, и по пути ничего не проверяется - что запускать на сервере, решаете вы. Панель даёт вам сторону восстановления: слоты для backup на каждом тарифе, которые хранятся вне машины, которую защищают, восстанавливаются одной кнопкой и могут быть заблокированы, чтобы заведомо чистый backup не ушёл в ротацию, пока вы разбираетесь.

FAQ#

Всегда ли безопасны плагины со SpigotMC, Modrinth или из Workshop?

Они гораздо безопаснее всего остального, но гарантии нет. Платформы проводят некоторую проверку и удаляют вредоносное ПО после жалоб, но случались и взломы аккаунтов авторов, и новые вредоносные загрузки. Предпочитайте устоявшиеся проекты и выжидайте несколько дней с обновлениями.

Может ли антивирус найти плагин с бэкдором?

Редко. Бэкдоры на Java, .NET и Lua не похожи на вредоносное ПО для Windows, поэтому обычные антивирусы часто считают их чистыми. Сканеры сообщества для конкретных платформ лучше справляются с известными образцами, а проверка происхождения - ещё лучше.

Безопасно ли использовать слитый плагин, если проверить код?

Нет. Платные плагины обычно обфусцированы, так что проверить их как следует нельзя, а слитые копии - именно то место, где концентрируются бэкдоры. Кроме того, это чужая платная работа.

Может ли серверный мод заразить моих игроков?

В играх, которые отправляют клиентам контент или скрипты, - да. Garry's Mod и FiveM отправляют клиентские скрипты, а модпаки Minecraft устанавливают код на машину каждого игрока. Вредоносный мод там - риск для вашего сообщества, а не только для сервера.

Как понять, что плагин «звонит домой»?

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


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000