OnePlus 3 un OnePlus 3T ir atklāti divi ar bootloader saistīti trūkumi. Viens ir aizlāpīts, otrs tiek risināts.
Kopš šī raksta publicēšanas operētājsistēmas Oxygen OS versija 4.0.3 ir izlabojusi otro šajā rakstā aplūkoto drošības ievainojamību, proti, dm-verity ievainojamību.
Pirms ieiet brīnišķīgajā Android sakņu, pielāgoto ROM, kodolu un citu modifikāciju pasaulē, vispirms ierīcē ir jāatbloķē sāknēšanas ielādētājs.
Dažās ierīcēs (īpaši ar mobilo sakaru operatora zīmolu) tas rada problēmas, jo lietotājiem ir jārisina ievērojami tehniski šķēršļi, pirms viņi var atbloķēt sāknēšanas ielādētāju. Citām ierīcēm, piemēram, Huawei tālruņiem, ir jāiesniedz lūgumraksts oriģinālo iekārtu ražotājiem par unikālu sāknēšanas ielādēja atbloķēšanas kodu — tas ir neliels šķērslis ienākšanai, taču tas nav īpaši sarežģīts. Vēl labāki ir Google Nexus/Pixel sērijas vai OnePlus tālruņi, kuriem ir tikai jāatzīmē opcija izstrādātāja iestatījumos un pēc tam jānosūta daži fastboot komandas.
Tomēr neatkarīgi no tā, cik grūti būtu atbloķēt sāknēšanas ielādētāju, viena lieta vienmēr paliks nemainīga: prasība notīrīt ierīci pēc atbloķēšanas. Tas tiek darīts acīmredzamu drošības apsvērumu dēļ, jo visu datu nodalījumu var viegli izvilkt, tiklīdz sāknēšanas ielādētājs ir atbloķēts. Ļaunprātīga persona (ar tehnisko zinātību) var ātri palaist pielāgotu atkopšanu un iegūt pilnu ierīces dublējumu, ja tā iegūst piekļuvi jūsu datiem. Tāpēc sāknēšanas ielādētāja atbloķēšana tiek uzskatīta par drošības risku, un šī iemesla dēļ ierīce pēc tās atbloķēšanas tiek dzēsta. Pieņemot, ka viss notiek tā, kā vajadzētu, parastajam lietotājam jābūt aizsargātam pret uzbrucējiem, kas atbloķē sāknēšanas ielādētāju, lai apietu standarta Android bloķēšanas metodes. Tomēr ne viss notiek saskaņā ar plānu.
OnePlus 3/3T sāknēšanas ielādētāja atbloķēšanas ievainojamība
Jauns ievainojamību kopums bija tikko atklāts autors Roee Hay (@roeehay), no kuriem pirmais ļauj atbloķēt OnePlus 3/3T sāknēšanas ielādētāju bez lietotāja apstiprinājuma un bez rūpnīcas atiestatīšanas. Šī ievainojamība, marķēta CVE-2017-5625, tiek uzskatīta par kritisku ievainojamību, un tā ietekmē visas OnePlus 3/3T ierīces, kurās darbojas OxygenOS 3.2–4.0.1. Lietotāji, kuri jau ir jauninājuši uz inkrementālā OxygenOS 4.0.2 Atjaunināt netiek ietekmētas šīs ievainojamības dēļ, jo Heja kungs privāti atklāja šo trūkumu OnePlus 23. janvārī lai viņi varētu nekavējoties labot problēmu.
Trūkums darbojas, nosūtot patentētu, slēptu ātrās sāknēšanas komandu: fastboot oem 4F500301
. Nosūtot šo komandu, lietotāja sāknēšanas ielādētāja bloķēšanas stāvoklis tiek apiets (pat ja izstrādātāja iestatījumos nav iespējota opcija “Atļaut OEM atbloķēšanu”). Ierīce nedod lietotājam uzvedni, kā arī nenoslauka ierīci, kā vajadzētu – patiesībā ierīce joprojām ziņos, ka sāknēšanas ielādētājs ir bloķēts! Vēl viena ātrās sāknēšanas komanda, fastboot oem 4F500302
, atiestatīs dažus sāknēšanas ielādes iestatījumus, un to var izmantot, lai bloķētu jau atbloķētu ierīci.
Heja kungs atklāja, ka pirmā ātrās sāknēšanas komanda iestata to, ko viņš ir nodēvējis par "burvju karogs", kas ignorē pārbaudi, kas nosaka sāknēšanas ielādētāja bloķēšanas stāvokli, izpildot mirgojošu vai dzēšanas komandu.
// '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);
...
}
Lasīt vairāk
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);
}
Lasīt vairāk
CVE-2017-5626 var izmantot, lai izpildīt kodola kodu. Uzbrucējs var mirgot jebkuru vēlamo sāknēšanas attēlu. Tomēr, ja tie mirgo modificēts sāknēšanas attēls, Verified Boot tiks aktivizēts un brīdinās lietotāju, ka ir konstatēta modifikācija. Viens no veidiem, kā to apiet, ir mirgot vecāku, nemodificētu sāknēšanas attēlu — tādu, kurā ir vecākas darbības, kas kopš tā laika ir labotas. Neskatoties uz to, jums sniegtais "brīdinājums" ilgst tikai 5 sekundes, un tas automātiski tiek izslēgts un tiek palaists verifiedboot stāvoklī, kurā joprojām tiks izpildīts uzbrucēja kods.
Heja kungs min, ka ir daudz veidu, kā šo trūkumu var izmantot ļaunprātīgā veidā. Piemēram, viņš modificēja sāknēšanas attēlu, lai iestatītu SELinux režīmu visatļautība kā arī automātiski iekļaut ADB piekļuvi sāknēšanas laikā. Pēc tam, kad viņš izmantoja šo ievainojamību, lai mirgotu savu modificēto sāknēšanas attēlu, viņš varēja piekļūt a saknes apvalks, pirms lietotājs pat var ievadīt savus akreditācijas datus.
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
Lieki piebilst, ka tas ir diezgan nopietni. Nozagtu vai nolietotu ierīci, kas, jūsuprāt, ir droša jūsu tipisko drošības pasākumu dēļ, var pilnībā uzveikt, izmantojot šo izmantošanu.
OnePlus 3/3T SELinux ievainojamība
Otrā ievainojamība, marķēta CVE-2017-5624, ietekmē visas OxygenOS versijas un ļauj vienam atspējot dm-verity. Heja kungs atklāja šo ievainojamību OnePlus drošības komandai 16. janvāris, taču jāatzīmē, ka XDA vecākais biedrs th3g1zneatkarīgi atklāja šo ievainojamību ieslēgts 23. janvāris. Mēs esam runājuši ar OnePlus, kas ir apstiprināja, ka viņi ir atzinuši un novērsīs šo otro ievainojamību turpmākajā atjauninājumā.
Šis uzbrukums ir arī diezgan vienkārši izpildāms. Lai atspējotu (vai iespējotu) dm-verity, ir jāizdod tikai viena ātrās sāknēšanas komanda: fastboot oem disable dm-verity
. Lai to iespējotu, vienkārši izdodiet fastboot oem enable dm-verity
. Šīs komandas apdarinātājs, kas ņemts no sāknēšanas ielādētāja izgāztuves, ir parādīts zemāk.
// '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);
}
Izdodot šo komandu, tiks iestatīts karodziņš, ko Heja kungs sauc par dmVerity, ko sāknēšanas ielādētājs izmanto, lai nosūtītu kodola komandrindas argumentu, kas var iespējot vai atspējot dm-verity.
To var izmantot kopā ar pirmo ievainojamību, lai OnePlus 3/3T izpildītu ļoti priviliģētu kodu bez lietotāja piekrišanas un ar piekļuvi lietotāja datiem. Piemēram, Heja kungs varēja instalēt lietojumprogrammu mapē /system/priv-app, kā rezultātā lietojumprogramma tiek pievienota priv-app domēnam. Tas ļauj ļaunprātīgai lietojumprogrammai piekļūt ļoti priviliģētām ierīces funkcijām. Heja kungs tālāk redzamajā videoklipā demonstrē, ka abas šīs ievainojamības tiek izmantotas vienlaikus. Kā redzat, kad viņš palaiž ierīci, tiek parādīts, ka viņa izveidotā lietojumprogramma jau ir iepriekš instalēta.
Secinājums un piezīme no OnePlus
Šo divu drošības ievainojamību iespējamā ļaunprātīgā izmantošana ir biedējoša. Mēs izsakām atzinību Heja kungam par šo ievainojamību privātu un tik ātru izpaušanu OnePlus. Tomēr mēs nevaram nesatraukties, ka šajās ierīcēs ir pieejamas šādas ātrās sāknēšanas komandas. Kad mēs uzrakstījām rokasgrāmatu par to, kā atklāt slēptās ātrās palaišanas komandas, mūsu nolūks bija informēt lietotājus, ka viņi var izmantot dažas interesantas komandas, lai uzlabotu savu pieredzi. Mēs nekad nedomājām, ka sāknēšanas ielādētāja kodā atradīsies tik ļoti priviliģētas komandas. Kas attiecas uz "kāpēc" šīs ātrās sāknēšanas komandas ir iekļautas programmaparatūrā, mums tika dota a "bez komentāriem."
Pagaidām, ja neesat atjauninājis savu OnePlus 3/3T, tiklīdz ir izlaists katrs Oxygen OS būvējums, iesakām nekavējoties atjaunināt. Atjaunināšana uz Oxygen OS 4.0.2 pasargās jūs no pirmās ievainojamības, taču mums būs jāgaida, līdz OnePlus izlaiž atjauninājumu, kas izlabo otro ievainojamību, pirms mēs varam teikt, ka esat pilnībā pasargāts no tām izmanto. Nākotnē mums būs jāseko līdzi šāda veida izmantošanai.
Avots: Roee Hay