Привет! Меня зовут Сергей Занкин, я старший разработчик в мобильном штабе «Лаборатории Касперского» на проекте 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):

Лицензии


Тип


Описание


Количество активаций


Срок действия


Максима
льное
кол-во
лицензий


Development


KPE Development


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


30


6 месяцев


1


Commercial


 


KPE Standard


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


10 000 000


2 года


100


 


KPE Premium


Предоставляет все стандартные разрешения, а также разрешения для вызова API-интерфейсов, которые предоставляют расширенные функции безопасности, такие как контейнеры, VPN и сертификаты, а также комплексную настройку устройства и kiosk mode.


10 000 000


2 года


Безлимит
ное


 


KPE DualDAR


Предоставляет все разрешения Premium, а также разрешение на вызов API, которые включают двойное шифрование данных.


Столько, сколько приобретено


год или вечно


Безлимит
ное



Добавлю, что на данный момент в проекте используется лицензия 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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 package="com.knox.example">
 
 <uses-permission android:name="com.samsung.android.knox.permission.KNOX_APP_MGMT" />
 <uses-permission android:name="com.samsung.android.knox.permission.KNOX_RESTRICTION_MGMT" />
 <uses-permission android:name="com.samsung.android.knox.permission.KNOX_LOCATION" />
 <uses-permission android:name="com.samsung.android.knox.permission.KNOX_MULTI_USER_MGMT" />
 <uses-permission android:name="com.samsung.android.knox.permission.KNOX_CUSTOM_SETTING" />
 <uses-permission android:name="com.samsung.android.knox.permission.KNOX_ENTERPRISE_DEVICE_ADMIN" />
 
 <application>
 <meta-data android:name="com.samsung.knoxlicense.permissions" android:value="true" />
 
 <receiver
 android:name=".receiver.KnoxLicenseReceiver"
 android:exported="false">
 <intent-filter>
 <action android:name="com.samsung.android.knox.intent.action.KNOX_LICENSE_STATUS" />
 <action android:name="com.samsung.android.knox.intent.action.LICENSE_STATUS" />
 </intent-filter>
 </receiver>
 </application>
 
</manifest>

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 для указанного фрагмента кода.

Action


KNOX API


Permission


Запрет на остановку процесса


EnterpriseDeviceManager.getInstance(context).applicationPolicy.addPackagesToForceStopBlackList(arrayListOf(packageName))
com.samsung.android.knox.permission.KNOX_APP_MGMT

Запрет на удаление приложения


EnterpriseDeviceManager.getInstance(context).applicationPolicy.setApplicationUninstallationDisabled(packageName)
com.samsung.android.knox.permission.KNOX_APP_MGMT

Запрет на отзыв разрешения для DeviceAdmin


EnterpriseDeviceManager.getInstance(context).adminRemovable = false
com.samsung.android.knox.permission.KNOX_ENTERPRISE_DEVICE_ADMIN

Запрет на сброс к заводским настройкам


EnterpriseDeviceManager.getInstance(context).restrictionPolicy.allowFactoryReset(false)
com.samsung.android.knox.permission.KNOX_RESTRICTION_MGMT

Запрет многопользовательского режима


EnterpriseDeviceManager.getInstance(context).multiUserManager.allowMultipleUsers(false)
com.samsung.android.knox.permission.KNOX_MULTI_USER_MGMT

Скрываем сброс системных настроек


CustomDeviceManager.getInstance().settingsManager.setSettingsHiddenState(true, CustomDeviceManager.SETTINGS_RESET)
com.samsung.android.knox.permission.KNOX_CUSTOM_SETTING

Запрет безопасного режима


EnterpriseDeviceManager.getInstance(context).restrictionPolicy.allowSafeMode(false)
com.samsung.android.knox.permission.KNOX_RESTRICTION_MGMT

На устройствах 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++, то можете сперва проверить силы в нашей игре про умный город.

Комментарии (11)


  1. ifap
    13.04.2023 06:58
    -3

    улучшения функций самозащиты приложения от удаления, остановки и прочих читерских действий

    Оригинальный подход... а изменения в УК, предполагающие уголовную ответственность за удаление приложений со своего смартфона и прочие читерские действия ввести не желаете-с?


    1. pvpokr
      13.04.2023 06:58
      +6

      детям уголовную ответственность!? Феликс Эдмундович, вы?


  1. atrost
    13.04.2023 06:58

    @zserj0как вам удалось решить проблему с обходом удаления приложения через загрузку Android в "безопасном режиме"?

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


    1. zserj0 Автор
      13.04.2023 06:58
      +1

      Запретили работу в безопасном режиме: EnterpriseDeviceManager.getInstance(context).restrictionPolicy.allowSafeMode(false)

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


      1. atrost
        13.04.2023 06:58

        Интересное решение, надо будет опробовать. Также интересен вариант сброса к заводским настройкам через прошивку полной прошивки через Odin.


  1. yogire
    13.04.2023 06:58

    Некоторое время назад, если включить KNOX папку на смартфоне, переставало работать приложение Tinkoff банка


    1. zserj0 Автор
      13.04.2023 06:58

      При активации KNOX API не сталкивались с такой проблемой


  1. zserj0 Автор
    13.04.2023 06:58

    При активации KNOX API не сталкивались с такой проблемой


  1. HenryPootle
    13.04.2023 06:58

    Немного не в тему, но про Kaspersky Kids :)

    Что Kaspersky умеет того, что не умеет Family Link и наоборот? Я вот реально не понимаю, зачем мне стороннее приложение вместо интегрированного с системой?


    1. zserj0 Автор
      13.04.2023 06:58

      1. KSK появился раньше, чем FL.

      2. FL есть возрастные ограничения по работе до 13 лет. После 13 лет только по согласию ребенка родитель может управлять его аккаунтом.

      3. Разный подход к работе функционала, как пример, веб защита в KSK работает не только в Chrome.


  1. Kwarius
    13.04.2023 06:58
    +1

    Интересно наблюдать за использованием Knoxa над которым работал 8 лет в MV ????

    Хорошо все расписал ???? хоть и использовали его возможности на 0.01%, на его основе вы сможете делать с девайсом все что угодно ????