Каждый мод - это программа, работающая внутри вашего сервера с тем же доступом, что и у самого сервера. Это не повод отказываться от модов - модифицированный сервер для большинства сообществ и есть смысл всей затеи, - это повод осознанно относиться к тому, откуда они берутся, потому что перепакованный jar из поста на форуме - реальный риск, а не теоретический. Хорошая новость в том, что дисциплина короткая: скачивайте у автора, проверяйте файл, устанавливайте по одному, делайте backup перед установкой и ведите список того, что установили и откуда это взято. Остальная часть статьи - о том, что каждый из этих пунктов означает на практике, как на самом деле выглядит взломанный сервер и что делать в тот день, когда вы его обнаружите.
Что мод может на самом деле#
Слово «мод» охватывает вещи с совершенно разными привилегиями. Если знать, какой именно вид вы устанавливаете, понятно, сколько внимания он заслуживает.
| Вид | Работает как | Изолирован? |
|---|---|---|
Плагин Bukkit, Spigot или Paper (.jar) | Байт-код JVM в процессе сервера | Нет |
Мод Forge, Fabric или NeoForge (.jar) | То же самое, и ещё на каждом клиенте | Нет |
Плагин BepInEx (.dll) | Код .NET внутри процесса игры | Нет |
| Аддон Garry's Mod на Lua | Ограниченный Lua | Частично |
| Бинарный модуль Garry's Mod | Нативный код | Нет |
| Ресурс FiveM | Серверный Lua или JavaScript | Частично |
Плагин SourceMod (.smx) | SourcePawn в виртуальной машине | Частично |
| Датапак Minecraft | Данные и функции | Только данные |
| Конфиг, пресет, карта, модель | Данные | Только данные |
Плагин Bukkit - важнейший случай, потому что с Minecraft большинство людей и знакомится с этой темой. Jar плагина загружается в ту же виртуальную машину Java, что и сервер, без какой-либо песочницы. Он может читать и записывать любой файл, доступный пользователю сервера, открывать любое сетевое соединение, запускать процесс через Runtime.getRuntime().exec и загружать новые классы из байтов, скачанных секундой раньше. Настраивать тут нечего, потому что модели прав нет. То же верно для модов Forge и Fabric и для плагинов BepInEx в Valheim и других играх на Unity; эта экосистема подробно разобрана в статье моды Valheim через BepInEx на сервере.
К частично изолированным тоже стоит относиться с уважением. Garry's Mod ограничивает серверному Lua доступ к файлам одним каталогом и коротким списком расширений, но Lua-аддон всё равно может подключить (require) бинарный модуль, а бинарные модули - это нативный код без каких-либо ограничений. Плагины SourceMod работают в виртуальной машине с определённым API, и это настоящая граница, хотя расширения нативные.
Датапаки, файлы конфигурации, карты и модели - это данные. Они могут сломать сервер и их можно использовать для грифинга, но они не исполняют произвольный код, поэтому относятся к другому классу. Одна оговорка, на которой многие попадаются: папка мира Minecraft содержит каталог datapacks, поэтому мир, который вам передали, - это не чистые данные в том смысле, в каком ими является текстура.
Откуда берутся моды#
Правило умещается в одно предложение: собственная страница автора или платформа, на которой он публикуется, и больше ничего. Что это значит, зависит от экосистемы.
- Плагины Minecraft. Ресурсы SpigotMC, Hangar от PaperMC, Modrinth или страница релизов автора на GitHub. Проверьте, что имя автора у загрузки совпадает с автором, указанным в проекте, потому что почти одинаковые названия плагинов с другим загрузившим - известная уловка.
- Моды и сборки Minecraft. Modrinth, CurseForge или репозиторий автора. Как согласовать версии, когда всё скачано, описано в статье модифицированный Minecraft без вылетов.
- Valheim и игры на Unity. Thunderstore, Nexus Mods или GitHub автора.
- Игры на Source. Steam Workshop для контента, AlliedModders для плагинов SourceMod, GitHub для всего остального. Сторона доставки разобрана в статье коллекции Workshop и FastDL.
- FiveM. Раздел релизов на форуме Cfx.re, GitHub или платный ресурс через официальный escrow. Всё, что описано как «слитое», одновременно украдено и изменено.
- Другие игры с поддержкой workshop. Arma 3, DayZ, Project Zomboid и 7 Days to Die берут файлы из Steam Workshop, который скачивает и обновляет их автоматически; как это работает на стороне сервера, описано в статье моды Steam Workshop на выделенных серверах.
Источником не считаются: сайт с перезаливами, файл в сообщении чата, «сборка», которую кто-то составил, ссылка на Google Drive в описании YouTube-ролика или зеркало, существующее потому, что оригинал «слишком медленный». Каждый из этих вариантов - это незнакомец, который передаёт вам код для запуска от имени вашего сервера.
В RE:NODE моды и плагины загружаются через файловый менеджер или по SFTP, либо приходят через собственную поддержку workshop в игре. Белого списка того, что можно устанавливать, нет, и при загрузке ничего не проверяется; это сознательный выбор в пользу того, что вы сами решаете, что работает на вашем сервере, и означает, что проверки ниже вам нужно делать самому.
Nulled-плагины и почему они - главный вектор#
Если нужно вынести из этой статьи одно: самый крупный источник взломанных игровых серверов - не хитроумный атакующий, а бесплатная копия платного плагина.
«Nulled», «слитый» или «взломанный» плагин - это такой, у которого убрана проверка лицензии. Чтобы её убрать, нужно декомпилировать jar, отредактировать и скомпилировать заново, и это как раз тот момент, когда можно добавить что угодно, причём тем, чьи отношения с вами сводятся к тому, что он распространяет краденое ПО. Полезная нагрузка обычно скучная и эффективная: скрытая команда, выдающая оператора, обратный вызов на сервер, который собирает ваш адрес и версию, второй jar, записываемый в папку плагинов при первом запуске, или тихая запись, добавленная в ops.json.
Модель угроз для модифицированного сервера - это не хакеры. Это удобная загрузка от человека, которого вы никогда не встречали.
Практические доводы против nulled-плагинов сильны и без оглядки на безопасность. Они не обновляются, поэтому ломаются на следующей версии сервера и остаются сломанными. Их нельзя поддерживать, потому что ни один автор не станет помогать вам с изменённой сборкой. И они склонны приходить пачками, так что одно плохое решение ставит сразу пятнадцать неизвестных jar.
Та же логика относится к любой пересборке: «исправленная», «оптимизированная» или «совместимая с 1.21» версия плагина, выложенная тем, кто не является автором, - это изменённый бинарник от неизвестной стороны.
Проверка файла до запуска#
Проверка не остановит решительного атакующего, но пяти минут она стоит, потому что ловит небрежных, а их большинство.
# Does it match what the author published?$ sha256sum EssentialsX-2.20.1.jar# A jar is a zip. What is inside it?$ unzip -l MyPlugin.jar | head -40# Extract and look at the actual bytes$ unzip -o -q MyPlugin.jar -d /tmp/inspect$ cat /tmp/inspect/plugin.yml$ grep -rIa -o -E 'https?://[A-Za-z0-9./_-]+' /tmp/inspect | sort -u$ grep -rIal -E 'ProcessBuilder|URLClassLoader|getRuntime' /tmp/inspectЗапуск strings на самом jar почти ничего не находит, потому что содержимое сжато. Сначала распакуйте его; именно этот шаг большинство руководств опускает.
Что вы ищете:
- Контрольная сумма, совпадающая с указанной на странице загрузки. Многие проекты её публикуют. Если она не совпадает, остановитесь на этом и не расследуйте дальше, просто удалите файл.
- `plugin.yml`, рассказывающий другую историю. В нём указаны главный класс, версия и автор. Автор, не совпадающий с автором проекта, который вы, как вам казалось, скачали, - конец разговора.
- URL, не имеющие отношения к проекту. Плагину для управления точками телепорта незачем обращаться к адресу, о котором никто не слышал. Некоторые легитимные плагины обращаются к своему серверу для проверки обновлений, поэтому смотрите на домен, а не на количество.
- Второй jar или лишний файл класса в архиве, особенно со случайным на вид именем.
- Размер файла, сильно отличающийся от опубликованного. Вдвое больше, чем у версии на странице загрузки, - повод задать вопрос.
Два честных ограничения. Обфускация для платных плагинов - обычное дело, поэтому имена классов вроде a.a.b ничего не доказывают и одновременно означают, что вы не сможете осмысленно прочитать код. А антивирусная проверка, в том числе загрузка в мультидвижковый сервис, часто возвращает чистый результат для бэкдоров на Java и .NET, потому что в них нет ничего, что выглядело бы как исполняемый файл Windows. Проверка сужает круг. По-настоящему защищает происхождение.
Устанавливайте по одному, на сервере, который не жалко потерять#
Больше всего вреда от модов происходит не от злого умысла, а от двух изменений сразу, когда непонятно, какое из них всё сломало.
- Каждый раз сначала делайте backup. Слоты для backup есть на каждом тарифе, копии можно делать по запросу или по расписанию, восстанавливаются они кнопкой, а копию можно заблокировать, чтобы ротация её не удалила. Заблокируйте ту, что сделали перед крупным изменением. Это превращает худший случай из пересборки в восстановление.
- Установите один мод, запустите, посмотрите консоль, остановите. Здесь пригодится навык из статьи чтение консоли: нужное сообщение обычно оказывается в первых двадцати строках после загрузки плагина.
- Тестируйте не на боевом сервере. Второй маленький сервер на том же аккаунте - самая дешёвая страховка, какую можно купить; схема описана в статье staging и production на одном аккаунте.
- Записывайте. Простой файл в корне сервера с перечнем каждого мода, его версии, URL, откуда вы его скачали, и даты установки занимает минуту и отвечает на любые будущие вопросы о том, откуда что взялось.
- Закрепляйте версии и не обновляйтесь в день патча. Мод, который обновляется сам, - это мод, способный измениться под вами, а именно так по замыслу работает Steam Workshop. Как восстановиться после тех обновлений, которые всё же ломают, рассказано в статье что делать, когда обновление мода всё сломало.
Признаки того, что сервер уже взломан#
Их стоит знать, потому что симптомы вполне конкретны, а люди обычно объясняют их чем-то другим.
- Исходящие соединения с сервера, который должен только отвечать на них. Игровой сервер, который сам начинает трафик туда, куда вы не настраивали, - самый ясный сигнал.
- Записи администраторов, которые вы не добавляли. Проверьте
ops.jsonв Minecraft,adminlist.txtв Valheim,admins.cfgдля SourceMod,users.iniдля AMX Mod X. Незнакомое имя или ваше собственное, добавленное дважды, - это не сбой. - Файлы в каталоге модов со временем изменения, не совпадающим ни с одной запомнившейся вам установкой.
- CPU на пределе при пустом сервере. Холостая нагрузка, похожая на работу, - классическая сигнатура майнинга. Быстрый способ убедиться в форме, а не гадать, - чтение графика нагрузки сервера.
- Расписание или переменная запуска, которые вы не задавали. Журнал активности панели фиксирует, кто что менял и когда, и это первое, что нужно прочитать.
- Логирование затихло. Вывод консоли, который прекращается или редеет, так же подозрителен, как и тот, что вдруг взрывается, потому что подавление логов - очевидный первый ход.
- Игрокам предлагают что-то скачать, о чём на прошлой неделе не предлагали, особенно в играх, отправляющих контент клиентам.
Проверка времени изменения - это одна команда, и она превращает смутное подозрение в список, по которому можно работать:
$ find plugins mods -type f -newermt '-7 days' -printf '%TY-%Tm-%Td %p\n' | sortЛюбой из этих признаков стоит остановиться и расследовать, а не откладывать на потом. Статьи логи, которые стоит хранить и мониторинг, который что-то говорит существуют затем, чтобы у вопроса «когда это началось» был ответ.
Изоляция и очистка#
Удаление подозрительного jar - это не очистка, потому что вы не знаете, что ещё он записал. Действуйте в таком порядке.
- Остановите сервер. Каждая минута его работы - ещё одна минута того, что он делает.
- Сделайте backup скомпрометированного состояния и заблокируйте его. Он нужен, чтобы понять, что произошло, а без блокировки ротация удалит его, пока вы ещё читаете логи.
- Смените каждый секрет, который был у сервера. Пароль RCON, пароль и пользователя базы данных, учётные данные SFTP, любой API-ключ, любой токен бота и любые учётные данные в переменных запуска - логины Steam, токены workshop, ключи сервисов. Всё, что лежит в файле конфигурации на этом сервере, следует считать прочитанным. Где всё это накапливается, описано в статье переменные окружения и секреты.
- Пересоберите из источников, а не из скомпрометированного дерева. Свежие файлы сервера и каждый мод заново скачан у автора. Не копируйте папку плагинов, так бэкдор и переживает очистку.
- Возвращайте только те данные, за которые можете ручаться. Мир, базу данных, файлы игроков. Восстановите из backup, сделанного до первого симптома, если можете определить его дату. Заодно проверьте папку
datapacksсамого мира. - Уберите записи администраторов во всех перечисленных выше файлах и проверьте группы прав внутри игры, а также субпользователей панели.
- Сообщите игрокам, если на их машины отдавался контент, и скажите, что проверить. Это неприятно, но это правильно.
Граница контейнера помогает, но не спасает. Каждый сервер работает в собственном контейнере, поэтому взлом одного не переходит на файлы другого сервера, а лимит CPU не даёт ему задушить узел. Чего она не делает, так это не защищает секреты внутри контейнера и другие системы, пароли от которых там хранились. Более длинная процедура описана в статье что делать, если сервер взломали, а проверка восстановления до того, как оно понадобится - то, что стоит сделать заранее.
Как оставаться чистым со временем#
Первоначальный аудит прост. Поддерживать его истинность два года - вот настоящая работа, и она сводится к нескольким привычкам.
Держите файл инвентаря актуальным, включая URL источника, чтобы через год вопрос «откуда это взялось» был справкой, а не археологическим проектом. Перепроверяйте мод, у которого сменился сопровождающий, потому что заброшенный проект, переданный новому человеку, - хорошо известный путь для добавления того, о чём никто не просил. Удаляйте моды, которыми никто не пользуется, минимум раз в год: неиспользуемый код - всё равно код с полным доступом к серверу, а спящий плагин - спящий риск.
Давайте серверу самые узкие учётные данные, которые работают. Если плагину нужна база, дайте ему пользователя, ограниченного его собственной базой, а не пароль суперпользователя, чтобы взломанный плагин означал взломанную таблицу, а не взломанный сервер. Остальное из этой аргументации есть в чек-листе безопасности базы данных. И делайте backup до установки, а не после: эта единственная привычка превращает почти каждую историю из этой статьи в неудобство.
FAQ#
Безопасен ли контент Steam Workshop?
Безопаснее случайной загрузки, потому что он привязан к аккаунту издателя и на него можно пожаловаться, но он не проходит проверку. Больше беспокоит то, что предметы workshop обновляются автоматически, так что проверенный вами предмет может измениться без ваших действий. Закрепляйте что можете и считайте день выхода патча игры днём, когда нельзя разрешать обновляться всему сразу.
Может ли мод на моём сервере повлиять на компьютеры моих игроков?
Зависит от игры. Ванильный Minecraft не может отправлять клиентам исполняемый код - наборы ресурсов это ассеты, а не код, - поэтому серверный плагин остаётся на сервере. Игры, которые загружают контент клиентам, такие как Garry's Mod и FiveM, действительно запускают код на машинах игроков, поэтому взлом на этих платформах серьёзнее и о нём нужно сообщать людям.
Поймает ли антивирус или сканер файлов вредоносный плагин?
Обычно нет. Бэкдор на Java или .NET - это обычный управляемый код, делающий обычные вещи, и мультидвижковые сканеры часто ничего на нём не находят. Если проверка показывает заражение, это определённое «нет»; если она чистая, это говорит очень мало.
Проверяет ли RE:NODE моды, которые я загружаю?
Нет. Моды и плагины загружаете вы сами через файловый менеджер или SFTP, либо они приходят через собственную поддержку workshop в игре, а белого списка того, что можно устанавливать, нет. Вы решаете, что работает на вашем сервере, - это правильное поведение по умолчанию и одновременно причина, по которой проверки из этой статьи стоит делать.
Я удалил плохой плагин. Этого достаточно?
Нет. Считайте, что он записал файлы, добавил запись администратора и прочитал все учётные данные в конфигурации. Минимум - остановить сервер, сменить секреты, пересобрать из чистых источников и вернуть только те данные, за которые вы можете отвечать.
Как отличить вредоносный мод от просто сломанного?
По тому, что он делает, а не по вылету. Сломанный мод выдаёт в консоли ошибку со стеком, указывающим на него самого, и останавливается. Взломанный обычно работает нормально, в этом и смысл. Вылеты идут по пути диагностики неисправностей; необъяснимый сетевой трафик, новые администраторы или холостой CPU - по пути очистки, описанному выше.




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