Захистіть конфіденційність користувачів: безпека додатків для Android для розробників

Автор: Peter Berry
Дата Створення: 20 Lang L: none (month-012) 2021
Дата Оновлення: 16 Червень 2024
Anonim
Поездка в капсуле Hyperloop, компьютер встроенный в клавиатуру и космический туризм (ukr, rus sub)
Відеоролик: Поездка в капсуле Hyperloop, компьютер встроенный в клавиатуру и космический туризм (ukr, rus sub)

Зміст


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

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

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

Неохайний підхід до мобільної безпеки може призвести до дуже поганого розголосу.

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


Будьте в курсі залежностей

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

Перед тим, як розгорнути додаток, також непогано здійснити останню перевірку, щоб переконатися, що оновлення не доступні.

Якщо ваш додаток використовує Google Play Services, ви можете перевірити, чи на пристрої користувача встановлена ​​найновіша версія, а потім запустити оновлення, якщо потрібно.

Щоб перевірити, чи оновлені сервіси Google Play на пристрої, зателефонуйте методу installIfNeeded () класу ProviderInstaller. Якщо оновлення доступне, то цей метод видасть виключення з авторизації, і користувачеві буде запропоновано оновити Служби Google Play на своєму пристрої.


Обмежте свої запити на дозвіл

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

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

Крім того, ви можете використовувати наміри для передачі завдання програмі, яка вже має необхідний дозвіл. Наприклад, замість того, щоб вимагати дозволів READ_CONTACTS та WRITE_CONTACTS, ви можете делегувати завдання додатку "Контакти":

Intent contactIntent = новий Намір (Intent.ACTION_INSERT); contactIntent.setType (ContactsContract.Contacts.CONTENT_TYPE); if (contactIntent.resolveActivity (getPackageManager ())! = null) {startActivity (contactIntent); }

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

Нехай ваші користувачі вирішують: відображення програми вибору програми

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

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

Видаючи неявний намір, ви повинні відображати програму вибору програми Android, де це можливо.

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

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

Intent myIntent = новий Намір (Intent.ACTION_SEND); Список possibleActivitiesList = queryIntentActivities (наміри, PackageManager.MATCH_ALL); // Перевірте, чи може більше однієї програми обробляти цей намір // if (possibleActivitiesList.size ()> 1) {// Відобрати програму вибору програми // String title = getResources (). GetString (R.string.app_chooser_title); Намір вибору = Intent.createChooser (намір, назва); startActivity (вибір); } else if (intent.resolveActivity (getPackageManager ())! = null) {startActivity (intent); }

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

Уникайте зовнішнього зберігання

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

Файли, збережені на зовнішньому сховищі, можна читати і записувати у всьому світі, тому будь-які дані, які ви зберігаєте у зовнішньому сховищі, потенційно можуть бути доступні та змінені будь-якою іншою програмою. Також немає гарантії, що зовнішній носій зберігання даних залишатиметься підключеним до поточного смартфона чи планшета. Якщо ваш додаток записується на зовнішню пам’ять, можливо, ви можете зберігати конфіденційні користувацькі дані на SD-карту, яку згодом буде видалено та вставлено у чужий пристрій!

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

У наведеному нижче фрагменті ми записуємо дані до внутрішнього сховища:

