Открыть сервис

FLAG_SECURE

FLAG_SECURE — это константа (флаг) операционной системы Android, используемая для защиты содержимого окна приложения от несанкционированного копирования, записи экрана (скринкастинга) и создания скриншотов. Установка данного флага в коде приложения или в его манифесте запрещает системе Android делать снимки экрана (скриншоты) или транслировать видео с экрана приложения в момент, когда окно этого приложения находится на переднем плане. Флаг входит в состав класса WindowManager.LayoutParams и применяется для повышения безопасности конфиденциальных данных, отображаемых на экране устройства.

Назначение и принцип действия

Основная цель FLAG_SECURE — предотвратить утечку визуальной информации из приложения через стандартные механизмы операционной системы. При установленном флаге Android блокирует следующие действия:

  • Создание скриншотов с помощью аппаратных кнопок (например, одновременное нажатие кнопок питания и уменьшения громкости).
  • Запись экрана (скринкастинг) с использованием встроенных или сторонних программ, работающих через API Android.
  • Отображение содержимого окна в системном интерфейсе переключения между приложениями (Recents / Overview). Вместо реального содержимого окна в этом интерфейсе отображается пустая область, часто залитая чёрным или серым цветом, либо логотип приложения.

Технически флаг применяется к объекту Window, который представляет собой окно приложения. Когда окно становится видимым, система проверяет наличие флага FLAG_SECURE. Если он установлен, то буфер кадра (framebuffer), содержащий изображение окна, не передаётся в системные сервисы, отвечающие за захват экрана. Вместо этого в буфер захвата помещается пустое или защищённое изображение.

Применение в разработке

Установка флага в коде

Разработчик может установить флаг программно, в методе onCreate() активности или в другом месте, где доступен объект Window. Пример на языке Java:

``java getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); ``

На языке Kotlin:

``kotlin window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE) ``

Установка флага в манифесте

Флаг также может быть установлен для всей активности через атрибут android:secureScreen в файле AndroidManifest.xml. Однако этот атрибут появился в Android 12 (API 31) и не поддерживается на более старых версиях. Для обратной совместимости рекомендуется использовать программный способ.

Снятие флага

Для отключения защиты в определённый момент (например, при переходе к некритичному экрану) используется следующий код:

``java getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); ``

Области применения

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

  • Банковские и финансовые приложения: защита экранов ввода пин-кодов, номеров карт, балансов счетов и истории транзакций. Например, приложение «Сбербанк Онлайн» использует этот флаг для предотвращения записи экрана при входе в личный кабинет.
  • Приложения для аутентификации: экраны ввода паролей, одноразовых кодов (OTP), биометрических данных (отпечаток пальца, Face ID).
  • Медицинские приложения: отображение результатов анализов, диагнозов, персональных данных пациентов, особенно в системах электронных медицинских карт.
  • Корпоративные приложения: защита коммерческой тайны, внутренних документов, переписки, планов разработки.
  • Приложения для просмотра защищённого контента: видеоплееры, отображающие фильмы или другой контент, защищённый авторским правом (DRM). Например, приложения Netflix, ivi, Okko.
  • Приложения для работы с государственными сервисами: порталы «Госуслуги», «Мои документы» и аналогичные.

Ограничения и недостатки

Несмотря на эффективность в рамках стандартного API Android, FLAG_SECURE имеет ряд ограничений:

  • Не защищает от физического фотографирования: флаг не предотвращает съёмку экрана с помощью другого устройства (например, фотоаппарата или смартфона). Это аппаратно-независимая уязвимость.
  • Не защищает от рутированных устройств: на устройствах с root-доступом злоумышленник может отключить проверку флага на уровне ядра или заменить системные сервисы, отвечающие за захват экрана.
  • Не защищает от вредоносного ПО с правами Accessibility: некоторые вредоносные программы, использующие сервисы специальных возможностей (AccessibilityService), могут получать содержимое экрана в обход стандартного API захвата.
  • Не защищает от утечек через другие каналы: например, через буфер обмена (если приложение копирует данные в буфер) или через логирование.
  • Влияние на пользовательский опыт: пользователь не может сделать скриншот экрана приложения, что может быть неудобно, если необходимо сохранить информацию для личного использования (например, номер заказа или код подтверждения). В некоторых случаях это может вызывать негативную реакцию.
  • Несовместимость с некоторыми функциями: флаг может блокировать работу системных функций, таких как «Плавающее окно» (Picture-in-Picture) или «Разделение экрана» (Split Screen), если они полагаются на захват экрана.

Альтернативные подходы

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

  • Использование SurfaceView с защищённым буфером: для отображения видео с DRM-защитой применяется класс SurfaceView с флагом SECURE, который гарантирует, что содержимое поверхности не может быть захвачено даже через SurfaceFlinger.
  • Маскировка конфиденциальных данных: вместо полного запрета скриншотов можно скрывать чувствительные поля (например, номера карт) с помощью символов-заменителей (****) и отображать их только по запросу пользователя.
  • Использование оверлеев: наложение полупрозрачного слоя поверх конфиденциального содержимого, который делает скриншот бесполезным, но не мешает просмотру.
  • Обнаружение записи экрана: приложение может проверять, активна ли запись экрана, и при обнаружении предупреждать пользователя или блокировать отображение данных.

Интересные факты

  • Флаг FLAG_SECURE был введён в Android 2.3 (Gingerbread, API 9) и с тех пор поддерживается во всех последующих версиях.
  • В некоторых версиях Android (например, 4.4 KitKat) существовала ошибка, при которой флаг не работал для приложений, работающих в режиме «киоск» (kiosk mode).
  • В Android 10 и выше появилась возможность программно определять, активна ли запись экрана, через метод MediaRecorder.isRecording().
  • В операционной системе iOS аналогом FLAG_SECURE является свойство isSecureTextEntry для текстовых полей и UIApplication.isIdleTimerDisabled для блокировки скриншотов (но только для определённых типов контента, например, для видео с DRM).

Источники

  1. Документация Android Developers: WindowManager.LayoutParams.FLAG_SECURE.
  2. Документация Android Developers: android:secureScreen (атрибут манифеста).
  3. Материалы конференций Google I/O по безопасности Android.
  4. Статья «Android Security: Preventing Screenshots and Screen Recording» на портале Medium.
  5. Книга «Android Security Internals» Николаса Элмана (No Starch Press, 2015).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →