Розробка

Всі снапшоти потрапляють у рай

Зараз всі ми використовуємо банківські програми. Це зручно, швидко і, як нам здається, безпечно. Банки навіть ввели додаткові pin-коди для того, щоб навіть якщо ви втратите свій телефон або якщо він потрапить у руки сторонню людину ваші кошти і конфіденційні дані були захищені. І це так класно! Банки дбають про нашу безпеку!

Але, на жаль, якщо ви відкриєте той же банківське додаток в таск менеджері, то ви побачите вміст екрана (наприклад, інформацію по рахунку банківської карти, чат, в якому ви щось обговорювали з співробітником банку). Ви можете перевірити це на встановлених у вас банківських програмах. Я вивчила всі найбільш відомі — і всі вони не приховують конфіденційну інформацію, коли ви знаходитесь у фоновому режимі.

Для прикладу я заскринила абстрактні банки, на абстрактних сторінках. І зараз, відразу ж задам вам запитання: ви зібралися перевести гроші своєї мами/подрузі/собаці, ви вже знаходитесь на сторінці перекладу та вийшли з програми, щоб скопіювати код з sms (якщо ви в пориві параної заборонили банківського додатком доступ), або подивитися яку-небудь інформацію. Але коли ви вирішите знову повернутися у ваше банківське додаток, який екран ви оберете?

Як ми бачимо, перед вами два абсолютно ідентичних екрану і поспіхом можна і не помітити цього. Ви натиснете на останній додаток, перейдете в нього, введете дані і вуаля, ваші гроші перевелися. А куди вони перевелися? Кому?

І справа не тільки в тому абстрактному банку, я переглянула декілька найбільш популярних банків і всі вони страждають такою проблемою.


Цікаво, але на боці iOS вміст екрану в таск менеджері приховано.


І цьому є пояснення. Але про це трохи пізніше, зараз ми говоримо про Android. Отже, навіщо ж приховувати вміст екрану, якщо користувач вийшов з програми?

Давайте для початку розберемося як взагалі працює екранний менеджер (Останній screen)


На цьому екрані ми бачимо список наших раніше відкритих додатків. Нам навіть показано місце, де ми зупинили свою взаємодію з конкретним додатком. Але справа в тому, що ми бачимо не сам додаток, ми бачимо снапшот, який робиться перед виходом з програми.

Що відбувається насправді (коротко):

 

  • Додаток перейшло у фоновий режим
  • Менеджер вікон поміщає снапшот програми в GraphicBuffer
  • GraphicBuffer відправляється в SystemUI через Binder для попереднього перегляду програми

Так що ми бачимо тут не вміст додатки, а лише снапшот, зроблений в останній момент перед переходом конкретного додатка в фон.

Але, як ви здогадалися, не все так просто, до цих снапшотам можна отримати доступ, приміром, так само показати користувачеві в Останній screen іншу програму під виглядом банківського, чим і користуються трояни. Користувач повертається в банківське додаток, вводить всі необхідні реквізити, гроші переводяться, але зовсім не туди, куди б ми хотіли.

Або можна просто відправити ці знімки, наприклад, у Китай, де суворі китайці збирають інформацію про все і про всіх. Методи використання отриманих скріншотів можна придумувати нескінченно.

Здебільшого, звичайно ж, потурбуватися приховуванням конфіденційних даних потрібно банківських додатків або додатків, які містять яку-небудь критично важливу інформацію, не призначену для чужих очей.

Заборонити робити снапшоти, або блюрить їх можна тільки всередині конкретного додатка. І в документації написано, що тільки виробники пристроїв можуть модифікувати клас, який відповідає за механізм отримання та зберігання снапшотов.

Як заборонити системі робити снапшоти

Є декілька способів, однак, на жаль, не всі з них достатньо оптимістичні. Якщо ви хочете використовувати який-небудь з них в своєму додатку, переконайтеся, що все буде працювати добре на всіх пристроях.

Ви можете встановити параметр для activity:

android:excludeFromRecents = "true"

Однак цей спосіб порушить логіку взаємодії користувача з додатком, так як додаток взагалі не буде показуватися в Останній 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()

Даний спосіб не порушує логіку взаємодії, але система починає ставитися до вмісту екрана програми як до захищеного, не дозволяючи робити снапшоти. Нижче наведено приклад, як це буде виглядати в Останній Screen.

Крім цього є спосіб відстеження onPause(). Але тут доведеться постійно тримати заготовлене view у стані View.GONE, щоб коли програма йде в фон можна було зробити View.VISIBLE. Але це також буде працювати не дуже надійно, так як, на жаль, неможливо контролювати час зняття снапшота.

До речі, а віз змогла, ну хто б сумнівався:) На скріні секретний чат, в даному випадку використовується саме FLAG_SECURE.


Так чому ж банки приховують вміст додатки на платформі iOS, яка тепер вважається безпечнішим (що є оману), і залишають як є для платформи Android? Швидше за все, їм просто не подобається як додаток буде виглядати в Останній Screen. Тобто просто біле полотно. У iOS ж реалізація дозволяє робити красиво. В результаті ми отримуємо шкоди безпеці на догоду краси. Можливо вам все одно, поки ваші гроші лежать там, де ви хотіли б, а конфіденційність даних непохитна. Але чи готові ви платити?..

Отже, щоб не закінчувати на такій песимістичній ноті, піднімемо питання, можна зробити красиво і для Android? Насправді я вже придумала спосіб, але для початку потрібно протестувати його.

Якщо вам цікава ця тема, я можу описати як взагалі все це працює зсередини. Як можна витягнути снапшоти, як працює система андроїд, про уразливість мобільних додатків.

Я вирішила зробити собі виклик і писати що-небудь корисне на регулярній основі. Буду публікувати замальовки в своєму каналі @miproblema в телеграм, а потім вже збирати в повноцінні пости. Всім пока-поки що.

Related Articles

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Close