• 11 048
  • 5
  • 42

Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере

Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере
Уязвимость в Tinkers' Construct. Как получить любую вещь на сервереТема "ягодок" от разработчиков модификаций, открытая ещё в начале лета прошлого года, продолжается. На этот раз, уязвимость с выдачей любых предметов была обнаружена в модификации Tinkers Construct. Впрочем, это было вполне ожидаемо, учитывая сколько багов в данной модификации было обнаружено нами. Автор мода заслуженно занимает своё место среди плохих разработчиков.

Предыстория

Ошибка в модификации была найдена совершенно случайно. Есть конечно люди, которые любят заниматься поиском и исправлением ошибок в модификациях, но мы не из таких - копаться в чужом кривом коде нам не интересно. Наша же деятельность направлена на создание чего-то нового.
А теперь, вернёмся к тому, с чего же всё началось. Несколько дней назад, один из наших игроков сообщил о баге с торговыми автоматами: они могли извлекать результат крафта из верстаков, не потратив ресурсов.
Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере
Такое поведение торговых автоматов не стало для нас удивительным: для работы с инвентарями используется код из старой версии игры, где не было методов для проверки доступа к слотам механизма. Только эта проверка не позволяет другим механизмам извлекать содержимое из верстаков. Однако, API игры не позволяет закрывать доступ к слотам. Всё что оно позволяет сделать, это сообщить, с какими слотами работать можно, а с какими нет. Здесь и начинается проблема таких багов: мы можем работать со всеми слотами механизма, не спрашивая какие из них можно использовать, а какие - нет.
Мы уже повидали немало ошибок от авторов модификаций, так что ожидать от них можно что-угодно, в том числе, такой же баг, как с нашим торговым автоматом. Стоит вспомнить о дюпе с помощью магического верстака и стойкой для брони, о котором Вы наверняка слышали - это ещё раз подтверждает наличие проблемы с ограничением доступа к слотам.
Стоит подстраховаться, дабы не было подобных багов с верстаками в дальнейшем. Так началась работа по переделыванию инвентарей, чтобы доступ со стороны других механизмов к слотам результата крафта был невозможен.

Вроде бы работает, но...

Фикс доступа к инвентарю последние несколько дней делался для магического верстака и верстаков из модификации Tinkers Construct. Все верстаки после внесения изменений сохранили свою функциональность, а вот "Стол для вырезки схем" сломался - перестал работать выбор шаблона.
Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере
Пришлось разбираться в чём дело. Поиск сразу же начался с интерфейса этого самого верстака, чтобы узнать, как работают кнопки выбора шаблонов. И здесь начинается самое интересное...

Вот она - уязвимость

Просто так ничего взломать нельзя. Взлом - это эксплуатация уязвимости. Нет уязвимости - нет взлома.
Собственно вот как работает кнопка переключения шаблона:
Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере
Метод actionPerformed() вызывается, когда мы нажимаем одну из кнопок в интерфейсе, в его параметр передаётся нажатая кнопка. Затем идёт определение, какой шаблон соответствует кнопке, далее выбранный шаблон устанавливается в стол. Но это всё происходит на стороне клиента (у Вас на компьютере), а для изменения шаблона на стороне сервера используется пакет PatternTablePacket. Этот пакет содержит сведения о местоположении стола и выбранный шаблон. Здесь всё вроде бы хорошо, в отправке предметов на сервер ничего страшного нет.

А вот как это работает на принимающей стороне (сервер):
Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере
Сервер находит стол по координатам и помещает в слот с индексом 1 присланный клиентом предмет (т.е. 2-й слот, так как индексы начинаются с нуля). Хорошо, переключение шаблона у нас теперь работает.

А если мы хорошо разбираемся в коде, то что нам мешает написать вспомогательный мод, да отправить пакет с нужными координатами и нужным предметом?
Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере
Уязвимость в Tinkers' Construct. Как получить любую вещь на сервере
И это работает! Сервер любезно нам поместил тот предмет, который мы попросили. В этом нет ничего удивительного. В показанном выше коде нет никаких проверок, кроме типа контейнера, поэтому мы можем поместить любой предмет во второй слот в любой из контейнеров из данной модификации, даже в чужом привате менять их содержимое. Именно из-за отсутствия проверок на валидность предмета, это уязвимость. Ведь в роли клиента может выступать обычный игрок, или взломщик с данной модификацией отправлять нам пакеты.

На каких версиях это работает?

Ради интереса, были проверены версии мода для Minecraft 1.6.4 и 1.10.2. В первом уязвимость присутствует, однако её возможности ограничены: на сервер передаётся только ID и damage предмета, что не позволяет задать другое кол-во и NBT свойства. В версии мода для 1.10.2 уязвимость исправили, но допустили ту же оплошность, что и автор BiblioCraft в своём фиксе: добавлена лишь проверка валидности предмета по ID и damage, в стол помещается предмет, присланный клиентом, что оставляет возможность манипуляции с NBT и кол-вом предмета. NBT опасно лишь тем, что позволит переименовывать предмет, накладывать на него чары любого уровня.

Что вообще позволяют подобные уязвимости?

Возможности подобных уязвимостей, связанных с обработкой пакетов ограничены рамками возможностей мода. В основном, в модификациях пользовательские пакеты используются для синхронизации TileEntity (это сундуки, механизмы) между клиентом и сервером. Синхронизируемые данные, это как правило, поля классов, да содержимое инвентаря. Поэтому, практически каждая найденная уязвимость связана с выдачей любых предметов (вещей в общем). Взломать админку или включить творческий режим через пакеты не выйдет - такой функциональности в модах нет. Единственный случай - это NotEnoughItems в функционал которого входит переключение игрового режима игрока, но сейчас эта уязвимость исправлена, а другие модификации с подобным функционалом сложно встретить на серверах.
  • Автор: TheAndrey
  • Опубликовано:

5 комментариев

Аватар
lakoss
Еее, фиксы❤
Аватар
Plotofox
Немного программного кода на redserver.su
Аватар
Pomi
Столько проблем в последнее время. Сложно вам, починишь одно - сломаешь другое.
Аватар
Lazers0n
Цитата: Pomi
Столько проблем в последнее время. Сложно вам, починишь одно - сломаешь другое.


Было 33 веселых бага.
Программист пофиксил один баг.
Стало 133 веселых бага.
Аватар
MkSavin
Вот вопрос: А что мешает игроку не устанавливать свои рукописные моды? Видимо, ничего, а ведь это - ваша задача.
Так же у автора TC не было цели защитить окружающую среду игры от "второстепенных" модов, да и к тому же, то, что он не сделал проверку на соответствие предмета к паттерну вовсе не означает, то что он такой плохой разработчик (как вы его назвали), он мог оставить эту "лазейку" разработчикам аддонов, к его же TC. Даже если это не так, он мог просто забыть сделать эту самую проверку, ведь опять же, за всем не уследишь, да и к тому же, эта ошибка не из ряда очевидных.
P.S. смысл моего комментария не оскорбить кого-то, а лишь дать понять, что так, не разобравшись, оскорблять кого-либо нельзя. Я уважаю ваше старание, вы стараетесь сделать геймплей проекта лучше, но и уважайте вы старание других.
Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.
Нашли очепятку? Выделите её и нажмите Ctrl+Enter.