[Оновлення: другу вразливість виправлено] Виявлено два критичні недоліки безпеки завантажувача OnePlus 3/3T, один виправлено, а інші вирішуються

У OnePlus 3 і OnePlus 3T було виявлено два недоліки, пов’язані із завантажувачем. Одну відремонтували, іншу вирішують.

Після публікації цієї статті в ОС Oxygen OS версії 4.0.3 було виправлено другу вразливість системи безпеки, про яку йдеться в цій статті, а саме вразливість dm-verity.

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

На деяких пристроях (особливо брендованих операторів) це створює проблему, оскільки користувачам доводиться стикатися зі значними технічними перешкодами, перш ніж вони зможуть розблокувати завантажувач. Інші пристрої, такі як телефони Huawei, вимагають від вас подати петицію до виробника оригінального обладнання для отримання унікального коду розблокування завантажувача – невелика перешкода для доступу, але не дуже складна. Ще кращими є телефони серії Google Nexus/Pixel або OnePlus, для яких потрібно лише відзначити опцію в налаштуваннях розробника, а потім надіслати кілька швидке завантаження команди.

Але як би важко не було розблокувати завантажувач, одна річ завжди залишатиметься незмінною: вимога стерти пристрій після розблокування. Це робиться з очевидних міркувань безпеки, оскільки весь ваш розділ даних можна легко витягнути після розблокування завантажувача. Зловмисник (з технічним ноу-хау) міг би запустити користувальницьке відновлення та отримати повну резервну копію вашого пристрою, якщо він отримає доступ до ваших даних. Ось чому розблокування завантажувача вважається загрозою безпеці, і тому ваш пристрій стирається після його розблокування. Якщо припустити, що все йде як слід, звичайний користувач має бути захищений від зловмисників, які розблокують завантажувач, щоб обійти стандартні методи блокування Android. Однак не все йде за планом.


Уразливість розблокування завантажувача OnePlus 3/3T

З'явився новий набір вразливостей щойно розкрито від Roee Hay (@roeehay), перший з яких дозволяє розблокувати завантажувач OnePlus 3/3T без підтвердження користувача та без відновлення заводських налаштувань. Ця вразливість, позначена CVE-2017-5625, вважається вразливістю критичного рівня та впливає на всі пристрої OnePlus 3/3T, що працюють на OxygenOS 3.2–4.0.1. Користувачі, які вже перейшли на інкрементний OxygenOS 4.0.2 оновлення не впливають цією вразливістю, оскільки пан Хей приватно повідомив про цю ваду OnePlus 23 січня щоб вони могли негайно виправити проблему.

Недолік працює, надсилаючи власну приховану команду швидкого завантаження: fastboot oem 4F500301. Надсилаючи цю команду, стан блокування завантажувача користувача обходиться (навіть якщо «Дозволити розблокування OEM» не ввімкнено в налаштуваннях розробника). Пристрій не запитує користувача та не стирає пристрій, як це має бути - фактично, пристрій все одно повідомлятиме, що завантажувач заблоковано! Ще одна команда швидкого завантаження, fastboot oem 4F500302, скине деякі налаштування завантажувача та може використовуватися для блокування вже розблокованого пристрою.

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

// 'oem 4F500301' handler
intsub_918427F0()
{
magicFlag_dword_91989C10 = 1;
if ( dword_9198D804 != dword_9198D804 )
assert(1, dword_9198D804, dword_9198D804);
return sendOK((int)"", dword_9198D804);
}

Fastboot Flash Handler


// 'flash' handler
constchar *__fastcall sub_91847EEC(char *partitionName, int *a2, int a3)
{
char *pname; // r5@1
...
pname = partitionName;
v4 = a2;
v5 = a3;
if ( returnTRUE1(partitionName, (int)a2) )
{
result = (constchar *)sub_918428F0(pname, v6);
if ( (result || magicFlag_dword_91989C10)
&& ((result = (constchar *)sub_91842880(pname, v10)) != 0 || magicFlag_dword_91989C10) )
{
result = (constchar *)sub_918428F0(pname, v10);
if ( !result || magicFlag_dword_91989C10 )
goto LABEL_7;
v8 = dword_9198D804;
if ( dword_9198D804 != dword_9198D804 )
goto LABEL_28;
v11 = "Critical partition flashing is not allowed";
}
else
{
v8 = dword_9198D804;
if ( dword_9198D804 != dword_9198D804 )
goto LABEL_28;
v11 = "Partition flashing is not allowed";
}
return (constchar *)FAIL2((int)v11, v10);
}
LABEL_7:
...
if ( *v4 != 0xED26FF3A )
{
if ( *v4 == 0xCE1AD63C )
cmd_flash_meta_img(pname, (unsigned int)v4, v5);
else
cmd_flash_mmc_img(pname, (int)v4, v5);
goto LABEL_10;
}
v7 = v4;
}
cmd_flash_mmc_sparse_img(pname, (int)v7, v5);
...
 }

читати далі

Обробник стирання Fastboot


