Разбираемся, почему Google Play Protect посчитал 2ГИС вредоносным ПО

Что случилось

10 января Google Play Protect ошибочно посчитал 2ГИС вредоносным приложением. 

Пользователи 2ГИС на Android начали получать системное сообщение, что 2ГИС — вредоносное приложение. Мы стали массово получать сообщения от пользователей и разбираться в ситуации. 

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

Ещё раз о том, как это обычно работает

Ошибки в алгоритмах проверки — не редкость. Перед релизом в Google Play каждое приложение проходит проверку. И если систему проверки что-то смутило, разработчик получает уведомление. 

Решение проверки можно оспорить, прикрепив скрины или текстом объяснив модератору необходимость каких-то запросов или работу той или иной фичи/библиотеки.

Но 2ГИС удалили из Google Play, и мы не можем получать и оспаривать решения алгоритмов проверки перед релизом. Поэтому сейчас мы разбираемся, что послужило причиной ошибочного срабатывания проверки.

Почему Google Play Protect определил 2ГИС в категорию spyware?

Мы можем лишь предполагать.

Возможно, Google действует по простому алгоритму. 2ГИС отсутствует в Google Play, значит для Google нет нашей страницы с политикой конфиденциальности. Он не может задать нам уточняющие вопросы о запрашиваемых пермиссиях и автоматически помечает 2ГИС, как spyware.

Если смотреть список причин попадания в эту категорию, можно предположить, что мы оказались в ней из-за чтения контактов и фото. Оба этих действия мы делаем строго с согласия пользователя. Для остального у 2ГИС нет прав.

Контакты подтягиваются для построения социального графа (отзывы и «Друзья на карте»), а фото — при загрузке изображения в карточку компаний и мест.

Мы сделали всё, чтобы пользователь понимал, что происходит и для чего мы просим доступ. Сами разрешения запрашиваем в момент обращения к фиче, а не при запуске приложения.

Обе эти пермиссии — опциональные и существуют со времён, когда мы ещё были в Google Play.

Зачем вам permission на SMS и журнал звонков?

Мы не используем и не запрашиваем у пользователя разрешения ни на SMS, ни на журнал звонков.

Мы используем SMS Retriever API от Google, для работы которого получения разрешений на SMS не требуется. Этот API позволяет автоматически вводить одноразовый код из нашего же смс при регистрации по номеру телефона.

При проверке Google Play Protect ошибочно отнёс нас в категорию spyware.

b6c9a7f9032e03f900f7e9b73aa0049d.png

В заблуждение вводит шаблонный текст от Google Play Protect. Для предупреждений об опасности приложений из этой категории используется текст, который не соответствует запрашиваемым 2ГИС пермиссиям. Из-за этого может показаться, что 2ГИС якобы имеет доступ ко всем смс, журналу звонков и т. д.  

В версии 6.31.0.535 мы удалили всю функциональность по автоматической вставке кода из смс, чтобы проверить, может ли на это срабатывать Google Play Protect.

Зачем вам ACCESS_BACKGROUND_LOCATION и ACTIVITY_RECOGNITION?

Для фичи «Друзья на карте». Так шарим геопозицию в фоне для друзей, которым сам пользователь разрешил её видеть. Просто наличие человека в контактах не даёт ему возможность видеть ваше местоположение — вы должны это подтвердить.

Самостоятельно приложение не может получить права фонового определения геопозиции. Чтобы 2ГИС получил доступ, пользователь сам должен перейти в настройки телефона и явно их выдать.

Разрешение запрашиваем только при включении «Друзей на карте», оно необязательное и нужно только для тех, кто решил использовать фичу.

Фича запускается пользователем. После этого появляется онбординг с объяснением, что геопозиция будет шариться и что это требует дополнительных прав и действий.

26d996e329b0350ff1ae91bc51a07937.png

Запрос на отображение геопозиции в фоне отличается от запроса геопозиции для отображения на карте маркера местоположения, который уже давно с нами. Там мы не запрашиваем фоновую геопозицию.

Зачем вам READ_CONTACTS?

Для построения социального графа (отзывы и «Друзья на карте»).

Пермиссия необязательная, запрашиваем только если пользователь сам хочет добавить в 2ГИС контакты для «Друзей на карте» или для отображения рекомендаций в отзывах. 

В новой версии 6.31.0.535 удалили READ_CONTACTS, на эту permission теоретически мог ошибочно срабатывать Google Play Protect.

Зачем картографическому приложению CALL_PHONE?

CALL_PHONE используется для звонка в компанию напрямую из приложения без дополнительного перехода в дайлер (звонилку).

