...

воскресенье, 8 декабря 2013 г.

Таблицы рекордов в приложениях [В]Контакте — взлом и защита

Предположим, что мы хотим залить на сайт vk.com какую-нибудь flash-казуалку и прикрутить к ней таблицу рекордов. Это довольно распространённая задача и в данной статье я рассмотрю различные подходы к её решению с точки зрения безопасности.

Для того, чтобы найти наиболее надёжный метод, я выбрал несколько случайных приложений, соответствующих всем условиям задачи, и попробовал написать своё имя на первые места их таблиц рекордов в обход игрового процесса.



Для начала, я проанализировал все запросы от этих приложений при помощи программы Charles и разделил наиболее популярные подходы на две категории в зависимости от того, где хранятся рекорды — на сервере ВКонтакте либо на своём собственном. Для того, чтобы определить, к какой категории относится конкретное приложение, достаточно посмотреть на то, какой сервер вернёт нам список рекордсменов при открытии таблицы рекордов или при запуске приложения.


image


Хранение рекордов на сервере ВКонтакте




Для защиты запросов к ВКонтакте API используется ключ sig, который генерируется на основе viewer_id, всех передаваемых параметров (кроме sid), а также ключа secret. Кроме того, каждый запрос должен содержать sid — идентификатор сессии.

Такая схема позволяет избегать подмены данных в запросах. Например, не зная secret пользователя, а также его sid, мы не сможем выполнить запрос от его имени. Вот только для сохранения рекорда нам не нужно подменять viewer_id, а значит все необходимые параметры у нас есть (их мы можем найти в исходном коде страницы приложения).


image


Для того, чтобы не рассчитывать сигнатуру запроса вручную, я воспользовался приложением тестовое приложение.


Ниже — подделка запросов на сохранение рекорда на примере трёх приложений:


Snake — Змейка:


image


image


Мега-шарик — аркада с необычным геймплеем:


image


image


Тигра:


image


image


Хранение рекордов на собственном сервере




Все запросы, идущие к вашему серверу также могут быть подделаны.

В качестве демонстрации я вновь воспользовался программой Charles и подменил запрос на сохранение рекорда в приложении Пушкин:


image


image


image


Выходит, нам нужно как-то защитить данные от подмены. Например, можно добавлять ко всем запросам какой-нибудь хеш, который генерировался бы на основании всех передаваемых значений, а также одного секретного, который отсутствовал бы в запросе. Этот хеш можно будет пересчитывать на сервере и отклонять запрос в случае несовпадения переданного значения с рассчитанным.


Рассмотрим такую систему на примере приложения Пчелиная атака — игра для друзей.


Я скачал файл приложения на свой ПК и открыл его при помощи программы Sothink SWF Decompiler.


image


image


На основе исходного кода приложения я написал небольшую программку, которая рассчитывает все ключи и отправляет запрос на сервер.


image


image


Я бы не смог этого сделать, если бы файл приложения был пропущен через обфускатор (например, secureSWF).


Заключение




Как вы могли убедиться, хранить таблицы рекордов на сервере ВКонтакте в любом случае небезопасно, а если вы пользуетесь собственным сервером, то нужно самостоятельно организовывать защиту хешированием, шифрованием запросов или любым другим способом. При этом файл приложения обязательно должен быть пропущен через обфускатор, иначе любой желающий сможет ознакомиться с кодом формирования сигнатуры и воспроизвести его.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий