Эксплойт игрового сервера - почти всегда баг в игре, её фреймворке для модов или плагине, который срабатывает от ввода, который игроку разрешено отправлять: специально сформированного пакета, слишком большого предмета, сообщения в чате, сетевого сообщения, которое плагин так и не проверил. Пропатчить игру сами вы не можете, поэтому защита - короткий список того, что вы контролируете: запускать актуальную пропатченную сборку и фреймворк, использовать серверное ПО, которое добавляет ограничения на ввод (стандартный пример - Paper в Minecraft), удалять плагины, которые доверяют клиенту, не открывать ничего, кроме игрового порта, и держать backup достаточно свежими, чтобы дюп или откат из-за подгаданного краша стоил вам минут, а не дней.
В этой статье - виды эксплойтов, с которыми на самом деле сталкиваются владельцы серверов, случаи, которые стоит знать по имени, настройки, которые их сдерживают, и что делать, когда кто-то намеренно роняет ваш сервер. Читерство с помощью клиентского ПО - отдельная проблема, она разобрана в статье читеры и бан-листы.
Виды эксплойтов и какие из них чинить вам#
| Вид | Что происходит | Кто исправляет |
|---|---|---|
| Краш-эксплойт | Специальный ввод убивает или замораживает сервер | Разработчик игры или форк сервера |
| Лаг-машина | Легальные механики, построенные, чтобы перегрузить тик | Вы: лимиты и правила |
| Дюп | Предметы копируются через баг тайминга или логики | Разработчик; вы ограничиваете ущерб |
| Эксплойт логики плагина | Плагин доверяет вводу, который должен проверять | Автор плагина, или вы его удаляете |
| Удалённое выполнение кода | Ввод запускает код на сервере | Разработчик, срочно |
| Обход аутентификации или прокси | Кто-то заходит под другим игроком | Вы: конфигурация |
| Открытые админ-интерфейсы | RCON, веб-панели или базы данных доступны извне | Вы: конфигурация |
Нижние три строки - источник большей части реального ущерба, и их же вы можете исправить сегодня, ни от кого не завися. Верхние строки зависят от того, как быстро разработчик выпускает патч и как быстро вы обновляетесь.
Log4Shell: случай, который должен знать каждый владелец сервера#
В декабре 2021 года оказалось, что уязвимость в Java-библиотеке логирования Log4j, получившая номер CVE-2021-44228 и прозвище Log4Shell, эксплуатируется через чат Minecraft. Игрок отправлял сообщение со специально сформированной строкой; сервер записывал сообщение в лог; Log4j воспринимал строку как команду скачать и выполнить код с удалённого адреса. Любой уязвимый сервер, который логировал чат, мог захватить кто угодно, кто мог на него зайти, - как и уязвимые клиенты, которые показывали это сообщение.
Mojang выпустила 1.18.1 с исправлением и опубликовала способы защиты для старых версий: флаг JVM для 1.17 и заменённые файлы конфигурации логирования для версий с 1.7 по 1.16.5. Paper и другое серверное ПО пропатчили свои сборки за считаные дни.
Уроки, которые остаются актуальными:
- Старые версии не становятся безопасными оттого, что они старые. Сервер, который до сих пор работает на версии Minecraft до исправления, на непропатченной сборке и без опубликованной защиты, уязвим и сегодня. Если вы держите старую версию ради модпака, убедитесь, что сборка серверного ПО выпущена после декабря 2021 года или что защита на месте.
- Логирование - это обработка ввода. Уязвимый код вообще не был в игровой логике. Он был в библиотеке, которой игра пользовалась для записи текстовых файлов.
- Скорость важна. Эксплуатация началась через несколько часов после публикации. Серверы, обновлённые в тот же день, не пострадали; серверы, чьи владельцы были в отпуске, - пострадали.
Как перейти на пропатченную версию, не потеряв мир, описано в статье обновление версии Minecraft.
Minecraft: лимиты пакетов, слишком большие предметы и обход прокси#
Minecraft - самый эксплуатируемый игровой сервер по простой причине: он самый распространённый, а ванилла доверяет клиентам больше, чем следовало бы. Paper отчасти и существует, чтобы это исправить.
Лимиты пакетов. Модифицированный клиент может отправлять тысячи пакетов в секунду, и на ванилле это может застопорить сервер. В Paper есть ограничитель пакетов в config/paper-global.yml:
packet-limiter: all-packets: action: KICK interval: 7.0 max-packet-rate: 500.0По умолчанию он кикает клиента, который в среднем за семь секунд отправляет больше 500 пакетов в секунду, - ни один нормальный клиент так не делает. Для типов пакетов, которыми злоупотребляли отдельно, есть свои переопределения. Структура менялась от версии к версии Paper, поэтому сверяйтесь с файлом, который сгенерировал ваш сервер, а не копируйте старое руководство.
Слишком большие предметы и book bans. Предметы с огромным объёмом данных - классический пример - книги, набитые длинными страницами, - можно было положить в сундук так, что загрузка чанка отключала каждого игрока, подошедшего близко, или раздуть данные игрока до того, что он не мог войти. Paper проверяет данные предметов и размер книг с помощью настроек в том же файле. Оставляйте эти лимиты по умолчанию, если конкретному плагину не нужно больше.
Обход прокси. Самый разрушительный «эксплойт» Minecraft - вообще не баг. За прокси Velocity или BungeeCord бэкенд-серверы работают с online-mode=false и доверяют прокси аутентификацию игроков. Если порт бэкенда доступен напрямую, кто угодно может к нему подключиться, назваться любым игроком, включая оператора, и бэкенд ему поверит. Исправляется это конфигурацией:
- Используйте Velocity с
player-info-forwarding-mode = "modern"и тем же секретом пересылки на бэкендах, чтобы бэкенд отклонял подключения, пришедшие не через прокси. - На BungeeCord, где встроенного аналога нет, используйте плагин вроде BungeeGuard, чтобы добавить общий токен.
- По возможности сделайте так, чтобы бэкенды не были доступны из интернета.
Полная настройка - в статье сеть Minecraft на прокси Velocity.
Лаг-машины. Редстоун-часы, фермы предметов и скопления сущностей - легальные механики, построенные специально, чтобы обрушить TPS. Помогают лимиты сущностей и настройки редстоуна в Paper, плагины, ограничивающие число сущностей на чанк, и правила о том, что можно строить. Диагностика с профайлером описана в статье почему падает TPS и что делать.
Игры на Source и Garry's Mod: сообщения, которым доверяют#
В играх на движке Source сам движок патчит Valve, а реальная поверхность для эксплойтов - в аддонах сервера.
В Garry's Mod классический эксплойт - обработчик net.Receive, который доверяет клиенту. Аддоны отправляют сообщения от клиента к серверу через библиотеку net, и серверный обработчик, который делает всё, что сказано в сообщении, - выдаёт деньги, спавнит сущность, меняет ранг игрока, - может вызвать любой клиент несколькими строками Lua. Эксплойт-меню для Garry's Mod - это в основном сборники известных уязвимых обработчиков в популярных аддонах. Безопасный обработчик проверяет всё, в чём клиент может соврать:
util.AddNetworkString("shop_buy")net.Receive("shop_buy", function(len, ply) if not IsValid(ply) or not ply:Alive() then return end if (ply.nextShopBuy or 0) > CurTime() then return end ply.nextShopBuy = CurTime() + 1 local id = net.ReadUInt(16) local item = SHOP_ITEMS[id] if not item then return end -- check price, distance to the shop NPC and permissions here, -- on the server, never trusting a value the client sentend)Проверять каждый установленный аддон вы не будете, но можно найти обработчики и посмотреть на те, что в малоизвестных аддонах: grep -rn "net.Receive" garrysmod/addons. Беспокоиться стоит об обработчиках, которые читают из сообщения сумму, игрока или сущность и действуют на их основе без проверок. Смежная отладка описана в статье производительность сервера Garry's Mod и ошибки Lua.
Во всех играх на Source:
- Держите сервер обновлённым. Исправления движка приходят к вам через обновления SteamCMD, а устаревший сервер клиенты часто и так не принимают.
- Отключайте то, чем не пользуетесь.
sv_allowupload 0запрещает клиентам загружать спреи и пользовательские файлы, а это исторически был путь для специально сформированных файлов, роняющих клиентов.sv_allowdownload 0- если вы раздаёте контент через FastDL. - Держите SourceMod и Metamod актуальными. Gamedata ломается после обновлений, а в старых сборках расширений и живут баги в нативном коде.
В конце 2020 года Valve также изменила протокол запросов к серверу, добавив к A2S_INFO шаг с challenge, чтобы серверы больше нельзя было использовать как усилители в отражённых атаках. Серверы на актуальных сборках получают это автоматически - ещё одна причина не держать древние сборки. Протокол объяснён в статье query-порты и A2S.
Survival-игры: дюпы и откаты из-за подгаданных крашей#
У survival- и sandbox-игр есть общий шаблон эксплойта, который стоит понимать, потому что его можно притупить без всякого патча.
Большинство этих игр сохраняются по таймеру. Если игрок передаёт предмет другу, а затем роняет сервер до следующего сохранения, мир откатывается к состоянию до обмена - но если данные игрока сохраняются отдельно или в другой момент, у одной стороны может оказаться предмет, который всё ещё есть у другой. Любой надёжный способ уронить сервер превращается в машину для дюпа.
Что можно сделать:
- Сократите интервал сохранения, где игра это позволяет. У Valheim есть
-saveinterval, у Minecraft - автосохранение, у Palworld и других - свои настройки. Более короткий интервал сужает окно. - Считайте повторяющиеся краши рядом с одними и теми же игроками закономерностью, а не невезением. Прочитайте в логе, что они делали прямо перед каждым крашем.
- Держите backup, из которых можно восстановиться, с такой частотой, чтобы при необходимости откатить весь мир до волны дюпа.
- Следите за экономикой. Резкий всплеск количества редкого предмета - обычно именно так дюпы и обнаруживают.
Компромисс между частотой сохранений и фризами при сохранении для разных игр разобран в статье интервалы автосохранения игровых серверов.
Открытые интерфейсы, которые контролируете вы#
Многие инциденты, описанные как «сервер взломали», вообще не связаны с эксплойтами игры. Это сервисы, оставленные доступными со слабыми или стандартными учётными данными.
| Интерфейс | Типичный порт | Что делать |
|---|---|---|
| RCON в Source и Minecraft | 27015 TCP, 25575 TCP | Отключить, если не нужен, иначе длинный пароль |
| BattlEye RCon | Задаётся в BEServer_x64.cfg | То же, что с RCON |
| Веб-панель txAdmin | 40120 TCP | Надёжные админ-аккаунты с двухфакторной аутентификацией |
| Веб-панели и карты плагинов | Разный | Открывать только нужное, требовать аутентификацию |
| Базы данных для плагинов | Разный | Никогда не держать публичными со слабыми учётными данными |
Каждый из них - дверь, которая не зависит ни от какого бага игры. Подробная версия для удалённых консолей - статья безопасный RCON; для чего нужен каждый порт, объяснено в статье порты игровых серверов. На RE:NODE в каждом тарифе указано, сколько портов выделено, а порты добавляются и удаляются на вкладке Network, так что порт, который вы не открывали, недоступен, - и принцип «открывать только то, чем пользуетесь» становится поведением по умолчанию, а не обязанностью.
Как обновляться, не ломая сервер#
Своевременные обновления - самая эффективная защита от известных эксплойтов, а не обновляются люди потому, что обновления всё ломают. Порядок действий, который избегает обеих проблем:
- Подпишитесь на заметки о релизах вашей игры, серверного ПО (Paper, SourceMod, txAdmin, Oxide или Carbon) и самых крупных плагинов. Исправления безопасности обычно помечены.
- Отделяйте обновления безопасности от обновлений с новыми функциями. Первые применяйте быстро. Вторые могут подождать, пока подтянутся плагины.
- Тестируйте на копии. Второй маленький сервер на тех же файлах ловит большинство поломок - настройка описана в статье тестовый сервер рядом с основным.
- Делайте backup перед каждым обновлением и блокируйте его, чтобы ротация не удалила его, пока вы проверяете результат.
- Фиксируйте версии осознанно. Если вам нужно остаться на старой версии, знайте, каких исправлений вам не хватает, и применяйте опубликованные способы защиты. Как делать это намеренно, а не по небрежности, описано в статье фиксация версий и откаты.
Когда кто-то роняет ваш сервер#
- Найдите закономерность. Прочитайте последние строки лога перед каждым крашем и краш-репорт, если игра его пишет. Одно и то же имя игрока, одна и та же команда, одно и то же место или один и тот же предмет перед каждым крашем - вот зацепка. Поможет статья как читать консоль.
- Уберите триггер. Если это намеренно, забаньте игрока. Если триггер - предмет или чанк, удалите его редактором или откатите эту часть мира.
- Закройте окно. Временно включите белый список, если пока не можете определить виновника.
- Обновите или удалите уязвимый компонент - обновление плагина, обновление фреймворка или полное удаление аддона.
- Сообщите об этом разработчику или автору плагина приватно, с выдержками из лога, чтобы это исправили для всех. Не публикуйте способ открыто.
FAQ#
Могу ли я сам пропатчить краш-баг игры?
Обычно не в самой игре. В Minecraft серверное ПО вроде Paper исправляет многие баги ванильной версии, а на моддинг-платформах плагин иногда может заблокировать ввод, вызывающий баг. В остальных случаях вы сообщаете о проблеме, ограничиваете риск и обновляетесь, когда выходит исправление.
Уязвим ли мой старый сервер Minecraft к Log4Shell?
Если он работает на версии до декабря 2021 года, на серверном ПО, собранном до этого, и без опубликованной защиты, - да. Используйте сборку сервера, выпущенную после исправления, или примените для своей версии флаг JVM либо конфигурацию логирования от Mojang.
Исправления эксплойтов - это то же самое, что античит?
Нет. Античит ищет читерское ПО на компьютере игрока. Эксплойты используют обычных клиентов, которые отправляют ввод, неправильно обрабатываемый сервером, поэтому античит не видит ничего необычного. Исправления приходят с патчами, ограничениями на ввод и конфигурацией.
Как игроки находят эксплойты в плагинах?
Так же, как нашли бы вы: читают код популярных плагинов, особенно на скриптовых платформах вроде Garry's Mod и FiveM, где он открытым текстом, и делятся находками. Обычные мишени - популярные аддоны, которые больше не поддерживаются.
Стоит ли рассказывать игрокам об исправленном эксплойте?
Расскажите, что проблему исправили и что изменилось для них, например откат. Способ не упоминайте, особенно если другие серверы могут быть всё ещё уязвимы.




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