// 'erase' handler
int __fastcall sub_91847118(char *partitionName, int a2, int a3)
{
 ...
v3 = partitionName;
v4 = returnTRUE1(partitionName, a2);
if ( !v4 )
{
LABEL_7:
...
if ( v4 )
{
if ( dword_9198D804 == dword_9198D804 )
return eraseParition(v3);
}
...
}
v4 = sub_918428F0(v3, v5);
if ( !v4 && !magicFlag_dword_91989C10 )
{
v6 = dword_9198D804;
if ( dword_9198D804 == dword_9198D804 )
{
v7 = "Partition erase is not allowed";
return FAIL2((int)v7, v5);
}
goto LABEL_23;
}
v4 = sub_91842880(v3, v5);
if ( !v4 && !magicFlag_dword_91989C10 )
{
v6 = dword_9198D804;
if ( dword_9198D804 == dword_9198D804 )
{
v7 = "Partition flashing is not allowed";
return FAIL2((int)v7, v5);
}
LABEL_23:
assert(v4, v5, v6);
}
v4 = sub_918428F0(v3, v5);
if ( !v4 || magicFlag_dword_91989C10 )
goto LABEL_7;
v6 = dword_9198D804;
...
v7 = "Critical partition erase is not allowed";
return FAIL2((int)v7, v5);
}

читати далі

CVE-2017-5626 можна використовувати для виконати код ядра. Зловмисник може прошити будь-який завантажувальний образ, який захоче. Однак, якщо вони запрограмують змінений образ завантаження, увімкнеться Verified Boot і попередить користувача про виявлення модифікації. Один із способів обійти це — перепрограмувати старіший, немодифікований завантажувальний образ, який містить старіші експлойти, які пізніше були виправлені. Незважаючи на це, «попередження», яке ви отримуєте, триває лише 5 секунд, і воно автоматично відхиляється та завантажується в стан verifiedboot, де код зловмисника все ще виконуватиметься.

Г-н Хей згадує, що існує маса способів використання цієї вади у зловмисний спосіб. Наприклад, він змінив образ завантаження, щоб встановити режим SELinux дозвільний а також автоматично включати доступ до ADB під час завантаження. Потім, скориставшись цією вразливістю для прошивки свого зміненого образу завантаження, він зміг отримати доступ до a root shell, перш ніж користувач зможе навіть ввести свої облікові дані.

OnePlus3:/ # id
uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),
3003(inet),3006(net_bw_stats),3009(readproc) context=u: r: su: s0

OnePlus3:/ # getenforce
Permissive

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


Уразливість OnePlus 3/3T SELinux

Друга вразливість, позначена CVE-2017-5624, впливає всі версії OxygenOS і дозволяє вимкнути dm-verity. Пан Хей повідомив про цю вразливість команді безпеки OnePlus 16 січня, але слід зазначити, що XDA Senior Member th3g1zсамостійно виявили цю вразливість на 23 січня. Ми поговорили з OnePlus, хто це зробив підтвердили, що вони визнали та виправлять цю другу вразливість у майбутньому оновленні.

Ця атака також досить проста у виконанні. Щоб вимкнути (або ввімкнути) dm-verity, потрібно лише виконати одну команду fastboot: fastboot oem disable dm-verity. Щоб увімкнути його, просто випустіть fastboot oem enable dm-verity. Обробник цієї команди, взятий із дампа завантажувача, показаний нижче.


// 'oem disable_dm_verity' handler
intsub_9183B8EC()
{
int v0; // r0@1
int v1; // r1@1

dmVerity_dword_91960740 = 0;
v0 = sub_91845E10("ANDROID-BOOT!");
if ( dword_9198D804 != dword_9198D804 )
assert(v0, v1, dword_9198D804);
return sendOK((int)"", v1);
}

Виконання цієї команди встановить прапорець, який містер Хей називає dmVerity, який використовується завантажувачем для надсилання аргументу командного рядка ядра, який може вмикати або вимикати dm-verity.

Це може бути використано в поєднанні з першою вразливістю для виконання коду з високим рівнем привілеїв на OnePlus 3/3T без згоди користувача — і з доступом до даних користувача. Наприклад, пан Хей зміг встановити програму в /system/priv-app, що спричиняє додавання програми до домену priv-app. Це надає зловмисним програмам доступ до високопривілейованих функцій на пристрої. Пан Хей демонструє використання обох цих вразливостей одночасно у відео нижче. Як ви бачите, коли він завантажує пристрій, програма, яку він створив, уже попередньо встановлена.


Висновок і зауваження від OnePlus

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

Наразі, якщо ви не оновлювали свій OnePlus 3/3T одразу після випуску кожної збірки ОС Oxygen, ми рекомендуємо вам негайно оновити. Оновлення до Oxygen OS 4.0.2 захистить вас від першої вразливості, але нам доведеться почекати, поки OnePlus розгортає оновлення, яке виправляє другу вразливість, перш ніж ми зможемо сказати, що ви повністю захищені від цих подвиги. У майбутньому нам доведеться стежити за подібними експлойтами.


Джерело: Roee Hay