Анализ безопасности сетевых 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++.
(html исходник) Тут столкнулся с тем, что в одном приложении расширение было заменено на .pdf. Зачем это сделали для меня загадка, но выкачать с помощью DownloadMaster и переименовать в исходный формат получилось без труда (если кто в курсе в чем профит от pdf, напишите в комментах плз, очень интересно).Далее, с помощью Unity 3D Obfuscator распаковал билд и получил на выходе dll-ки. Assembly-CSharp.dll — то, что нам нужно! Сделав 0.5л кофе, продолжил заниматься рукоблудием…
(Unity 3D Obfuscator) Теперь предстояла задача найти в коде точки пересылки данных. Если есть подпись, то и в механизме подписывания содержимого.
ILSpy проглотил сборку очень шустро и выдал полотно классов. Подключив смекалку, забил в поиск Network, однако поиск привел лишь к классам, относившимся к Photon Cloud. Не то, идем дальше. Через несколько минут нашел чью-то пару id-auth_key (как оказалось, админа приложения). Еще через какое-то время — адрес сервера, к которому нужно отсылать запросы.
Использую ссылки «Used By» нашел место применения — методы, дергающие апи игрового сервера.
Если с первым приложением все было просто (бери и подставляй свои данные), то с другими нужно было повозиться больше, т.к. попытка отослать запрос оканчивалась ответом «Hello Mazafacka» со стороны сервера.
Чего-то не хватает… Смотрю на метод с названием Md5Sum и понимаю, что не хватает хеша! Но как его строить? Смотрим в код:
private IEnumerator UpdateScor (string vid, …) { df.
К такому жизнь меня не готовила. Полез в инет…
Все оказалось просто — компилятор для инструкций 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)
А что вы думаете, дорогие жители Хабра, по поводу защиты?