Будущее безопасности мобильных приложений, или чему нас могут научить покемоны

Оригинал поста на хабре

С момента появления Pokemon Go, я с большим любопытством отслеживаю всё, касающееся этой игрушки. Как ни странно, она даёт безумное количество интересной информации - в первую очередь относительно разработки мобильных приложений. Казалось бы, занимаетесь вы разработкой банковских приложений - в чём тут может быть связь? А нет, вам тоже найдётся, чему научиться у покемонов.

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

Акт первый. Боты для всех, и никто не уйдёт обиженным

Первые версии приложения были очень слабо защищены от реверс инжиниринга, и с огромной скоростью появились гики-разработчики, которые разбирали механику игры или добавляли туда дополнительные фичи или хаки. Когда мне стало интересно, сколько всего разработчиков вовлечены эту забаву, я открыл гитхаб и мне немного поплохело: Да, глаза вас не обманули. 1644 репозитория. Наверное, стоит уточнить, что там:
  • Боты - куда же без них;
  • Чистые варианты реализации API на любых языках и платформах;
  • Подборки данных и механик, вытянутые из приложения;
  • Приложения для поиска покемонов вокруг;
  • Приложения для автоматизации действий вроде массовой эволюции покемонов;
  • Приложения для просмотра спрятанных свойств покемонов (IV);
  • Приложения для просчёта оптимальных боёв;
  • Просто версии игры с пониженными системными требованиями.
Следует отметить, что многие приложения обязаны своим появлением тому, что в игре очень плохо реализованы или объяснены многие моменты - вполне естественно, что находчивые разработчики решили на скорую руку сколотить себе несколько костылей.

Акт второй. Робкая попытка защиты

В какой-то момент приложение резко перестало показывать удалённость покемонов (ранее были показаны три степени удалённости). Как вы думаете, с чем это связано? Подумайте пару минут. Ваше самое худшее предположение окажется правдой - удалённость рассчитывалась в клиентском приложении, которому передавались координаты находящихся рядом покемонов - что изрядно увеличивало радиус обнаружения для резвящихся ботов. Не совсем понятно, по какой причине Niantic решил полностью убрать эту фичу вместо того, чтобы перенести рассчёт на сторону сервера… Ну да ладно, это мы вряд ли когда-нибудь узнаем. Возможно, они решили не добавлять дополнительной нагрузки на и без того трещащие от натуги сервера. В эту статью не входит вопрос о том, как дочерняя компания Google так облажалась с масштабированием игры с настолько малой связностью данных, но всё же…

Акт третий. Смешная попытка защиты

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

Акт четвёртый. Защита!

Наконец настал день, когда боты и сканеры разом перестали работать. Честные игроки вздохнули с облегчением - конкурировать с ботами, многие из которых набрали недоступный игроку 30+ уровень, было очень утомительно, да и просто грустно. Но что же… Облегчение длилось всего трое суток. Энтузиасты с реддита за это время разобрали нативную C++ библиотеку, входящую в состав приложения, подобрали необходимые данные и шифрование и вновь выкатили работающую версию API, которую в течении суток подхватили боты и сканеры.

Акт пятый. Нападение!

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

В этом акте Google начал банить без разбору любые приложения на Google Play, которые имели хоть какое-то отношение к покемонам. Банхаммер работал без отдыха и разбора. Как пример неправедно пострадавших приложений, можно привести

  • Приложение для вычисления спрятанных характеристик покемонов. Забанено за "violating the device and network abuse". Что является откровенной ложью, поскольку принцип работы приложения - распознавание картинки из игры и анализ показателей. У приложения даже нет прав на то, чтобы отправлять данные в интернет…
    </li>
    <li><a href="https://github.com/jehy/Pokemon-Go-Weakness-calculator">Простенький калькулятор</a> для просчёта оптимального покемона для борьбы с выбранным. Забанено потому что “violates the impersonation policy”. Что вообще является любимой фразой от Google, поскольку понять и исправить ошибку невозможно (поверьте, я пытался сделать это с другим приложением).</li>
    

Акт шестой и последний. Позор.

Сложно назвать этот акт иначе. После того, как популярные приложения были убраны с google play, разработчики дружно выложили их в open source на github. Вообще, инфраструктура мобильных приложений на гитхабе довольно интересна - 2016 год позволяет делать автоматическое обновление с гитхаба, отправлять куда угодно сообщения об ошибках и в целом довольно неплохо жить без Google Play. Более того, доверие к приложению становится не меньше, а больше, чем если бы оно было выложено на Google Play…

И что же произошло? Довольно ожидаемая, но от этого не менее печальная вещь. Niantic пошёл жаловаться на репозитории. В результате большинство авторов удалили свой код (надо сказать, не полностью, а просто затёрли его последним коммитом) с примерно таким сообщением:

I've received a notice to cease and desist from Niantic Labs, and I've decided to comply with their requests. I'd like to clarify that the main reason I chose to shut it down was because I’ve lost interest rather than legal concerns. Niantic’s actions towards 3rd party developers have been very off-putting and it has killed my personal motivation to work on this project. This was a fun weekend project for a game I enjoyed, and now I’ve lost interest in both. I won’t resume development, but there are active forks of this project you could use.
Не то чтобы авторы испугались обращений Niantic, но их политика просто огорчила разработчиков до глубины души. Код приложений остался на гитхабе, форки множатся, и злонамеренное использование по-прежнему процветает. Niantic не смогли ни предоставить собственного адекватного инструментария для работы с игрой, ни защитить игру от стороннего вмешательства. И просто пошли строчить жалобы. Ну что же… Не так чтобы это было неожиданно в свете аналогичной судьбы гораздо менее популярного Ingress, но жалко, что компания, которая претендует на революцию в игровой индустрии, не учится на своих ошибках, и даже не признаёт их. Хотя радует, что есть ребята вроде Blizzard, которые понимают, насколько полезно дать игрокам возможность влиять на общий игровой мир и дорабатывать его. UPDATE. В комментариях говорят, что я не совсем прав, или даже совсем не прав. Но Blizzard таки даёт возможность влиять хотя бы на пользовательский интерфейс. Мотив закрытия альтернативных серверов и клиентов довольно понятен - это прямая потеря прибыли.

Выводы.

Что мы можем вынести из этой печальной истории?
  1. Код мобильного приложения невозможно защитить. В лучшем случае, вы окажетесь просто никому не нужны - тогда вам не о чём заботиться. В ином случае, при выкладывании приложения лучше считать, что вы выложили его исходники в open source - с этой позиции гораздо проще оценивать последствия и возможные меры противодействия взлому.
  2. Мобильные приложения без Google Play могут существовать, и, судя по всему, в будущем их будет всё больше.
  3. Вы можете приобрести огромное количество помощников, если выложите своё приложение в open source. Вы боитесь? Ну что же, тогда продолжайте тешить себя иллюзией защиты. И ваши потенциальные помощники окажутся по другую сторону баррикад.

Ссылки

  • Подробности с реддита про разбор нового API
  • Ещё?

    Update. Сначала стормозил и не сделал опроса с вариантами того, о чём рассказать ещё, поэтому в комментариях появились соответствующие пункты. Теперь можно просто проголосовать.

    Update 2. Добавлен перевод истории взлома.