Як усунути загрозу безпеці, пов’язану з переспрямуванням намірів

Ця інформація призначена для розробників, у чиїх додатках є вразливість до переспрямування намірів.

У чому проблема

Принаймні для одного з ваших додатків виявлено проблему з переспрямуванням намірів. Це дає змогу зловмисним програмам отримувати доступ до приватних компонентів або файлів додатків. Нижче докладно описано, як вирішити таку проблему. Додатки, для яких ви не усунете загрозу безпеці до зазначених у Play Console термінів, буде видалено з Google Play.

Потрібна дія

  1. Увійдіть в обліковий запис Play Console і перейдіть у розділ "Сповіщення", щоб дізнатися, у яких додатках є проблеми та до якого терміну їх потрібно вирішити.
  2. Оновіть вразливі додатки, виконавши вказані нижче дії.
  3. Надішліть оновлені версії цих додатків.

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

Додаткова інформація

Використовувати ненадійний намір для запуску компонента (наприклад, викликом методу startActivity) або повернення даних (наприклад, викликом методу setResult) небезпечно. Це дає змогу шкідливим програмам виконувати такі несанкціоновані дії:

  1. Викрадати з додатка конфіденційні файли або системні дані (як-от повідомлення SMS).
  2. Запускати приватні компоненти додатка зі зловмисно зміненими аргументами.

Важливо, щоб ваш додаток перевіряв або знешкоджував ненадійні наміри, перш ніж викликати для них методи startActivity, startService, sendBroadcast або setResult.

Радимо усунути цю загрозу одним з описаних нижче способів.

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

Якщо вразливому компоненту додатка не потрібно отримувати наміри від інших додатків, цей компонент можна зробити приватним, указавши в маніфесті значення android:exported=”false”.

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

Надійність вихідної дії можна перевіряти за допомогою таких методів, як getCallingActivity. Нижче наведено приклад.

 // перевірити, чи вихідна дія походить із надійного пакета
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // отримати вбудований намір
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // переспрямувати вбудований намір
   startActivity(forward);
 }

Примітки

  • Щоб усунути цю загрозу безпеці, недостатньо перевірити, чи CallCallActivity() повертає значення, відмінне від нуля. Шкідливі додатки можуть імітувати нульове значення цієї функції.
  • Якщо використовується Google Play Services SMS Retriever Auth, захистіть приймач широкомовних сповіщень дозволом SEND_PERMISSION, щоб допускати наміри із сервісів Google Play.

Спосіб 3. Подбайте про те, щоб переспрямовувався тільки нешкідливий намір.

Переконайтеся, що внаслідок переспрямування намір:

  1. Не надсилатиметься в приватні компоненти вашого додатка;
  2. Не надсилатиметься в компоненти зовнішніх додатків. Якщо переспрямування націлено на зовнішній додаток, переконайтеся, що намір не дозволятиме доступ до URI в приватних даних постачальника контенту або системних даних.

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

 Intent intent = getIntent();
 // отримати вбудований намір
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // отримати назву компонента
 ComponentName name = forward.resolveActivity(getPackageManager());
 // перевірити, чи назви пакета й класу відповідають очікуваним
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // переспрямувати вбудований намір
   startActivity(forward);
 }

Додатки можуть перевіряти, чи намір дозволяє доступ до URI, за допомогою таких методів, як getFlags. Нижче наведено приклад.

 // отримати вбудований намір
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // отримати позначки
 int flags = forward.getFlags();
 // переконатися, що вбудований намір не надає дозволи на доступ до URI
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // переспрямувати вбудований намір
   startActivity(forward);
 }

Також додатки можуть відкликати дозволи на доступ до URI за допомогою методу removeFlags. Нижче наведено приклад.

 // ненадійний намір
 Intent intent = getIntent();
 // відкликати дозволи на доступ до URI в ненадійному намірі
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // передати ненадійний намір
 setResult(intent);

Виберіть спосіб усунення загрози залежно від змісту сповіщень 

Сповіщення Play Console інформують, де саме додаток викликає методи startActivity, startActivityForResult, startService, sendBroadcast або setResult із використанням ненадійного наміру. Щоб максимально ефективно усунути загрозу безпеці, відстежте й перевірте компоненти, що викликають ці методи, і визначте походження ненадійного наміру. Наприклад, щоб застосувати спосіб 1, відстежте компоненти й визначте, який із них зробити приватним.

Ми завжди готові допомогти

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

false
Головне меню
16257314390183145375
true
Пошук у довідковому центрі
true
true
true
true
true
5016068
false
false