Уязвимостта на OnePlus 3/3T Bootloader позволява промяна на SELinux в Permissive Mode при 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 и 

разкрит на платформата IBM X-Force Exchange, тази уязвимост позволява на атакуващия да манипулира състоянието на SELinux на устройствата, като по този начин го превключва към разрешителен режим. Всичко, от което се нуждае нападателят, е или физически достъп към устройството, или отдалечен достъп до ADB връзка към устройството.

SELinux, или Linux с подобрена сигурност, е модул за сигурност на ядрото на Linux, който позволява достъп и управление на политики за сигурност. SELinux беше въведен в Android, започвайки с Android 4.3 и беше настроен на Налагане режим по подразбиране от Android 4.4. Тази задължителна система за контрол на достъпа помага за налагането на съществуващите права за контрол на достъпа и се опитва да предотврати атаки за повишаване на привилегиите. Това действа като пречка за неоторизиран контрол върху вашето устройство, като например приложение или уязвимост, целящи злонамерено получаване на root достъп. Настройване на 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 не притежават никакъв запис в „About Screen“, който да споменава текущото SELinux състояние на устройството. Жертвата ще продължи да не забелязва компрометираното състояние на своето устройство, ако не е била свидетел на активното използване на експлойта. Липсата на запис за състояние на SELinux в екрана „Относно“ липсва както в базираните на Android 6.0 отворени бета версии, така и в официалните ROM на Android 7.0.

Съществуват няколко приложения за превключване на състоянието на SELinux към Permissive, като например SELinuxModeChanger приложение. Превключването на SELinux чрез този метод не позволява състоянието да се запази чрез рестартиране. Все пак можете използвайте скриптове за поддържане на Разрешаващо Състояние на SELinux при твърдо рестартиране. И двата метода изискват root достъп, което означава, че потребителят вече знае за рисковете, на които е изложен. Но основната разлика при промяната на режима SELinux на Разрешаващо използването на горната уязвимост е, че не само продължава при твърдо рестартиране, прави така без нужда от root достъп.

Към днешна дата не съществуват средства за защита срещу уязвимостта.


АКТУАЛИЗАЦИЯ:

Посегнахме към Султанджа, един от най-известните разработчици на персонализирани ROM за устройства OnePlus, за да видим дали може да ни помогне да научим повече за този проблем. Той незабавно се зарови в кода, за да намери основния източник, ето какво откри:

Начинът, по който "fastboot oem selinux " работи е, че добавя допълнителен аргумент към командния ред на ядрото при зареждане на Linux. Допълнителният аргумент идва под формата на "androidboot.selinux=", където може да бъде "позволено". Там нещата стават смешни: „androidboot." аргументите на командния ред на ядрото се анализират от init. В нормална производствена компилация на Android ("потребителска" компилация) аргументът "androidboot.selinux" се игнорира напълно и selinux винаги е принуден да се прилага. Така че този бъг се състои от два проблема:

  1. Потребителите могат да накарат буутлоудъра да предаде флаг, който обикновено би направил selinux разрешителен при инженерна/дебъгваща ROM компилация
  2. OnePlus модифицира init на Android, за да почете флага "androidboot.selinux" дори за производствени ROM компилации

Ето къде init на Android е конфигуриран да игнорира флага "androidboot.selinux" за производствени компилации: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

Флагът ALLOW_DISABLE_SELINUX в ​​изходния код е зададен само на 1 за потребителско отстраняване на грешки и инженерни компилации

(Моят ROM не е засегнат от това, защото изграждам своя ROM в производствен (потребителски) режим)

Така че "androidboot.selinux" просто се игнорира в моя ROM, "fastboot oem selinux " команда също изглежда е нещо, създадено от OnePlus, тъй като такава команда не съществува в публичните източници на буутлоудъра на CAF. На ума си мога да измисля 4 начина да поправя това за потребители с отключени буутлоудъри:

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

Бихме искали да благодарим на Sultanxda за времето и усилията, които ни помогна да разберем какво се случва зад кулисите. Свързахме се и с OnePlus, който е наясно със ситуацията и проучва въпроса.


Надяваме се, че OnePlus публично признава сериозния проблем и е прозрачен в плановете си за отстраняването му.