Уразливість завантажувача OnePlus 3/3T дозволяє змінювати SELinux на дозвільний режим у Fastboot

click fraud protection

Серйозна вразливість у завантажувачі OnePlus 3/3T дозволяє зловмисникам перемикати стан SELinux із Enforcing на Permissive! Читайте далі, щоб дізнатися більше!

The OnePlus 3 і OnePlus 3T є одними з найкращих телефонів, які ви можете придбати прямо зараз. Хоча майбутні флагмани 2017 року ще не представлені споживачам, за їх відсутності OnePlus 3/3T домінує в реальних умовах за доступною ціною.

Але, якщо бути справедливими в оцінці пристрою, ми повинні визнати, що, незважаючи на всі зусилля OnePlus, OnePlus 3/3T не без недоліків. Наприклад, ми раніше повідомляли про проблеми безпеки, такі як OnePlus розкриває інформацію про IMEI через мережу, коли ви перевіряєте наявність оновлень на телефоні. А тепер у нас є ще одна проблема безпеки, яку слід додати до списку, ця з потенційно більш небезпечними наслідками.

Уразливість у завантажувачі OnePlus 3/3T відкриває двері для зловмисних атак. Як виявив Роі Хей з дослідницької групи IBM X-Force Application Security and розкрито на платформі IBM X-Force Exchange

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

SELinux, або Security-Enhanced Linux, — це модуль безпеки ядра Linux, який забезпечує доступ до політик безпеки та керування ними. SELinux було представлено в Android, починаючи з Android 4.3, і було налаштовано на Примусове виконання режим за замовчуванням з Android 4.4. Ця обов’язкова система контролю доступу допомагає забезпечити дотримання існуючих прав контролю доступу та намагається запобігти атакам підвищення привілеїв. Це є перешкодою для неавторизованого контролю над вашим пристроєм, наприклад програмою або вразливістю, спрямованою на зловмисне отримання кореневого доступу. Встановлення SELinux на Примусове виконання за замовчуванням на Android служить першим кроком для захисту звичайних користувачів від таких атак.

Цю вразливість досить просто використати — насправді, здається, це величезний недогляд з боку OnePlus, а не те, як ви уявляєте, як виглядатиме типовий експлойт. Спочатку зловмисник перезавантажує OnePlus 3/3T у режим «швидкого завантаження» — якщо у вас є фізичний доступ, просто натисніть кнопку збільшення гучності під час завантаження, але якщо ні, ви можете виконати команду ADB adb reboot bootloader до пристрою. Режим швидкого завантаження на пристрої відкриває інтерфейс USB, який не повинен дозволяти виконувати будь-яку важливу для безпеки команду на заблокованих пристроях. Але на OnePlus 3/3T просто видача fastboot oem selinux permissive через інтерфейс швидкого завантаження перемикає режим SELinux Примусове виконання до Дозвільний.

fastboot oem selinux permissive
...
OKAY[ 0.045s]
finished. totaltime: 0.047s

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

Щоб ще більше ускладнити проблему, OnePlus 3 і 3T не мають жодного запису на екрані «Про програму», щоб згадати поточний стан SELinux пристрою. Жертва й надалі не помічає скомпрометованого стану свого пристрою, якщо вона не стала свідком активного використання експлойта. Відсутність запису стану SELinux на екрані «Про програму» відсутня як у відкритих бета-версіях Android 6.0, так і в офіційних ПЗУ Android 7.0.

Існує кілька програм для перемикання стану SELinux у дозвіл, наприклад SELinuxModeChanger додаток. Перемикання SELinux цим методом не дозволяє зберегти стан після перезавантаження. Хоча, ви можете використовувати скрипти підтримувати Дозвільний Стан SELinux під час апаратного перезавантаження. Обидва ці методи потребують кореневого доступу, що означає, що користувач уже знає про ризики, яким він піддається. Але основна різниця зі зміною режиму SELinux на Дозвільний використання вищевказаної вразливості полягає в тому, що це не тільки зберігається під час жорстких перезавантажень, це робить так без необхідності доступу root.

На сьогоднішній день не існує засобів захисту від уразливості.


ОНОВЛЕННЯ:

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

Спосіб, яким «fastboot oem selinux " робота полягає в тому, що вона додає додатковий аргумент у командний рядок ядра під час завантаження Linux. Додатковий аргумент має форму «androidboot.selinux=", де може бути «дозвільним». Ось де все стає смішним: «androidboot." аргументи в командному рядку ядра аналізуються за допомогою ініціалізації Android. У звичайній робочій збірці Android ("користувацька") аргумент "androidboot.selinux" повністю ігнорується, і selinux завжди примусово виконується. Отже, ця помилка складається з двох проблем:

  1. Користувачі можуть змусити завантажувач передавати прапорець, який зазвичай робить selinux дозволеним для інженерної/налагоджувальної збірки ПЗУ
  2. OnePlus змінив ініціалізацію Android, щоб врахувати прапор "androidboot.selinux" навіть для виробничих збірок ПЗУ

Ось де ініціалізація Android налаштована на ігнорування позначки «androidboot.selinux» для робочих збірок: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

Прапор ALLOW_DISABLE_SELINUX у вихідному коді має значення 1 лише для налагодження користувача та інженерних збірок

(Це не впливає на мій ПЗУ, оскільки я створюю свій ПЗУ у робочому (користувацькому) режимі)

Тому «androidboot.selinux» просто ігнорується в моєму ПЗУ, «fastboot oem selinux» " команда також, здається, створена OnePlus, оскільки такої команди немає в загальнодоступних джерелах завантажувача CAF. З голови я можу придумати 4 способи виправити це для користувачів із розблокованими завантажувачами:

  1. Шістнадцяткове редагування завантажувача, щоб змінити всі екземпляри рядка "selinux" на щось інше (наприклад, "sclinux"), щоб цей прапор не розпізнавався ініціалізації Android
  2. Шістнадцяткове редагування двійкового файлу Android ініціалізації в OxygenOS, щоб замінити всі екземпляри «androidboot.selinux» на щось інше (наприклад, "androidboot.sclinux"), щоб ініціалізація Android не розпізнала androidboot.selinux прапор
  3. Додайте хак до драйвера командного рядка ядра, подібного до мого обходу SafetyNet, щоб приховати позначку "androidboot.selinux" від ініціалізації Android

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


Ми сподіваємося, що OnePlus публічно визнає серйозну проблему та буде прозорою у своїх планах щодо її вирішення.