Большинство плагинов игровых серверов с бэкдором попадает на сервер одним из четырёх путей: слитая или «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-сообщение, которое выполняет консольную команду для любого, кто его пришлёт. Поиск в папке аддонов по функциям, исполняющим динамический код, находит большинство из них:
$ 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 распространялось в основном через слитые ресурсы и давало своим операторам удалённый контроль над заражёнными серверами.
$ 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.
Как проверить, что источник - тот, за кого себя выдаёт#
Происхождение файла - защита, которая работает на любой платформе. Несколько проверок отсеивают большинство подделок меньше чем за минуту:
- Переходите, а не ищите. Зайдите на платформу плагинов и откройте страницу проекта оттуда или перейдите по ссылке с сайта или профиля GitHub самого автора.
- Сравните загрузившего с автором. На SpigotMC, Hangar, Modrinth, CurseForge, Thunderstore и в Workshop загрузивший указан на странице. Популярный плагин, перезалитый другим аккаунтом, считается подделкой, пока не доказано обратное.
- Посмотрите на историю. У настоящего проекта есть версии за месяцы или годы, issues и список изменений. Репозиторий, созданный на прошлой неделе, с одним релизом и без исходников - это не то место, где живёт этот плагин.
- Сверьте файлы релиза с исходниками. На GitHub бинарник релиза загружается отдельно от кода. Аккаунт, публикующий чистые исходники и изменённый jar, вполне возможен; скачивать из обычного канала проекта безопаснее, чем из форка.
- Читайте комментарии к свежим обновлениям. Сообщения о странном поведении обычно появляются там первыми.
- Подождите несколько дней с обновлениями, которые вам не нужны. Урок fractureiser в одной строке.
Записывайте, откуда взялся каждый файл. Текстовый файл в корне сервера с каждым модом, версией, URL источника и датой стоит минуты на установку и ускоряет любое последующее расследование.
Нанятые разработчики, помощники и доступ к файлам#
Дать кому-то право записи в файлы сервера - значит дать ему возможность выполнять код на вашем сервере. Это нормально, когда сделано осознанно; большинство бэкдоров от людей появляется потому, что об этом не подумали.
- Давайте доступ к файлам как можно меньшему числу людей. В панели модератору нужен доступ к консоли, а не к файлам. Права субпользователей позволяют выдать только консоль, только файлы или и то и другое, не делясь своим аккаунтом, - см. статью субпользователи и минимальные привилегии.
- Давайте подрядчикам доступ на ограниченный срок. Доступ, который истекает сам, невозможно забыть отозвать.
- Просите исходники и сравнивайте то, что сдают. На скриптовых платформах сравните папку до и после их работы. Для скомпилированных плагинов включите в задачу передачу исходников и инструкции по сборке.
- Прочитайте журнал активности сервера после окончания работы и сравните время изменения файлов с датами, когда они работали.
- После этого смените пароли. Базы данных, RCON и любые веб-токены, которые разработчик мог прочитать в конфигах.
Всё это не значит, что нанятым разработчикам нельзя доверять. Это значит, что доверие должно быть конкретным и временным, а backup, сделанный до начала их работы, позволяет её откатить.
Что делать, если вы нашли бэкдор#
- Остановите сервер, сделайте backup его текущего состояния как доказательство и больше не запускайте его в таком виде.
- Установите источник. Какой файл, какая загрузка, какая дата. Здесь помогут ваши записи об установках.
- Смените каждый секрет, который мог прочитать сервер: RCON, пароли администратора, пароли базы данных, URL вебхуков, токены в конфигах. Если вы использовали какие-то из них где-то ещё, смените и там.
- Восстановитесь из backup, сделанного до появления этого файла, затем заново добавьте моды из официальных источников по одному.
- Проверьте списки администраторов, запланированные задачи и параметры запуска на всё, что вы не настраивали.
- Сообщите игрокам, если игра отправляет контент клиентам, чтобы они могли проверить свои компьютеры.
Полная последовательность действий при подтверждённом взломе - в статье что делать, если ваш сервер взломали. Главное здесь: удалить один файл недостаточно, если код мог записать другие.
На RE:NODE моды и плагины загружаются через файловый менеджер или SFTP либо приходят через собственную поддержку Workshop в игре, и по пути ничего не проверяется - что запускать на сервере, решаете вы. Панель даёт вам сторону восстановления: слоты для backup на каждом тарифе, которые хранятся вне машины, которую защищают, восстанавливаются одной кнопкой и могут быть заблокированы, чтобы заведомо чистый backup не ушёл в ротацию, пока вы разбираетесь.
FAQ#
Всегда ли безопасны плагины со SpigotMC, Modrinth или из Workshop?
Они гораздо безопаснее всего остального, но гарантии нет. Платформы проводят некоторую проверку и удаляют вредоносное ПО после жалоб, но случались и взломы аккаунтов авторов, и новые вредоносные загрузки. Предпочитайте устоявшиеся проекты и выжидайте несколько дней с обновлениями.
Может ли антивирус найти плагин с бэкдором?
Редко. Бэкдоры на Java, .NET и Lua не похожи на вредоносное ПО для Windows, поэтому обычные антивирусы часто считают их чистыми. Сканеры сообщества для конкретных платформ лучше справляются с известными образцами, а проверка происхождения - ещё лучше.
Безопасно ли использовать слитый плагин, если проверить код?
Нет. Платные плагины обычно обфусцированы, так что проверить их как следует нельзя, а слитые копии - именно то место, где концентрируются бэкдоры. Кроме того, это чужая платная работа.
Может ли серверный мод заразить моих игроков?
В играх, которые отправляют клиентам контент или скрипты, - да. Garry's Mod и FiveM отправляют клиентские скрипты, а модпаки Minecraft устанавливают код на машину каждого игрока. Вредоносный мод там - риск для вашего сообщества, а не только для сервера.
Как понять, что плагин «звонит домой»?
Поищите в его распакованных файлах URL и проверьте, принадлежит ли каждый из них проекту, а также следите за исходящими соединениями процесса сервера на незнакомые адреса. Многие нормальные плагины проверяют обновления, поэтому оценивайте адрес назначения, а не сам факт соединения.




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