Анализ безопасности сетевых Unity3D игр в VKontakte

в 23:11, , рубрики: Без рубрики

Анализ безопасности сетевых Unity3D игр в VKontakte

Привет. Надеюсь этот пост не приведет к плохим последствиям и все будет хорошо и мир наполнится светом! Почему все настолько плохо в социальных unity3d играх ВКонтакте?

Выдались свободные выходные и посвятил я их одному интересному делу — выявить слабые места в безопасности приложений. Т.к. работаю в основном с юнити, то брал игры, созданные на этом движке. Сразу замечу, что я не профессионал и опыта подобного анализа у меня не было. Имелись знания о том, как происходит авторизация пользователя и проверка валидности его id(в документации вк есть) + c#(без него никак). В руки попали 4 приложения, и во всех четырех нашлись дыры, причем в последнем такая, что можно было получить доступ к "серверным методам". Как это получилось?

1. Инструменты

Бродя по просторам паутины встречал программу Unity 3D Obfuscator, имеющую следующие фичи:
-защита от декомпиляции;
-обфускация (переименование в бессмысленный набор символов) имен объектов (классы, функции, свойства и т.п.);
-запутывание графа потока выполнения;
-распаковка Unity3D проектов;
-удаление метаданных событий и свойств.

Как раз распаковка .unity3d(веб билд) файла позволит достать .dll-ки, которые пригодятся в дальнейшем. Так что первым делом скачал и установил Unity 3D Obfuscator.

Для дизассемблирования нарыл ILSpy(free). Возможность смотреть C#<->IL коды очень пригодилась, но об этом позже…

Unity3d + VS2012 позволили быстро написать маленькое приложение для тестов.

2. Процесс

Первым делом достал из HTML-исходника страницы viewer_id и auth_key для конкретного приложения. Последний, кстати, уникален для каждой пары юзер+приложение. Там же можно найти url для iframe, в котором можно узнать путь до .unity3d файла. Copy/Paste to NotePad++.

Анализ безопасности сетевых Unity3D игр в VKontakte

(html исходник)

Тут столкнулся с тем, что в одном приложении расширение было заменено на .pdf. Зачем это сделали для меня загадка, но выкачать с помощью DownloadMaster и переименовать в исходный формат получилось без труда (если кто в курсе в чем профит от pdf, напишите в комментах плз, очень интересно).

Далее, с помощью Unity 3D Obfuscator распаковал билд и получил на выходе dll-ки. Assembly-CSharp.dll — то, что нам нужно! Сделав 0.5л кофе, продолжил заниматься рукоблудием…

Анализ безопасности сетевых Unity3D игр в VKontakte

(Unity 3D Obfuscator)

Теперь предстояла задача найти в коде точки пересылки данных. Если есть подпись, то и в механизме подписывания содержимого.

ILSpy проглотил сборку очень шустро и выдал полотно классов. Подключив смекалку, забил в поиск Network, однако поиск привел лишь к классам, относившимся к Photon Cloud. Не то, идем дальше. Через несколько минут нашел чью-то пару id-auth_key(как оказалось, админа приложения). Еще через какое-то время — адрес сервера, к которому нужно отсылать запросы.

Использую ссылки «Used By» нашел место применения — методы, дергающие апи игрового сервера.

Если с первым приложением все было просто(бери и подставляй свои данные), то с другими нужно было повозиться больше, т.к. попытка отослать запрос оканчивалась ответом «Hello Mazafacka» со стороны сервера.

Чего-то не хватает… Смотрю на метод с названием Md5Sum и понимаю, что не хватает хеша! Но как его строить? Смотрим в код:


private IEnumerator UpdateScor(string vid, ...)
{
df.<UpdateScor>c__Iterator20 <UpdateScor>c__Iterator = new df.<UpdateScor>c__Iterator20();
<UpdateScores>c__Iterator.viewer_id = vid;
...
return <UpdateScor>c__Iterator;
}

К такому жизнь меня не готовила. Полез в инет…

Все оказалось просто — компилятор для инструкций yield return делает класс, в котором реализован конечный автомат, поэтому нужно было найти этот класс и посмотреть, что же там за логика. Однако поиски df.c__Iterator20 оказались безуспешными… Пошел гуглить. Фишка оказалось в просмотре IL кода. Как раз в нем нашел реализацию того самого класса, в котором была логика. Потратив еще пол часика разобрался с тем, как собирается запрос(string.concat) и создается хеш(MD5(string.concat)). Теперь запросы проходили на ура!

На этом закончил эксперименты, отписал админам, мало ли, вдруг захотят что-нибудь залатать(прошло уже пару дней, а реакции 0).

Итого:
0. Суммарно затраченное время — ~6 часов.
1. Спокойно можно изменять статы в 3 играх — деньги, опыт и т.д.
2. В одной нашел App_Secret! Я не могу передать словами, насколько это эпично держать эту строку на клиенте…

Как лечить?(сугубо мое мнение)
1. Клиент — читер. Всегда. Только серверные проверки смогут внести спокойствие в игровой мир.
2. НИКОГДА не всовывать в продакшн билд важные данные. К ним относятся: различные ключи(если только не паблик), тестовые данные аккаунтов.
3. Можно попробовать блокировать пользователя после пару неудачных попыток обращения к АПИ, чтобы нельзя было бесконечно пробовать подобрать что-либо.

Напоследок

Целью не было создать чит или напакостить проектам. Чистый анализ и ничего более. Хотя, если попробовать взять проект по-серьезнее(>1 000 000 установок), то может быть времени уйдет в разы больше, или вовсе ничего не выйдетПроверил, хрен редьки не слаще.

Вообще очень понравилось заниматься анализом, подумываю работать в этой сфере. Только одного понять не могу — почему администрация не реагирует? Проекты живые, люди играют. Может настали времена, когда использовать ArtMoney для взлома это предел возможностей игроков?(я был бы рад) Или игроки стали честнее и не используют чит-программы?(Радость х5)

А что вы думаете, дорогие жители Хабра, по поводу защиты?

Автор: afrokick

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js