Мы используем именно CALL_PHONE, а не READ_PHONE_STATE. Принципиальное отличие — через READ_PHONE_STATE приложение могло бы получить IMEI, номер телефона, состояние активности вызова, а так же номера, с которыми установлено соединение.

Пермиссия CALL_PHONE в приложении уже давно. Запрашиваем непосредственно после тапа на номер телефона в карточке компании.

В версии 6.31.0.535 CALL_PHONE удалили. У пользователей этой версии теперь запускается дайлер, который назначен для использования по умолчанию.

Проверяем, мог ли Google Play Protect ошибочно срабатывать на эту permission.

Зачем картографическому приложению RECORD_AUDIO?

Для голосового ввода текста — эта функция есть во множестве популярных приложений. Например, при поиске или голосовом управлении навигатором.

Запрашиваем в момент активации голосового ввода.

Почему Google Play Protect перестал ругаться на последнее обновление?

Параллельно с подачей апелляции в Google удалили permission, на которые теоретически мог ошибочно срабатывать Google Play Protect.

Версия 6.31.0.535 отличается отсутствием следующих permission:

  • android.permission.READ_CONTACTS

  • android.permission.CALL_PHONE

  • SMS Retriever API (это не permission, но в ситуации недостатка информации решили тоже отключить).

Почему при самообновлении через 2ГИС от Google Play Protect все равно появляется предупреждение на новую версию?

Несмотря на то, что свежая версия 6.31.0.535, кажется, свободна от предупреждений Google Play Protect, обновиться на неё с «harmful»-версии без предупреждения не получится, так как для Google Play Protect всё выглядит так, что spyware пытается установить ещё одно приложение, и это конечно же должно пройти через предупреждение пользователю.

А почему старые версии 2ГИС не «harmful»?

Мы не знаем. И по использованию данных, и по permissions, связанных с spyware, они одинаковые с «harmful»-версиями.

Может быть проблема в новой фиче «Друзья на карте» по шарингу геопозиции?

Мы рассматриваем эту версию. Но против неё три аргумента:

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

  2. Google Play Protect отнёс бы 2ГИС не в категорию spyware, а в категорию stalkerware.

  3. В новой версии 6.31.0.535 мы не удаляли эту фичу, а Google Play Protect перестал относить приложение к spyware и больше не видит проблем с безопасностью.

bebaf3eec5f9e917a5152554771db20a.png

Апелляцию подали?

Да, 10 января. На 15 января статус «in progress».

Обращения по другим каналам тоже остаются без внимания, в том числе обращение в Google Play Community, поддержанное нашей аудиторией (спасибо вам!)

Может быть причина в поддержки API level 34?

Мы пока сделали только минимальную интеграцию Android 14, новых фичей не добавляли. Но само поднятие API конечно же могло повлиять. Однозначных причин не нашли.

Вас ведь нет в Google Play, вы начали использовать dangerous/signature permissions?

Мы не перестаём искать возможности, чтобы вернуться в Google Play. Поэтому соблюдаем все условия публикации приложений.

Исключение — android.permission.REQUEST_INSTALL_PACKAGES, так как вынуждены использовать самообновление.

Может быть, что это из-за REQUEST_INSTALL_PACKAGES?

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

А QUERY_ALL_PACKAGES используете?

Нет

Если отобрать у 2ГИС все permissions, он останется работоспособным?

Да. Как в случае, если не выдавать permissions — приложение будет работать с учётом ограничений. Например, приложение не будет показывать местоположение пользователя. 

После того как убедимся, что пермиссии отключены не случайно, к пользователю не пристаём и следуем гайдлайнам платформы по работе с пермиссиями.

Первый раз вижу чтобы Google Play Protect срабатывал на крупное известное приложение, 2ГИС первый?

На самом деле нет, 2ГИС не первый. Похожая история случилась с Samsung Wallet. Обсуждение на reddit и в треде на форуме Google.

Есть ли сейчас безопасная с точки зрения Google версия?

Свежая версия 6.31.0.535 свободна от предупреждений Google Play Protect. В ней мы удалили пермиссии, на которые теоретически мог ошибочно срабатывать Play Protect: android.permission.READ_CONTACTS, android.permission.CALL_PHONE, SMS Retriever API (это не пермиссия, но в ситуации недостатка информации решили тоже отключить).

Мы рекомендуем использовать её всем пользователям, чтобы не сталкиваться с предупреждениями.

Все равно вам не верю, вы просто очень складно сочиняете. Google крупная компания, почему я должен верить вам?

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

Вы можете обновиться на новую версию 6.31.0.535, которую Google Play Protect уже не помечает, как spyware, или временно отобрать у 2ГИС все разрешения.

© Habrahabr.ru