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

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

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

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

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

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


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


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

Читайте також  React hooks — зрада чи перемога?

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


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

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

 

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

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

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

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

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

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

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

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

Читайте також  Гра, яка перевернула історію шутерів: Goldeneye 007 для Nintendo 64

Ви можете встановити параметр для 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? Насправді я вже придумала спосіб, але для початку потрібно протестувати його.

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

Читайте також  DevBoy — як я створив проект пристрої з відкритим вихідним кодом і запустив проект на Kickstarter

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

You may also like...

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

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