Может ли Android подписать вызов http / https, чтобы однозначно идентифицировать приложение, выполняющее запрос? - PullRequest
0 голосов
/ 27 ноября 2018

Скажите, CORS для приложений.Ну, не то же самое, но ...

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

Как я могусделать это?

Что я ожидаю от ОС, так это некоторый процесс, такой как добавление в мой http-запрос пары заголовков с указанием идентификатора приложения на рынке и подписание всего запроса с подписью вцепочка андроида -или на соответствующем рынке сертификат цепочки CA-.Затем мой сервер может проверить, что запрос исходит от нужного приложения.

Кроме того, ОС может добавить некоторую сертифицированную информацию об оборудовании, поэтому, если приложение запускается в эмуляторе, я тоже могу отказать в обслуживании.

Другим способом может быть включение «секретного» в приложение, конечно, но оно всегда может быть перепроектировано декомпиляцией, не так ли?Или существует какое-то хранилище ключей, связанное с хранилищем воспроизведения, которое можно использовать для предоставления этого секрета во время запросов https на сервер?

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

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Используйте поток Аттестации сети безопасности для запроса секретного токена на сервер.

После прочтения связанных вопросов, я думаю, уловка заключается в том, чтобы использовать поток сети безопасности:

  • с помощью API аттестации SafetyNet приложение получает подписанный json от служб Android.
  • приложение генерирует некоторый идентификатор из android_id, случайного uuid или обоих.
  • И Id, и JSONотправляются на сервер, который затем может проверить, что запрос поступил от реального приложения, сохранить идентификатор и данные конфигурации и согласовать токен для дальнейшей связи.
  • с помощью API цепочки для ключей приложение сохраняет идентификатор итокен в хранилище ключей для использования в будущем

Это умозрительный ответ (я являюсь ОП), пожалуйста, проголосуйте только в том случае, если вы уверены, что он верен и лучшей альтернативы нет в списке.

Attestation Flow, from Android documentation

0 голосов
/ 11 декабря 2018

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

Как я могу это сделать?

Для достижения наилучшего уровня безопасности между вашим приложением и сервером API вы должны использовать службу аттестации мобильных приложений вместе с решением SafetyNet, а также службу OAUTH2 и, наконец, закрепление сертификатов для защиты канала связи между сервером API и мобильным приложением,как описано в этой серии статей о методах Mobile API.

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

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

В казиноВ случае сбоя в Аттестации приложения JWT подписывается секретом, которого сервер API не знает.

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

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

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

Так почему бы не использовать только SafetyNet?Несмотря на то, что это хорошая функция безопасности, добавленная в Android, она не была предназначена для использования в качестве единственной защиты вашего приложения, согласно собственным словам Google :

Цель этогоAPI должен обеспечить вам уверенность в целостности устройства, на котором работает ваше приложение.Затем вы можете получить дополнительные сигналы, используя стандартные API Android.Вы должны использовать API аттестации SafetyNet в качестве дополнительного сигнала всесторонней защиты как части системы защиты от злоупотреблений, а не как единственный сигнал защиты от злоупотреблений для вашего приложения.

Прежде чем я уйду, я хотел быЯ хотел бы обратить внимание на следующее в решении SafetyNet:

  • Это часть Служб Google для мобильных устройств (GMS), поэтому он работает только на устройствах, у которых это есть.На некоторых рынках, например на Дальнем Востоке, существует значительное количество устройств, у которых нет такой возможности.

  • Существует ограниченное количество аттестационных вызовов, которые можно сделать с помощьюстандартный бесплатный API-ключ, поэтому для использования в масштабе (предположительно) платного уровня потребуется.

  • Он в первую очередь предназначен для проверки, является ли образ ОС, на котором запущено конкретное устройство Android,считается безопасным и совместимым или нет.Таким образом, его можно рассматривать как довольно продвинутую корневую проверку, которая может проверять изменения файловой системы, указывающие на корневые устройства.

  • Поскольку SafetyNet выполняет полный анализ хэшейОбраз ОС на самом деле может быть довольно медленным (иногда несколько секунд).Это означает, что он не может работать непрерывно, и при его использовании требуется некоторая осторожность, чтобы скрыть эту задержку от пользователя, но не создавая возможности для использования злоумышленником.

  • SafetyNet специально не анализирует карту памяти запущенных приложений для обнаружения каркасов инструментальных средств (она основана на том факте, что они могут работать только на корневых устройствах), таких как XPposed и Frida.

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

  • Чтобы выполнить аттестационную проверку способом, который не может быть подделан, приложение не может выполнить свою собственную проверку (как очевидно, этот код может быть подделан сам по себе).Таким образом, существует необходимость реализации серверной части для надежного использования этой функции.

0 голосов
/ 27 ноября 2018

Я думаю, что один из способов защитить ваш Backend - это присоединить токен из приложения в заголовке (или что-то уникальное из вашего приложения), чтобы никто не мог вызвать API, если он не присоединяет токен взаголовок.Но вам нужно проверить это в бэкэнде, чтобы убедиться, что заголовок содержит необходимый действительный токен.

...