Naujausiame „Project Zero“ tinklaraščio įraše komanda atrado būdą, kaip apeiti „Samsung“ realaus laiko branduolio apsaugą, vadinamą „Knox Hypervisor“.
„Google Project Zero“ komanda patikrino daugybę išnaudojimų, leidžiančių užpulti „Samsung“ telefonus, kuriuose veikia tariamai saugus „Samsung Knox“ saugos rinkinys. Tinklaraštyje pažymima, kad visi pažeidžiamumai buvo perduoti „Samsung“, kuris iš tikrųjų išleido jų pataisymus sausio mėnesio programinės įrangos atnaujinime.
Fonas
Kaip „Samsung“ pristatyto „Samsung Knox“ saugos programinės įrangos rinkinio dalis, tarp „Android“ programų ir branduolio yra programinės įrangos dalis, vadinama Hipervizorius. Tai gali būti naudojamas kaip papildomas sluoksnis, siekiant dar labiau apsaugoti "Android" įrenginius. „Samsung Knox Hypervisor“ vadinamas „Realaus laiko branduolio apsauga“ arba sutrumpintai RKP, kaip paminėsiu likusioje šio straipsnio dalyje.
Branduolys yra žemiau RKP „Android“ programinės įrangos krūvoje, o įrenginyje veikiančios programos yra viršuje. RKP idėja yra suteikti papildomą įrenginio saugumo lygį, nes visos užklausos (atminties ir kiti ištekliai) pateikiami Programos branduoliui pirmiausia turi pereiti per „Knox“, kuri bando nustatyti, ar programa ką nors daro neturėtų. RKP taip pat užtikrina apsaugą per neaiškumą su papildomu sluoksniu, skirtu paslėpti neskelbtiną informaciją, kurią programa gali naudoti siekdama pažeisti įrenginį.
Tinklaraščio įraše gana giliai aprašoma, kaip veikia „Android“ atmintis, RKP ir operacinės sistemos, todėl sutrumpinau ir supaprastinau, kad galėčiau greitai apžvelgti, kas buvo atrasta. Vis dėlto raginu perskaityti visą straipsnį, jei turite laiko, nes jis yra labai informatyvus.
1 išnaudojimas:
KASLR arba Branduolio adresų erdvės išdėstymo atsitiktinis pakeitimas yra procesas, kai įkrovos metu pakeičiama branduolio kodo vieta atmintyje atsitiktine dalimi. Kiekvieną kartą, kai įrenginys paleidžiamas, branduolys įkeliamas į kitą adreso erdvę (atminties sritį). Idėja yra apsunkinti branduolio kodo buvimo vietą, kad būtų galima jį užpulti, nes po kiekvieno paleidimo branduolio kodas "pasikeičia" atsitiktine dalimi atmintyje. Tai skamba kaip puikus žingsnis siekiant užkirsti kelią galimiems užpuolikams, bet neseniai tyrimai parodė, kad iš tikrųjų galite tai įveikti nereikalaujant programinės įrangos klaidos ar pažeidžiamumo, nes KASLR iš tikrųjų labai sunku patikimai įdiegti prieš vietinius užpuolikus.
RKP programinės įrangos atveju galimybė apeiti KASLR iš tikrųjų yra paprastesnė nei anksčiau minėtame tyrime. Visų „Android“ įrenginių atmintis nurodoma rodyklėmis ir siekiant apsaugoti įrenginius nuo atakų, kai „Android“ įrenginiai spausdina arba išveda (ar ekraną, ar į failą žurnalams ar derinimui), rodyklių nuorodos yra anoniminės, todėl neįmanoma sužinoti, kur žymeklis iš tikrųjų nurodo skaitant išvestis.
Pagalvokite apie atminties rodykles kaip gatvės ženklą, nurodantį vietą, ir įsivaizduokite, kad anonimiškumas tai sulieja. Panašiai kaip televizijoje, anonimiškumas atliekamas po filmavimo, Android taip pat taiko šį anonimiškumą išvesties metu ir tik tuo atveju, jei anonimiškumas sukonfigūruotas teisingai, o autorius teigia. kad kiekviename įrenginyje [jis] buvo tinkamai sukonfigūruotas žymiklio anonimiškumas. Tai gali atrodyti taip, kad jį labai sunku sulaužyti, bet viskas, ką jums reikia padaryti, tai rasti vieną žymeklį (pagalvokite apie gatvės ženklą), kuris nebuvo anonimizuotas (neryškus). branduolio kūrėjas (saugokitės, kad tai nėra jūsų vidutinis Android programų kūrėjas), kai žymeklis įrašomas į žurnalus ar kitą vietą, pvz. ekranas arba a failą.
Taigi, jei galite rasti žymeklį, kuris nebuvo anonimizuotas, galite apskaičiuoti atsitiktinį branduolio adreso poslinkį kaip skirtumą tarp šių dviejų. Įdomu tai, kad autorius branduolyje nerado išnaudojamos rodyklės, bet rado ją RPK viduje kur kūrėjai pamiršo anonimizuoti rodyklę derinimo (registravimo) išvestyje, kuri atsirado dėl rašybos klaida. Norėdami anonimizuoti nuorodas „Android“, turite naudoti specialų kodą ir paaiškėja, kad RPK kūrėjai klaidingai panaudojo mažosios raidės "k" vietoj an didžiosios raidės "K". Todėl buvo gana paprasta išsiaiškinti atsitiktinį branduolio kodo poslinkį ir jį atakuoti.
2 išnaudojimas:
Kitas išnaudojimas yra šiek tiek sudėtingesnis: „Samsung Knox“ apsaugo jūsų įrenginį taikydama taisyklių rinkinį įrenginio atminčiai, kad sustabdytų kenkėjišką kodą. Taisyklės yra tokios:
- Visi puslapiai (kodas atmintyje), išskyrus branduolio kodą, yra pažymėti kaip "Privilegijuotas vykdymas niekada" (tai reiškia, kad kodas čia niekada negali būti paleistas)
- Branduolio duomenų puslapiai (duomenys, kuriuos programa naudoja atmintyje) niekada nėra pažymėti kaip vykdomieji (todėl kodas čia niekada negali būti paleistas)
- Branduolio kodo puslapiai (kodas atmintyje) niekada nėra pažymėti kaip rašomi (todėl joks kenkėjiškas kodas negali jo pakeisti)
- Visi branduolio puslapiai yra pažymėti kaip tik skaitomi 2 etapo vertimo lentelėje (lentelė, esanti tarp programos ir branduolio, kad toliau neleistų programoms žinoti apie tikras atminties vietas)
- Visi atminties vertimo įrašai programoms pažymėti kaip tik skaitomi.
Daugiausia dėmesio skirsime 3 taisyklei, nes čia autorius rado problemų dėl aukščiau pateiktų taisyklių įgyvendinimo. RPK iš tikrųjų pažymi branduolio atmintį kaip tik skaitymo, tačiau dėl KASL aplaidumo buvo aptikta skylė, dėl kurios rašydami kodą į tariamai „tik skaitymo“ skyrių. Siekiant užmaskuoti branduolio vietą įkrovos metu, branduoliui skiriama atmintis, tačiau šis atminties kiekis yra daug didesnis nei branduolio teksto segmentas. Skiriant didesnį atminties kiekį, tampa daug sunkiau rasti tikrąjį branduolio kodą, kuris gali būti bet kur, ir, kaip matėme aukščiau, jis atsitiktinai perkeliamas kiekvienoje įrenginio įkrovoje.
Autorius sugebėjo patvirtinti, kad branduolio naudojama atmintis iš tikrųjų buvo pažymėta kaip „tik skaitoma“, tačiau likusi didelė atminties dalis, naudojama branduoliui paslėpti, buvo ne pažymėtas kaip „tik skaityti“. Taip yra todėl, kad pritaikius KASLR skaidrę RKP apsaugo tik regioną, kuriame yra branduolio tekstas.
Išnaudojimas Nr. 3
Trečiuoju išnaudojimu autorius galėjo pasiekti kitą atminties sritį, kuri taip pat turėtų būti apribota tik skaitymui. RKP apsaugo atmintį ir naudoja a „Hypervisor“ konfigūracijos registras (HCR), kad valdytų pagrindines branduolio operacijas. HCR tikslas yra leisti galiojančioms ir tikroms branduolio operacijoms pasiekti registrus ir blokuoti kenkėjiškas atakas. Tai atliekama tikrinant iškvietimus į virtualizacijos funkcijas valdančius registrus. HCR yra sukonfigūruotas blokuoti konkrečias operacijas, kurios būtų atliekamos įprastai, leidžiant RKP pasirinkti, leisti ar neleisti užklausą.
Šiame išnaudojime buvo HCR kontrolė neapima dviejų registrų tai pasirodė labai svarbu. Autorius įsigilino į ARM Reference vadovą ir atrado, kad pirmasis registras leido jam iš esmės išjungti RKP programoms. "Sistemos valdymo registras EL1 (SCTLR_EL1) suteikia aukščiausio lygio sistemos, įskaitant atminties sistemą, valdymąTobulame pasaulyje programa naudotų atmintį, kuri buvo susieta per RKP, kad RKP galėtų valdyti, ką programa gali pasiekti. Tačiau šio registro išjungimas leido RKP bus išjungtas efektyviai grąžinant įrenginį taip, kaip jis veikė prieš įdiegiant RKP – tai reiškia, kad įrenginys susietas su fizine atmintimi be papildomos RKP apsaugos. Tai savo ruožtu reiškė, kad autorius galėjo skaityti ir rašyti į atmintį, kurią iš pradžių teisingai užblokavo RKP programinė įranga.
Antrasis praleistas registras turėjo subtilesnį poveikį, bet galiausiai lygiai taip pat griauna saugumą. The EL1 vertimų kontrolės registras (TCR_EL1) registras tiesiogiai susijęs su atminties kiekiu, su kuriuo programa veikia, vadinama puslapiu. RKP yra užkoduotas iki 4 KB puslapio dydžio, nes AARCH64 Linux branduoliai (pvz., Android) naudoja 4 KB vertimo dydį. Aptariamas registras (TCR_EL1) nustato ARM mikroschemų rinkinius pagal grąžintinos atminties dydį. Paaiškėjo, kad šio registro HCR nesaugo ir todėl užpuolikas gali jį pakeisti taip, kaip autorius pakeitė į 64 kb puslapio dydį.
Tai reiškia, kad kai RKP įvykdo užklausą, faktinis pasiekiamos atminties kiekis dabar yra 64 kb, o ne 4 kb. Priežastis ta, kad ARM mikroschemų rinkinys vis dar valdo puslapio dydį ir jį nustatė 64 kb. Kadangi RKP apsaugo atmintį nuo įrašymo, kaip dalis taisyklių, išvardytų 2 išnaudojime, atmintis vis tiek iš tikrųjų yra apsaugota. Bet čia yra tas spąstas – kadangi RKP yra užkoduotas iki 4kb, atnaujinus registrą jis nesikeičia į 64kb puslapio dydį, todėl apsaugoti tik pirmieji 4kb atminties leidžiantis užpuolikui daryti ko nori su likusiais 60kb.
Išnaudojimas Nr. 4
Paskutinis autoriaus parodytas išnaudojimas yra nuoroda į atmintį, kurioje yra RKP programinė įranga, todėl užpuolikas gali atakuoti pačią RKP programinę įrangą. Vienas iš gudrybių, kaip sustabdyti tokio tipo atakas, kurias taip pat naudoja Linux branduoliai, yra programos atskyrimas iš virtualiosios atminties adresų erdvės, kad jokia programa negalėtų jos pulti, nes negali jos nurodyti.
Atminkite, kad atmintis yra tik rodyklės ir lentelės, susiejančios fizinę atmintį su virtualia atmintimi. Pagal įprastą gynybą tokio tipo puolime, RKP išsiskleidžia taip, kad jos nebūtų galima užpulti. Tačiau, jei branduolys nesuteikia tokių galimybių, RKP leidžia susieti atminties dalį ir pažymėti kaip skaitymą / rašymą. Vienintelis patikrinimas yra tas, kad tai nėra pats branduolys, nes RKP netikrina, ar adresai, kuriuos prašoma susieti, yra sritis, kurioje atmintyje yra pats RKP. Iš esmės RKP leidžiasi iš naujo kartoti save atgal į adresų erdvę, kurią gali pasiekti programos, ir kaip šoną paveikti atmintis automatiškai pažymima kaip skaitymas/rašymas todėl užpuolikas dabar gali naudoti atmintį, kaip nori.
Išvada
Viena didžiausių problemų, susijusių su keturiais aukščiau išvardintais išnaudojimais, yra ta, kad autorius mini, kaip sunku juos atlikti, nes baziniame „Android“ branduolyje nėra funkcijų. Ironiška, kad saugus RKP Hypervisor suteikė visas priemones, kurių reikėjo atakoms vykdyti. Tai rodo, kad kartais gerai apgalvota programinė įranga sukelia daugiau problemų nei išsprendžia, ir mums pasisekė, kad turime žmonių kaip Gal Benimini, norintis susitepti rankas ir patikrinti, ar dokumentacija atitinka iš tikrųjų programinę įrangą daro.
Nors šie išnaudojimai atrodo baisūs ir dėl to Knox skamba labai pažeidžiamai, norėčiau patikinti visus, kad visos šios problemos buvo pataisyta sausio mėnesio atnaujinime iš Samsung. Be to, šie išnaudojimai reikalauja labai gilaus ARM procesorių ir programavimo supratimo, todėl kliūtis patekti į šiuos išnaudojimus yra astronomiškai didelė.
Šaltinis: Project Zero