Уязвимость в плагинах экономики: кража валюты, дюп предметов и взлом баланса
Введение: деньги из воздуха
Плагины экономики (EssentialsX Economy, CMI, TheNewEconomy, GemsEconomy) управляют виртуальной валютой на сервере. Уязвимости в этих плагинах позволяют хакерам создавать деньги из ничего, красть валюту у других игроков или обрушивать экономику сервера. В этой статье — известные типы атак на экономические плагины.
Тип 1: Дюпликация денег через гонку состояний (Race Condition)
Принцип: Игрок отправляет два запроса на перевод денег одновременно (например, через два клиента или автоматический скрипт). Сервер обрабатывает оба запроса почти одновременно. Проверка баланса для второго запроса происходит до того, как первый запрос спишет деньги. В результате деньги списываются один раз, но переводятся дважды.
Пример: У игрока 100 монет. Он отправляет два запроса на перевод 100 монет другу с задержкой 0 тиков. Сервер проверяет баланс для первого запроса: 100 >= 100 — OK. Начинает перевод. Второй запрос проверяет баланс: сервер ещё не списал деньги, баланс всё ещё 100 — OK. Итог: у игрока -100 монет (долг), у друга +200 монет.
Защита:
- Использовать синхронизированные транзакции (synchronized в Java) при операциях с балансом.
- Использовать базу данных с поддержкой транзакций (MySQL с InnoDB, а не SQLite).
- Обновлять плагины экономики — разработчики фиксят race condition в патчах.
Тип 2: Дюпликация через отрицательные числа (Integer Overflow)
Принцип: Плагин не проверяет, что сумма перевода — положительное число. Хакер отправляет перевод на -1 000 000 монет. Плагин вычитает отрицательное число из баланса отправителя — баланс увеличивается. Баланс получателя уменьшается, но получатель — это подставной аккаунт хакера.
Защита:
- Всегда проверять, что сумма операции >0.
- Использовать типы данных с защитой от переполнения (BigDecimal вместо double).
Тип 3: Дюпликация предметов через плагины магазинов
Принцип: Плагин магазина (ChestShop, QuickShop, ShopGUIPlus) имеет уязвимость, позволяющую забрать предмет из магазина и одновременно вернуть деньги, отправив специальный пакет.
Пример (ChestShop, исправлено): Игрок кликал по табличке магазина и одновременно нажимал кнопку выхода из игры. Пакет покупки и пакет выхода приходили одновременно. Сервер обрабатывал покупку, но не успевал сохранить инвентарь игрока до выхода. При повторном входе предмет был у игрока, а деньги не списаны.
Защита:
- Обновлять плагины магазинов.
- Использовать плагин AntiDupe для детекта аномального количества предметов.
- Логировать все транзакции через CoreProtect.
💡 Совет профи
Настройте алерты на аномальные транзакции. Если игрок с балансом 100 монет вдруг переводит 1 000 000 — это подозрительно. Плагин или скрипт мониторинга может отслеживать такие транзакции и автоматически замораживать аккаунт до проверки администратором. А для защиты от race condition используйте плагины, которые хранят баланс в базе данных с транзакциями (MySQL), а не в YAML-файлах.
💬 Комментарии (0)
🔒 Войдите, чтобы оставить комментарий
😊 Пока нет комментариев. Будьте первым!