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).
Источники
- Документация Android Developers:
WindowManager.LayoutParams.FLAG_SECURE. - Документация Android Developers:
android:secureScreen(атрибут манифеста). - Материалы конференций Google I/O по безопасности Android.
- Статья «Android Security: Preventing Screenshots and Screen Recording» на портале Medium.
- Книга «Android Security Internals» Николаса Элмана (No Starch Press, 2015).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →