Как мы улучшили самозащиту приложения благодаря KNOX

Привет! Меня зовут Сергей Занкин, я старший разработчик в мобильном штабе «Лаборатории Касперского» на проекте Kaspersky Safe Kids — это программа родительского контроля и защиты ваших детей в режиме 24/7.

В данной статье расскажу о добавлении Samsung KNOX (далее KNOX) в проект для улучшения функций самозащиты приложения от удаления, остановки и прочих читерских действий. Сразу скажу, что KNOX действительно помог нам повысить эффективность самозащиты от обхода родительских ограничений — мы получили неплохой буст с маленькими вложениями.

image

Статья будет полезна тем, кто связан с MDM-технологиями, для управления мобильными устройствами, в частности через Samsung KNOX. А также тем, кто хочет узнать, какие возможности предоставляет KNOX для управления устройствами и как внедрить его в собственное приложение, и интересуется, какие могут быть сложности при внедрении и как подобрать нужный тип лицензии.

Почему KNOX


Решение использовать MDM-технологии было не спонтанным — это некая контрмера на постоянно вводимые ограничения со стороны Goolge, например runtime permission, doze mode и т. п.

На MDM-решения взгляд падал не один раз, однако всегда находились какие-то «проблемы», из-за которых мы отказывались от данного варианта. Например, хотели использовать Android Enterprise, но для активации режима Device Owner необходимо было сбрасывать устройство к заводским настройкам, а дальше просить на начальном экране 5 раз кликнуть на заголовок. Тут и начались первые сюрпризы: не везде работал данный способ (например, на Xiaomi). NFC не рассматривали, потом решили попробовать способ DPC Identificator. И тут нас ждало разочарование, так как для этого нужно состоять в программе Google Play EMM API, куда компания Google перестала принимать новых участников. Важно было использовать свое DPC-приложение, а не Google DPC.

Решили взять паузу. Новость пришла, откуда не ждали, а именно от компании Samsung, которая расширила варианты применения KNOX, а также сделала лицензии бесплатными.

Что такое KNOX-лицензия и как ее использовать?


Существуют следующие типы лицензий Knox Platform for Enterprise (KPE):
Добавлю, что на данный момент в проекте используется лицензия KPE Standard, которая покрывает все наши потребности.

Как начать использовать KNOX


Сперва нужно выполнить регистрацию на https://partner.samsungknox.com. После успешной регистрации откроется доступ к консоли разработчика, через которую будет предоставлен доступ к управлению лицензионными ключами.

Без действительного ключа невозможно будет активировать возможности KNOX на устройстве!

Процесс получения ключа состоит из нескольких шагов:

  1. Нужно определиться, какой ключ нужен — коммерческий или для разработчика.
  2. Необходим APK-файл, в котором реализуются возможности KNOX Api, чтобы подписать ключ его сигнатурой, то есть ключ можно использовать только в том приложении, для которого он выписан.
  3. Если необходима поддержка KNOX версии до 2.8, то нужно также получить ключ для обратной совместимости.


image

image

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

Активация KNOX не дает доступа к Android MDM API (Device Owner/Profile Owner).

Убедиться в этом можно, выполнив команду adb shell dumpsys user.

В случае активного KNOX запись Device owner id:-10000 не меняет значение с -10000 и Has profile owner: false не меняет значение на true: это говорит о том, что на устройстве не активирован режим работы Device Owner/Profile Owner.

Пример результата команды: adb shell dumpsys user
Current user: 0
Users:
 UserInfo{0:xxx:c13} serialNo=0 isPrimary=true
 .....
 Has profile owner: false
 .....
 .....
 Device owner id:-10000


Что нужно для добавления KNOX в проект?


Для использования KNOX нужно определиться со списком поддерживаемых версий, так как для поддержки KNOX до 2.8 версии потребуется сделать больше телодвижений.

Базовые шаги добавления KNOX Api в проекте следующие:

  1. Скачать и добавить в проект библиотеку knoxsdk.jar.
  2. Реализовать DeviceAdminReceiver.
  3. Реализовать обработчик для отслеживания состояния лицензии.
  4. Определиться с KNOX API, чтобы определить в AndroidManifest список KNOX-разрешений.


В разделе SDK Tool можно скачать актуальную версию SDK (knoxsdk.jar).

image

Перед тем как активировать KNOX-лицензию, нужно выдать разрешения для DeviceAdmin и проверить наличие Интернета.

Не все устройства Samsung поддерживают KNOX.

KNOX ограничивает вызовы методов KNOX API через KNOX-разрешения, поэтому перед тем, как использовать какой-либо метод, нужно объявить соответствующие разрешения в AndroidManifest.xml.

Чтобы понять, какие разрешения необходимы, нужно обратиться к официальной документации docs.samsungknox.com/devref/knox-sdk/reference/packages.html.

Например, чтобы использовать Geofencing API, нужно объявить разрешение com.samsung.android.knox.permission.KNOX_GEOFENCING.

image



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


Code Block 1. Пример AndroidManifest.xml с объявленными KNOX-разрешениями

Для получения результата активации KNOX-лицензии и отслеживания ее состояния в приложении необходимо реализовать BroadcastReceiver, который будет отслеживать событие com.samsung.android.knox.intent.action.KNOX_LICENSE_STATUS. В упрощенном виде код должен содержать минимум:

class KnoxLicenseReceiver : BroadcastReceiver() {
 
 override fun onReceive(context: Context?, intent: Intent?) {
 val errorCode = intent.getIntExtra(KnoxEnterpriseLicenseManager.EXTRA_LICENSE_ERROR_CODE, KnoxEnterpriseLicenseManager.ERROR_UNKNOWN)
 val resultType = intent.getIntExtra(KnoxEnterpriseLicenseManager.EXTRA_LICENSE_RESULT_TYPE, KnoxEnterpriseLicenseManager.LICENSE_RESULT_TYPE_VALIDATION)
 
 if (errorCode == KnoxEnterpriseLicenseManager.ERROR_NONE) {
 // success
 } else {
 // failed
 }
 
 if (resultType == KnoxEnterpriseLicenseManager.LICENSE_RESULT_TYPE_VALIDATION) {
 // validation
 } else if (resultType == KnoxEnterpriseLicenseManager.LICENSE_RESULT_TYPE_ACTIVATION) {
 // activation
 }
 }
}


Лицензия считается успешно активированной, если errorCode равен значению KnoxEnterpriseLicenseManager.ERROR_NONE и resultType равен значению KnoxEnterpriseLicenseManager.LICENSE_RESULT_TYPE_ACTIVATION.

Значение resultType также может быть KnoxEnterpriseLicenseManager.LICENSE_RESULT_TYPE_VALIDATION. Оно используется для проверки статуса лицензии (не отозвана / не истекла и т. п). Данное значение может приходить несколько раз в сутки и сигнализировать об изменении статуса лицензии: например, если лицензия истекла, то нужно активировать новый код.

Защита от удаления


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

В таблице в первом столбце указаны виды запретов, применяемых в политике KNOX, в колонке KNOX API приведен фрагмент кода, выполняющий данный запрет, а в колонке Permission — разрешение, необходимое для выполнения KNOX API для указанного фрагмента кода.


На устройствах Samsung с доступной функцией KNOX на экране Device Admin появится список запрашиваемых KNOX-разрешений (объявленных в файле AndroidManifest.xml):

image

Для активации KNOX-лицензии необходимо вызвать метод:

KnoxEnterpriseLicenseManager.getInstance(context).activateLicense("YOUR-LICENSE-KPE-KEY")


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

image

Если при активация произошла ошибка, то появится сообщение:

image

Геолокация


Сопутствующей задачей было желание улучшить определение месторасположения ребенка.
Данная задача была решена частично:

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


Основная проблема связана с тем, что KNOX не позволяет управлять источниками геоданных (wifi/cell/gps и т. п.), а только разрешает включать настройку GPS.

Также выяснилось, что KNOX не помогает получить координаты, если устройство находится в DOZE-режиме (heavy doze). Правда, нужно обратить внимание, что режим DOZE наступает после длительного периода бездействия устройства (на бюджетных устройствах режим DOZE может активироваться через 10–30 минут бездействия), из-за чего можно считать актуальными те координаты, которые были до входа в DOZE.

Результаты


В заключение — несколько наглядных кейсов использования KNOX Api для улучшения самозащиты:

  1. Если KSK пытаются остановить, KNOX запрещает это делать и отображает соответствующее сообщение.
    image
  2. На «домашнем» экране скрывается возможность удалить приложение.image
  3. Нельзя отозвать разрешение Device Admin, так как кнопка неактивная.image
  4. На экране информации о приложении нельзя удалить приложение и остановить его (кнопки неактивные).
    image

Итоги


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

Если вам было интересно и вы хотите углубиться в тему вместе с нами — находить слабые места, экспериментировать с разными технологиями и улучшать работу наших приложений с их помощью, — приходите к нам в мобильную команду, где прямо сейчас мы ищем C++ разработчиков. Процесс найма у нас максимально упрощен — так что уже через пару дней сможете увидеть, как наши подходы реализованы изнутри :)

А если вдруг вы не до конца уверены в своих знаниях C++, то можете сперва проверить силы в нашей игре про умный город.

© Habrahabr.ru