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

8abc545c79a0fddb6516d96d3987620e.jpgПривет. Надеюсь этот пост не приведет к плохим последствиям и все будет хорошо и мир наполнится светом! Почему все настолько плохо в социальных 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++.e037bfcb62874d51390c840859a7fd85.jpg

(html исходник) Тут столкнулся с тем, что в одном приложении расширение было заменено на .pdf. Зачем это сделали для меня загадка, но выкачать с помощью DownloadMaster и переименовать в исходный формат получилось без труда (если кто в курсе в чем профит от pdf, напишите в комментах плз, очень интересно).Далее, с помощью Unity 3D Obfuscator распаковал билд и получил на выходе dll-ки. Assembly-CSharp.dll — то, что нам нужно! Сделав 0.5л кофе, продолжил заниматься рукоблудием…

c0a3864ffe5c5af12233358d7fdbe9ee.jpg

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

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

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

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

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

private IEnumerator UpdateScor (string vid, …) { df.c__Iterator20 c__Iterator = new df.c__Iterator20(); c__Iterator.viewer_id = vid; … return 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)

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

© Habrahabr.ru