final String FILE_NAME = "user_data.txt"; String fileContents = "Цей текстовий файл містить конфіденційні дані користувача"; спробуйте (BufferedWriter Writer = новий BufferedWriter (новий FileWriter (новий файл (getFilesDir (), FILE_NAME)))) {write.write (fileContents); } catch (IOException e) {// Щоб зробити: Обробляти виняток //}

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

Використовуйте новий доступ до каталогу в масштабному режимі Android

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

Хоча ви можете вимагати дозволу READ_EXTERNAL_STORAGE, це часто надасть вашій програмі доступ до більшої кількості даних, ніж потрібно. Додаток неможливо неправильно обробляти дані, до яких він не має доступу, тому слід намагатися мінімізувати кількість інформації, до якої може отримати доступ ваша програма, де це можливо.

Замість того, щоб вимагати дозволу READ_EXTERNAL_STORAGE, ви можете запитати доступ до певного каталогу. Це розширений доступ до каталогу вимагає використовувати клас StorageManager, а потім створити намір, викликавши метод StorageVolume.createAccessIntent () цього примірника. Наприклад, у наведеному нижче фрагменті ми отримуємо доступ до зовнішньої каталогу зображень:

StorageManager newStorageManager = (StorageManager) getSystemService (Context.STORAGE_SERVICE); StorageVolume volume = newStorageManager.getPrimaryStorageVolume (); Намір наміру = об'єм.createAccessIntent (Environment.DIRECTORY_PICTURES); startActivityForResult (наміри, код запиту);

Якщо користувач надає вашій програмі доступ до цього зовнішнього каталогу, Android зателефонує на ваш перегляд onActivityResult () з кодом результату RESULT_OK, а також наміром, що містить URI для запитуваного каталогу.

Ніколи не кешуйте чутливі дані користувачів

Під час обробки нечутливих даних програми, можливо, ви зможете покращити роботу користувачів, зберігаючи ці дані в кеші пристрою.

Для кешів, більших за 1 Мб, ви можете використовувати getExternalCacheDir (), який поверне шлях до каталогу, що відповідає додатку, де ви можете зберігати вміст, кешований.

Якщо ви вирішили кешувати, то просто пам’ятайте, що будь-яка програма, яка має дозвіл WRITE_EXTERNAL_STORAGE, може потенційно записувати в ці файли, тому вам слід ніколи зберігайте приватну чи конфіденційну інформацію в кеші, якщо ви дбаєте про безпеку додатків Android.

Захистіть ваші ключі від несанкціонованого використання

Система Android Keystore дозволяє зберігати криптографічні ключі в контейнері, що ускладнює витяг цих ключів з пристрою.

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

Ви також можете використовувати Keystore, щоб обмежити, коли і як можна використовувати ваші ключі, наприклад, ви можете обмежити використання клавіш певними криптографічними режимами або вимагати автентифікацію користувача.

Зробіть свої ContentProviders приватними

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

Якщо вам явно не потрібно обмінюватися даними із додатком третьої сторони, ви повинні зробити всі свої ContentProviders приватними, позначивши їх як android: exported = false в Manifest вашої програми. Якщо ваша програма сумісна з Android 4.1.1 або новішою версією, особливо важливо позначити ваші приватні ContentProviders як android: експортований = false, оскільки всі ContentProviders за замовчуванням є загальнодоступними.

Відбийте пальці ваших користувачів, використовуючи біометричну автентифікацію

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

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

Дотримуйтесь всі передовий досвід роботи в мережі

На відміну від менш портативних пристроїв, таких як настільні комп’ютери, ми часто підключаємо наші смартфони та планшети до незахищених бездротових мереж, таких як безкоштовний громадський Wi-Fi. Щоб зберегти конфіденційність користувача, слід підходити до всіх мережевих транзакцій як за своєю суттю ризикованих, особливо коли ви передаєте дані користувача.

Щоразу, коли вам потрібно здійснити мережеву транзакцію, важливо дотримуватися всіх найкращих практик роботи в мережі Android:

  • Використовуйте HTTPS замість HTTP, коли він підтримується на сервері.
  • Ніколи не довіряйте даним, завантаженим з незахищених протоколів, включаючи відповіді, видані проти HTTP.
  • Використовуйте відповідні протоколи для конфіденційних даних, наприклад HttpsURLConnection.
  • Там, де можлива автентифікація, використовуйте механізм IPC Android, наприклад Сервіс.
  • Використовуйте інструмент захисту мережі з відкритим кодом Nogotofail для тестування додатка на відомі вразливості та неправильні конфігурації TLS / SSL. Nogotofail включає тести для поширених проблем підтвердження сертифікатів SSL, помилок бібліотеки HTTPS і TLS / SSL, проблем з ясним текстом, а також проблем знімання SSL та STARTTLS. Для отримання додаткової інформації відвідайте сторінку GitHub компанії Nogotofail.
  • Де це можливо, уникайте завантаження коду поза вашої APK, оскільки це збільшує шанси когось із мережі змінити ваш код під час передачі.

Використовуйте WebViews з обережністю

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

Якщо ви невірно використовуєте WebView, ваш додаток буде вразливим для поширених проблем з веб-безпекою.

Щоб забезпечити безпеку користувачів Android, компонент WebView не виконує JavaScript за замовчуванням. Однак, якщо потрібно, ви можете увімкнути JavaScript, використовуючи getSettings () для отримання WebSettings, а потім запустивши метод setJavaScriptEnabled ():

WebView myWebView = (WebView) findViewById (R.id.webview); WebSettings webSettings = myWebView.getSettings (); webSettings.setJavaScriptEnabled (вірно);

Навіть якщо вам потрібно ввімкнути JavaScript, вам слід уникати використання addJavaScriptInterface (), де це можливо, оскільки цей метод вводить доданий об'єкт Java в компонент WebView. Якщо ваш додаток встановлено на пристрої під управлінням Android 4.2 або новішої версії, то цей спосіб потенційно може дозволити JavaScript маніпулювати вашою програмою.

Якщо ви використовуєте WebViews, ви не повинні дозволяти користувачам переходити до будь-якого веб-сайту, який ви не контролюєте, але, зокрема, ви повинні ніколи використовуйте метод addJavascriptInterface (), якщо користувач міг потенційно перейти на недовірену веб-сторінку, оскільки це величезний ризик безпеки додатків для Android.

Ніколи не слід використовувати метод addJavascriptInterface (), якщо користувач може потенційно перейти на ненадійну веб-сторінку.

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

Керуйте шаром захищених сокетів у додатку (SSL)

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

Зазвичай сервер налаштовується з сертифікатом, що містить відкритий ключ і відповідний приватний ключ. У рамках зв'язку між клієнтом SSL та сервером сервер підписує свій сертифікат криптографією з відкритим ключем. Однак третя сторона може генерувати власний сертифікат та приватний ключ, тому ваш клієнт також повинен мати один або більше сертифікатів, яким він довіряє. Якщо сертифікат не встановлений, вашій програмі не слід довіряти серверу.

Щоб полегшити цей процес, сервери часто налаштовуються сертифікатами відомих органів сертифікації (CA). Станом на рівень 17 API, Android підтримує понад 100 КА, які оновлюються з кожним випуском. Під час видачі сертифіката для сервера ЦС підписує сертифікат сервера за допомогою свого приватного ключа, а потім клієнт може перевірити, що сертифікат видається ЦА, відомому та довіреному платформі Android.

Якщо ваш додаток спілкується з веб-сервером, який має сертифікат, виданий довіреною службою CA, ви можете зробити свій запит у кількох рядках коду:

URL-адреса URL = нова URL-адреса ("https://www.google.com"); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection (); urlConnection.connect (); InputStream in = urlConnection.getInputStream ();

Однак є деякі сценарії, коли вищевказаний код призведе до виключення:

  • ЦА, який видав сертифікат сервера, невідомий. У цьому випадку ви можете навчити HttpsURLConnection довіряти цьому набору ЦО.
  • Сертифікат сервера був самопідписаний, а це означає, що сервер діє як власний ЦА. Для самопідписаних сертифікатів ви можете створити власний TrustManager, хоча ви повинні переконатися, що ваш сертифікат самопідписаний має надійний ключ.
  • У налаштуваннях сервера відсутній проміжний CA. Багато громадських організацій не підписують сертифікати сервера безпосередньо. Android довіряє лише кореневим центрам ЦС, тому серверу потрібно буде надіслати ланцюжок сертифікатів від сервера CA через будь-які проміжні продукти, необхідні для досягнення кореня. Якщо ви не можете налаштувати сервер для включення проміжного CA у ланцюг серверів, то одним із можливих варіантів вирішення проблеми є створення власного TrustManager.

Створення файлу конфігурації мережевої безпеки: довіра до власних ЦП

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

Щоб створити файл конфігурації безпеки мережі:

  • Якщо ваш проект ще не містить папки XML, вам знадобиться створити його. Клацніть клавішею вказівника до ресурсу вашого проекту та виберіть Створити> Каталог ресурсів Android.
  • Створіть у каталозі XML новий файл ресурсів XML, який буде служити вашим файлом конфігурації безпеки мережі. Я називаю цей файл network_config.
  • Відкрийте файл конфігурації мережі та вкажіть, що весь трафік до таких доменів повинен використовувати HTTPS:

// Вимкнути чіткий текст // // Застосувати це правило до домену та всіх його субдоменів // my.domain.com ... ... ...

Тепер ви можете вказати набір спеціальних ЦС, яким має довіряти ваша програма. Наприклад, якщо ви хочете підключитися до хоста, який використовує авторизований CA, ви додасте в файл конфігурації безпеки мережі наступне:

my.domain.com // Набір якоря довіри для безпечних з'єднань // // Набір сертифікатів для елементів довіри якоря та джерело цих сертифікатів //

Не забудьте оголосити файл конфігурації безпеки мережі у своєму Маніфесті:

Потім вам потрібно буде додати довірених ЦС до res / raw / trusted_cas вашого проекту у форматі PEM або DER.

Довіряйте додатковим ЦО, де це доречно

Нарешті, ви можете довіряти додатковим ЦС, які не відомі платформі Android. Щоб збільшити кількість ЦС, яким довіряє ваша програма, вам потрібно буде вказати кілька джерел сертифікатів:

Ніколи не надсилайте конфіденційні дані через SMS

Якщо вам потрібно передавати дані з сервера на вашу програму, вам слід використовувати Google Cloud Messaging (GCM) та IP-повідомлення, а не незашифрований протокол SMS.

Читайте також: Розробка Android: як телефонувати, отримувати SMS та отримувати контакти користувачів

Також ніколи не слід виконувати чутливі команди, використовуючи SMS s, оскільки SMS передаються як наміри трансляції, тобто будь-яка програма з дозволом READ_SMS зможе отримати доступ до їх вмісту.

Захистіть від загроз безпеці за допомогою API SafetyNet

SafetyNet пропонує набір послуг та API, які ви можете використовувати для захисту свого додатка від загроз безпеці, таких як підробка пристрою, шкідливі URL-адреси та підроблені користувачі.

Android підтримує такі API безпекиNet:

  • API перевірки безпекиNet. Цей API проти зловживань дозволяє отримувати доступ до пристрою Android, на якому працює ваша програма, тому ви можете визначити, чи взаємодіють ваші сервери з справжнім пристроєм.
  • API безпечного перегляду SafetyNet. За допомогою цього API можна визначити, чи Google класифікував певну URL-адресу як відому загрозу.
  • ReCAPTCHA API безпекиNet. Ця послуга включає API reCAPTCHA, який ви можете використовувати для захисту свого додатка від загроз, таких як спам та шкідливий трафік. Якщо API підозрює, що ваш додаток взаємодіє з ботом, він подаватиме CAPTCHA, який повинен вирішити отримувач, перш ніж він зможе продовжувати користуватися вашим додатком.
  • SafetyNet Verify Apps API. Якщо ваш додаток містить конфіденційні дані користувачів, ви можете використовувати цей API, щоб взаємодіяти з функцією пристрою Verify Apps і перевірити, чи на пристрої немає шкідливих програм. Якщо пристрій не захищено, ви можете встановити обмеження пошкодження, відключивши всі чутливі функції програми. Зауважте, що, хоча SafetyNet сповістить користувачів про будь-які потенційно шкідливі програми, які він виявить, немає жодної гарантії, що користувач насправді видалить ці програми. Крім того, зловмисні програми постійно випускаються, і хакери завжди придумують нові та геніальні способи проскочити під радари, тому навіть якщо пристрій пройде тест SafetyNet, ви не повинні вважати, що шкідливих програм немає пристрій.

Для отримання додаткової інформації про API безпекиNet, включаючи вказівки щодо їх використання у своїх додатках, перегляньте офіційні документи Android.

Використовуйте захищене підтвердження Android для чутливих транзакцій

Якщо вашому додатку потрібно здійснити чутливу трансакцію, наприклад здійснити платіж, ви можете використовувати захищене підтвердження Android на пристроях під управлінням Android 9 (рівень API 28) або вище.

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

Для отримання додаткової інформації, а також інструкцій про те, як реалізувати захищене підтвердження Android, перегляньте офіційні документи Android.

Android 10: запускайте вбудований код DEX безпосередньо

На пристроях під керуванням Android 10 (API 29 рівня) та новіших версій можна запустити вбудований код DEX безпосередньо з файлу APK програми, що може запобігти атаці, навіть якщо хакеру вдасться підробити локально скомпільований код пристрою.

Читайте також: Дослідження Android Q: Додавання сповіщень про міхур у додаток

Щоб увімкнути цю нову функцію безпеки, відкрийте Маніфест свого проекту та додайте до елемента наступне:

Потім потрібно створити файл APK, що містить нестиснений код DEX, до якого ART може отримати доступ безпосередньо. Відкрийте файл build.gradle та додайте наступне:

aaptOptions {noCompress dex}

Зауважте, що ART буде використовувати компілятор JIT під час запуску програми, що може вплинути на ефективність вашої програми.

Підведенню

У цій статті ми розглянули всі найкращі практики, інструменти, API та методи, які ви можете використовувати для підтримки безпеки додатків для Android.

Чи є якісь поради щодо підвищення безпеки програми? Обов’язково поділіться своїми порадами у коментарях нижче!

Google підтвердив, що Pixel 3a та Pixel 3a XL запускаються 7 травня в перший день Google I / O 2019. Зараз індійський електронний провідник Flipkart натякає на те, що два пісні "Lite", які ч...

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

Популярні Статті