[Ажурирање: друга рањивост закрпљена] Откривене су две критичне безбедносне грешке ОнеПлус 3/3Т покретачког програма, једна закрпљена и друга се решавају

За ОнеПлус 3 и ОнеПлус 3Т откривене су две грешке везане за покретање система. Једно је закрпљено, друго се решава.

Откако је овај чланак објављен, Окиген ОС верзија 4.0.3 је закрпила другу безбедносну рањивост о којој се говори у овом чланку, наиме ону дм-верити.

Пре него што уђете у диван свет Андроид роот-а, прилагођених РОМ-ова, кернела и других модификација, прво морате да откључате покретач на свом уређају.

На неким уређајима (посебно на онима са брендом оператера), ово представља проблем јер корисници морају да се носе са значајним техничким препрекама пре него што откључају покретач. Други уређаји, као што су Хуавеи телефони, захтевају од ОЕМ-а да затражите јединствени код за откључавање покретача - мала препрека за улазак, али није много тешка. Још боље су Гоогле Некус/Пикел серија или ОнеПлус телефони који захтевају само да означите опцију у подешавањима програмера, а затим пошаљете неколико фастбоот команде.

Али без обзира колико тешко може бити откључавање покретачког програма, једна ствар ће увек остати константна: захтев за брисањем уређаја након откључавања. Ово је урађено из очигледних безбедносних разлога, пошто се цела партиција података може лако издвојити када се покретачки програм откључа. Злонамерни ентитет (са техничким знањем) би могао да покрене прилагођени опоравак и извуче пуну резервну копију вашег уређаја ако добије приступ вашим подацима. Зато се откључавање покретачког програма сматра безбедносним ризиком и зато се ваш уређај брише након откључавања. Под претпоставком да све иде како треба, обичан корисник би требало да буде сигуран од нападача који откључа покретач како би заобишао стандардне методе закључавања Андроид-а. Не иде, међутим, све по плану.


Рањивост у откључавању покретача ОнеПлус 3/3Т

Нови скуп рањивости је био управо обелодањено аутор Роее Хаи (@роеехаи), од којих први омогућава откључавање покретачког програма ОнеПлус 3/3Т без потврде корисника и без покретања фабричког ресетовања. Ова рањивост, означена ЦВЕ-2017-5625, сматра се критичном озбиљношћу рањивости и утиче на све ОнеПлус 3/3Т уређаје који раде на ОкигенОС 3.2-4.0.1. Корисници који су већ надоградили на инкрементални ОкигенОС 4.0.2 ажурирање нису погођени због ове рањивости, пошто је господин Хеј приватно открио ову ману ОнеПлус-у 23. јануара како би могли одмах да закрпе проблем.

Грешка функционише тако што се шаље власничка, скривена команда за брзо покретање: fastboot oem 4F500301. Слањем ове команде заобилази се стање закључавања покретачког покретача корисника (чак и када „Дозволи ОЕМ откључавање“ није омогућено у подешавањима програмера). Уређај не тражи од корисника нити брише уређај како би требало да буде – у ствари, уређај ће и даље пријавити да је покретач закључан! Још једна команда за брзо покретање, fastboot oem 4F500302, ће ресетовати нека подешавања покретача и може се користити за закључавање већ откључаног уређаја.

Г. Хеј је открио да прва команда за брзо покретање поставља оно што је назвао "магицФлаг" који замењује проверу која одређује стање закључавања покретача приликом извршавања команде за трептање или брисање.

// '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);
}

Фастбоот Фласх Хандлер


// '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);
...
 }

Опширније

Фастбоот Ерасе Хандлер


// '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);
}

Опширније

ЦВЕ-2017-5626 се може користити за изврши код кернела. Нападач може да флешује било коју слику за покретање коју жели. Међутим, ако флешују модификовану слику за покретање, Верифиед Боот ће се покренути и упозорити корисника да је откривена модификација. Један од начина на који се ово може заобићи је флешовање старије, неизмењене слике за покретање – оне која садржи старије експлоатације које су од тада закрпљене. Чак и тако, „упозорење“ које вам је дато траје само 5 секунди, и аутоматски се одбацује и покреће у стање верификованог покретања где ће се нападачев код и даље извршавати.

Г. Хеј напомиње да постоји много начина на које се ова мана може искористити на злонамерни начин. На пример, изменио је слику за покретање како би поставио режим СЕЛинук пермисиван као и аутоматски укључити АДБ приступ при покретању. Затим, након што је искористио ову рањивост за флешовање своје модификоване слике за покретање, могао је да приступи а роот схелл пре него што корисник може да унесе своје акредитиве.

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

Непотребно је рећи да је ово прилично озбиљно. Украдени или покварени уређај за који мислите да је безбедан због ваших типичних безбедносних мера може бити потпуно поражен коришћењем овог експлоатације.


ОнеПлус 3/3Т СЕЛинук рањивост

Друга рањивост, означена ЦВЕ-2017-5624, утиче на све верзије ОкигенОС-а и дозвољава да се онемогући дм-верити. Г. Хеј је открио ову рањивост ОнеПлус Сецурити тиму на 16. јануара, али треба напоменути да КСДА старији члан тх3г1зсамостално открили ову рањивост на 23. јануара. Разговарали смо са ОнеПлус-ом који је потврдили да су признали и да ће поправити ову другу рањивост у будућем ажурирању.

Овај напад је такође прилично једноставан за извођење. Потребно је само да издате једну команду за брзо покретање да бисте онемогућили (или омогућили) дм-верити: 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);
}

Издавање ове команде ће поставити заставицу, коју господин Хеј назива дмВерити, коју користи покретач за слање аргумента командне линије кернела који може да омогући или онемогући дм-верити.

Ово се може користити у комбинацији са првом рањивошћу за извршавање високо привилегованог кода на ОнеПлус 3/3Т без сагласности корисника - и са приступом подацима корисника. На пример, г. Хеј је успео да инсталира апликацију на /систем/прив-апп што доводи до тога да се апликација дода у домен прив-апп. Ово омогућава злонамерној апликацији приступ високо привилегованим функцијама на уређају. Г. Хеј показује да се обе ове рањивости истовремено искоришћавају у видеу испод. Као што видите, када покрене уређај, апликација коју је направио показује се да је већ унапред инсталирана.


Закључак и белешка из ОнеПлус-а

Потенцијалне злоупотребе ове две безбедносне рањивости су застрашујуће. Похваљујемо господина Хејја што је ОнеПлус-у приватно и тако брзо открио ове пропусте. Ипак, не можемо а да не будемо узнемирени да су такве команде за брзо покретање доступне на овим уређајима. Када смо написали водич како да откријте скривене команде за брзо покретање, наша намера је била да обавестимо кориснике да можда постоје неке занимљиве команде које могу да користе да побољшају своје искуство. Никада нисмо мислили да ће тако високо привилеговане команде бити у коду покретача. Што се тиче "зашто" ове команде за брзо покретање су укључене у фирмвер, добили смо а "немам коментар." 

За сада, ако нисте ажурирали свој ОнеПлус 3/3Т чим је објављена свака верзија Окиген ОС-а, препоручујемо вам ажурирати одмах. Ажурирање на Окиген ОС 4.0.2 ће вас заштитити од прве рањивости, али ћемо морати да сачекамо док ОнеПлус објављује ажурирање које закрпи другу рањивост пре него што можемо да кажемо да сте потпуно безбедни од ових подвиге. У будућности ћемо морати да пазимо на ове врсте експлоата.


Извор: Роее Хаи