Но, к сожалению, если вы откроете то же банковское приложение в таск менеджере, то вы увидите все содержимое его экрана (например, информацию по счету, банковской карте, чат, в котором вы что-то обсуждали с сотрудником банка). Вы можете проверить это на установленных у вас банковских приложениях. Я изучила все наиболее известные — и все они не скрывают конфиденциальную информацию, когда вы находитесь в фоновом режиме.
Для примера я заскринила абстрактные банки, на абстрактных страницах. И сейчас сразу же задам вам вопрос: вы собрались перевести деньги своей маме/подруге/собаке, вы уже находитесь на странице перевода и вышли из приложения, чтобы скопировать код из sms (если вы в порыве паранойи запретили банковскому приложению доступ), или посмотреть какую-нибудь информацию. Но когда вы вновь решите вернуться в ваше банковское приложение, какой экран вы выберите?
Как мы видим, перед вами два абсолютно идентичных экрана и второпях можно и не заметить этого. Вы нажмете на последнее приложение, перейдете в него, введете данные и вуаля, ваши деньги перевелись. А куда они перевелись? Кому?
И дело не только в том абстрактном банке, я просмотрела несколько наиболее популярных банков и все они страдают такой проблемой.
Интересно, но на стороне iOS содержимое экрана в таск менеджере скрыто.
И этому есть объяснение. Но об этом чуть позже, сейчас мы говорим про Android. Итак, зачем же скрывать содержимое экрана, если пользователь вышел из приложения?
Давайте для начала разберемся как вообще работает экранный менеджер (Recents screen)
На этом экране мы видим список наших ранее открытых приложений. Нам даже показано место, где мы остановили свое взаимодействие с конкретным приложением. Но дело в том, что мы видим не само приложение, мы видим снапшот, который делается перед выходом из приложения.
Что происходит на самом деле (кратко):
- Приложение перешло в фоновый режим
- Диспетчер окон помещает снапшот приложения в GraphicBuffer
- GraphicBuffer отправляется в SystemUI через Binder для предварительного просмотра приложения
Так что мы видим здесь не содержимое приложения, а лишь снапшот, сделанный в последний момент перед переходом конкретного приложения в фон.
Но, как вы догадались, не все так просто, к этим снапшотам можно получить доступ и, к примеру, так же показать пользователю в Recents screen другое приложение под видом банковского, чем и пользуются трояны. Пользователь возвращается в банковское приложение, вводит все запрошенные реквизиты, деньги переводятся, но совсем не туда, куда бы мы хотели.
Либо можно просто отправить эти снимки, к примеру, в Китай, где суровые китайцы копят информацию обо всем и обо всех. Методы использования полученных скриншотов можно придумывать бесконечно.
По большей части, конечно же, озаботиться сокрытием конфиденциальных данных нужно банковским приложениям или приложениям, которые содержат какую-либо критически важную информацию, не предназначенную для чужих глаз.
Запретить делать снапшоты, либо блюрить их можно только внутри конкретного приложения. И в документации написано, что только производители устройств могут модифицировать класс, который отвечает за механизм получения и хранения снапшотов.
Как запретить системе делать снапшоты
Есть несколько способов, однако, к сожалению, не все из них достаточно оптимистичные. Если вы хотите использовать какой-либо из них в своем приложении, убедитесь, что все будет работать хорошо на всех устройствах.
Вы можете установить параметр для activity:
android:excludeFromRecents = "true"
Однако этот способ нарушит логику взаимодействия пользователя с приложением, так как приложение вообще не будет показываться в Recents Screen.
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}
setContentView()
Данный способ не нарушает логику взаимодействия, но система начинает относиться к содержимому экрана приложения как к защищенному, не позволяя делать снапшоты. Ниже приведен пример, как это будет выглядеть в Recents Screen.
Помимо этого есть способ отслеживания onPause(). Но тут придется постоянно держать заготовленное view в состоянии View.GONE, чтобы когда приложение уходит в фон можно было сделать View.VISIBLE. Но это также будет работать не очень надежно, так как, к сожалению, невозможно контролировать время снятия снапшота.
К слову, а телега смогла, ну кто бы сомневался:) На скрине секретный чат, в данном случае используется именно FLAG_SECURE.
Так почему же банки скрывают содержимое приложения на платформе iOS, которая итак считается безопаснее (что есть заблуждение), и оставляют как есть для платформы Android? Скорее всего, им просто не нравится как приложение будет выглядеть в Recents Screen. То есть просто белое полотно. В iOS же реализация позволяет делать красиво. В итоге мы получаем ущерб безопасности в угоду красоты. Возможно вам все равно, пока ваши деньги лежат там, где вы хотели бы, а конфиденциальность данных непоколебима. Но готовы ли вы платить?..
Итак, чтобы не заканчивать на такой пессимистичной ноте, поднимем вопрос, можно ли сделать красиво и для Android? На самом деле я уже придумала способ, но для начала нужно протестировать его.
Если вам интересна эта тема, я могу описать как вообще все это работает изнутри. Как можно вытащить снапшоты, как работает система андроид, об уязвимостях мобильных приложений.
Я решила сделать себе вызов и писать что-нибудь полезное на регулярной основе. Буду публиковать зарисовки в своем канале @miproblema в телеграмм, а потом уже собирать в полноценные посты. Всем пока-пока.
Комментарии (22)
spam312sn
26.11.2018 11:58К слову, в Telegram, не только в секретных переписках, но и при включённой блокировке приложения пин-кодом, так же отключается предпросмотр окна в режиме просмотра активных приложений.
Не знаю, как дело обстоит с другими банками, но приложение от банка Citadele в Латвии, так же скрывает своё содержимое в этом режиме и запрещает делать снимки экрана при включённом приложении
simplix
26.11.2018 12:56Снапшот это снимок файловой системы, по статье у вас скриншот.
miproblema Автор
26.11.2018 12:58+2в андроид за это отвечает TaskSnapshot. Потому я не стала ничего нового придумывать
expeon
26.11.2018 13:11А еще, скрытие чувствительных данных в TaskSwitcher'е на iOS'е — это часть гайдлайнов.
GamePad64
26.11.2018 13:22Странно, что в Android сделали просто белый экран вместо какой-нибудь картинки с надписью, что "экран скрыт для сохранения конфиденциальности."
Abyss777
26.11.2018 13:41В самсунговской Защищенной папке, когда она заблокирована, приложения залиты основным цветом, а не белым.
Но если она не заблокирована, то можно сделать скриншот Recent и он сохранится вне её.
Как можно вытащить снапшоты
Интересно бы было выяснить насколько глубоко реализована «Защищенная папка» у Самсунг, да и у других производителей типа Blackberry, можно ли получать скриншоты/снапшоты «защищенных» приложений извне.
PavelMSTU
26.11.2018 13:42Если вам интересна эта тема, я могу описать как вообще все это работает изнутри. Как можно вытащить снапшоты, как работает система андроид, об уязвимостях мобильных приложений.
Интересно — даёшь цикл статей на хабре!
Новости и ссылки на другие документы думаю разумнее в телеграмм-канале постить.
NetherNN
26.11.2018 14:02к этим снапшотам можно получить доступ и, к примеру, так же показать пользователю в Recents screen другое приложение под видом банковского, чем и пользуются трояны.
Расскажите пожалуйста чуть подробнее про этот момент, как именно происходит получение доступа и подмена приложения?
STFBEE
26.11.2018 14:08Забавно, что в Activity есть метод onCreateThumbnail(), который даже не вызывается (а с API 28 он еще и @Deprecated)
Очень подробный ответ на SO на эту тему: stackoverflow.com/a/49340273/3562988
VDG
27.11.2018 01:36Как мы видим, перед вами два абсолютно идентичных экрана и второпях можно и не заметить этого. Вы нажмете на последнее приложение, перейдете в него, введете данные и вуаля, ваши деньги перевелись. А куда они перевелись? Кому?
Ни блюр ни полное сокрытие не помогут в данном сценарии, когда есть мимикрирующее под основное приложение.
поднимем вопрос, можно ли сделать красиво и для Android?
А я думал тут про безопасность.
3aBulon
27.11.2018 07:34Тут еще такая штука — по идее надо запретить делать снимок экрана(ну типа кнопки power+громкость или три пальца вниз), так как это тоже по идее утечка.
Но. Вот тут была акция у тинькоф банка, где обещали кэшбек за какую-то пиццу, я задание выполнил, пиццу съел но кэшбек не пришел. Сотрудник чата попросил скриншот активированного предложения в приложении, естественно я его не делал, а на момент разговора предложение уже ушло по сроку.
Sonikelf
27.11.2018 10:59Так почему же банки скрывают содержимое приложения на платформе iOS, которая итак считается безопаснее (что есть заблуждение), и оставляют как есть для платформы Android?
Скорее всего потому, что это забота ОС, а не приложения.
Далеко не последний Androiddgu_minsk
27.11.2018 13:25В телеге не совсем закрыт просмотр информации. Например снепшот главной страницы все равно может содержать информацию из «секретного» чата
mkll
27.11.2018 13:57iOS, которая итак считается безопаснее (что есть заблуждение)
Развейте же, скорее, это заблуждение.
Если вам интересна эта тема, я могу описать как вообще все это работает изнутри. Как можно вытащить снапшоты, как работает система андроид, об уязвимостях мобильных приложений.
Интереснее будет, если вы расскажете как работает система iOS, какие в ней есть уязвимости мобильных приложений и т.д. Чтобы развеять заблуждения о ее более высокой безопасности.
fRoStBiT
29.11.2018 05:57Поясните, пожалуйста, каким образом к снимкам может получить доступ стороннее приложение?
ilitaexperta
Думаю есть объяснение проще: им просто насрать на нищебродских Android-юзеров
nagibat0r
Какое ошеломительное объяснение.