
Тема "ягодок" от разработчиков модификаций, открытая ещё в начале лета прошлого года, продолжается. На этот раз, уязвимость с выдачей любых предметов была обнаружена в модификации Tinkers Construct. Впрочем, это было вполне ожидаемо, учитывая сколько багов в данной модификации было обнаружено нами. Автор мода заслуженно занимает своё место среди плохих разработчиков.
Предыстория
Ошибка в модификации была найдена совершенно случайно. Есть конечно люди, которые любят заниматься поиском и исправлением ошибок в модификациях, но мы не из таких - копаться в чужом кривом коде нам не интересно. Наша же деятельность направлена на создание чего-то нового.
А теперь, вернёмся к тому, с чего же всё началось. Несколько дней назад, один из наших игроков сообщил о баге с торговыми автоматами: они могли извлекать результат крафта из верстаков, не потратив ресурсов.
Такое поведение торговых автоматов не стало для нас удивительным: для работы с инвентарями используется код из старой версии игры, где не было методов для проверки доступа к слотам механизма. Только эта проверка не позволяет другим механизмам извлекать содержимое из верстаков. Однако, API игры не позволяет закрывать доступ к слотам. Всё что оно позволяет сделать, это сообщить, с какими слотами работать можно, а с какими нет. Здесь и начинается проблема таких багов: мы можем работать со всеми слотами механизма, не спрашивая какие из них можно использовать, а какие - нет.
Мы уже повидали немало ошибок от авторов модификаций, так что ожидать от них можно что-угодно, в том числе, такой же баг, как с нашим торговым автоматом. Стоит вспомнить о дюпе с помощью магического верстака и стойкой для брони, о котором Вы наверняка слышали - это ещё раз подтверждает наличие проблемы с ограничением доступа к слотам.
Стоит подстраховаться, дабы не было подобных багов с верстаками в дальнейшем. Так началась работа по переделыванию инвентарей, чтобы доступ со стороны других механизмов к слотам результата крафта был невозможен.
Вроде бы работает, но...
Фикс доступа к инвентарю последние несколько дней делался для магического верстака и верстаков из модификации Tinkers Construct. Все верстаки после внесения изменений сохранили свою функциональность, а вот "Стол для вырезки схем" сломался - перестал работать выбор шаблона.
Пришлось разбираться в чём дело. Поиск сразу же начался с интерфейса этого самого верстака, чтобы узнать, как работают кнопки выбора шаблонов. И здесь начинается самое интересное...
Вот она - уязвимость
Просто так ничего взломать нельзя. Взлом - это эксплуатация уязвимости. Нет уязвимости - нет взлома.
Собственно вот как работает кнопка переключения шаблона:
Метод
actionPerformed() вызывается, когда мы нажимаем одну из кнопок в интерфейсе, в его параметр передаётся нажатая кнопка. Затем идёт определение, какой шаблон соответствует кнопке, далее выбранный шаблон устанавливается в стол. Но это всё происходит на стороне клиента (у Вас на компьютере), а для изменения шаблона на стороне сервера используется пакет
PatternTablePacket. Этот пакет содержит сведения о местоположении стола и выбранный шаблон. Здесь всё вроде бы хорошо, в отправке предметов на сервер ничего страшного нет.
А вот как это работает на принимающей стороне (сервер):
Сервер находит стол по координатам и помещает в слот с индексом 1 присланный клиентом предмет (т.е. 2-й слот, так как индексы начинаются с нуля). Хорошо, переключение шаблона у нас теперь работает.
А если мы хорошо разбираемся в коде, то что нам мешает написать вспомогательный мод, да отправить пакет с нужными координатами и нужным предметом?
И это работает! Сервер любезно нам поместил тот предмет, который мы попросили. В этом нет ничего удивительного. В показанном выше коде нет никаких проверок, кроме типа контейнера, поэтому мы можем поместить любой предмет во второй слот в любой из контейнеров из данной модификации, даже в чужом привате менять их содержимое. Именно из-за отсутствия проверок на валидность предмета, это уязвимость. Ведь в роли клиента может выступать обычный игрок, или взломщик с данной модификацией отправлять нам пакеты.
На каких версиях это работает?
Ради интереса, были проверены версии мода для Minecraft 1.6.4 и 1.10.2. В первом уязвимость присутствует, однако её возможности ограничены: на сервер передаётся только ID и damage предмета, что не позволяет задать другое кол-во и NBT свойства. В версии мода для 1.10.2 уязвимость исправили, но допустили ту же оплошность, что и автор BiblioCraft в своём фиксе: добавлена лишь проверка валидности предмета по ID и damage, в стол помещается предмет, присланный клиентом, что оставляет возможность манипуляции с NBT и кол-вом предмета. NBT опасно лишь тем, что позволит переименовывать предмет, накладывать на него чары любого уровня.
Что вообще позволяют подобные уязвимости?
Возможности подобных уязвимостей, связанных с обработкой пакетов ограничены рамками возможностей мода. В основном, в модификациях пользовательские пакеты используются для синхронизации TileEntity (это сундуки, механизмы) между клиентом и сервером. Синхронизируемые данные, это как правило, поля классов, да содержимое инвентаря. Поэтому, практически каждая найденная уязвимость связана с выдачей любых предметов (вещей в общем). Взломать админку или включить творческий режим через пакеты не выйдет - такой функциональности в модах нет. Единственный случай - это NotEnoughItems в функционал которого входит переключение игрового режима игрока, но сейчас эта уязвимость исправлена, а другие модификации с подобным функционалом сложно встретить на серверах.