Ranljivost zagonskega nalagalnika OnePlus 3/3T omogoča spremembo SELinuxa v permisivni način v hitrem zagonu

Resna ranljivost v zagonskem nalagalniku OnePlus 3/3T omogoča napadalcem, da preklopijo stanje SELinuxa iz Enforcing v Permissive! Berite naprej, če želite izvedeti več!

The OnePlus 3 in OnePlus 3T so med najboljšimi telefoni, ki jih lahko trenutno kupite. Medtem ko prihajajoči vodilni konji leta 2017 potrošnikom še niso bili razkriti, v njihovi odsotnosti OnePlus 3/3T dominira v resničnem svetu po dostopni ceni.

Ampak, če smo pošteni pri oceni naprave, priznati moramo, da kljub vsem prizadevanjem OnePlus OnePlus 3/3T ni brez napak. Na primer, prej smo poročali o varnostnih težavah, kot je OnePlus razkriva podrobnosti IMEI prek omrežja, ko v telefonu preverjate, ali so na voljo posodobitve. In zdaj imamo še eno varnostno težavo, ki jo moramo dodati na seznam, to pa ima potencialno bolj nevarne posledice.

Ranljivost v zagonskem nalagalniku OnePlus 3/3T odpira vrata zlonamernim napadom. Kot je ugotovil Roee Hay iz raziskovalne skupine za varnost aplikacij IBM X-Force in razkrito na platformi IBM X-Force Exchange

, ta ranljivost omogoča napadalcu, da manipulira s stanjem SELinux na napravah in jih tako preklopi v permisivni način. Vse, kar napadalec potrebuje, je bodisi fizični dostop na napravo, oz oddaljeni dostop do povezave ADB na napravo.

SELinux, ali Security-Enhanced Linux, je varnostni modul jedra Linuxa, ki omogoča dostop in upravljanje varnostnih politik. SELinux je bil uveden v Android, začenši z Androidom 4.3, in je bil nastavljen na Uveljavljanje privzeti način od Androida 4.4. Ta obvezni sistem za nadzor dostopa pomaga uveljavljati obstoječe pravice za nadzor dostopa in poskuša preprečiti napade stopnjevanja privilegijev. To deluje kot ovira za nepooblaščen nadzor nad vašo napravo, kot je aplikacija ali ranljivost, ki želi zlonamerno pridobiti korenski dostop. Nastavitev SELinux na Uveljavljanje privzeto v sistemu Android služi kot prvi korak za zaščito običajnih uporabnikov pred takšnimi napadi.

Ranljivost je precej enostavna za izkoriščanje – pravzaprav se zdi, da gre za veliko pomanjkljivost OnePlusa in ne za tisto, kar bi si predstavljali, da bi izgledalo vaše tipično izkoriščanje. Najprej napadalec znova zažene OnePlus 3/3T v načinu 'fastboot' - če imate fizični dostop, med zagonom preprosto pritisnite gumb za povečanje glasnosti, če pa ga nimate, lahko izdate ukaz ADB adb reboot bootloader na napravo. Način hitrega zagona v napravi izpostavlja vmesnik USB, ki ne bi smel dovoliti dokončanja nobenega varnostno občutljivega ukaza na zaklenjenih napravah. Toda pri OnePlus 3/3T preprosto izdajanje fastboot oem selinux permissive ukaz prek vmesnika za hitri zagon preklopi način SELinux iz Uveljavljanje do Permisivno.

fastboot oem selinux permissive
...
OKAY[ 0.045s]
finished. totaltime: 0.047s

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

Da bi še dodatno zapletli težavo, OnePlus 3 in 3T nimata nobenega vnosa v 'About Screen', ki bi omenil trenutno stanje SELinux naprave. Žrtev še naprej ne bo vedela za ogroženost svoje naprave, če ni bila priča aktivni uporabi izkoriščanja. Pomanjkanje vnosa stanja SELinux v 'About Screen' manjka tako v izdajah Open Beta, ki temeljijo na sistemu Android 6.0, kot tudi v uradnih ROM-ih Android 7.0.

Obstaja več aplikacij za preklop stanja SELinux na Permissive, kot je SELinuxModeChanger aplikacija. Preklapljanje SELinuxa s to metodo ne dovoli, da bi se stanje obdržalo pri ponovnem zagonu. Čeprav lahko uporabljajte skripte ohraniti Permisivno Stanje SELinux med trdimi ponovnimi zagoni. Obe metodi zahtevata korenski dostop, kar pomeni, da je uporabnik že seznanjen s tveganji, ki jim je izpostavljen. Toda glavna razlika pri spreminjanju načina SELinux v Permisivno uporaba zgornje ranljivosti je, da ne samo vztraja med trdimi ponovnimi zagoni, to počne brez potrebe po korenskem dostopu.

Proti ranljivosti do danes ni nobenih sredstev.


NADGRADNJA:

Prišli smo do Sultanxda, enega najbolj priznanih razvijalcev ROM-ov po meri za naprave OnePlus, da vidimo, ali nam lahko pomaga izvedeti več o tej težavi. Takoj se je poglobil v kodo, da bi našel korenski vir, in našel je to:

Način, kako "fastboot oem selinux " deluje tako, da doda dodaten argument v ukazno vrstico jedra ob zagonu Linuxa. Dodatni argument je v obliki "androidboot.selinux=", kje lahko "permisiven". Tukaj stvari postanejo smešne: "androidboot." argumente v ukazni vrstici jedra razčleni Androidov init. V običajni produkcijski zgradbi Androida ("uporabniška" zgradba) je argument "androidboot.selinux" popolnoma prezrt in selinux je vedno prisiljen k uveljavitvi. Torej je ta napaka sestavljena iz dveh težav:

  1. Uporabniki lahko naredijo, da zagonski nalagalnik posreduje zastavico, ki bi običajno naredila selinux dovoljenim pri gradnji ROM-a za inženiring/odpravljanje napak
  2. OnePlus je spremenil Androidov init, da bi upošteval zastavo "androidboot.selinux" tudi za proizvodne različice ROM-a

Tukaj je Androidov init konfiguriran tako, da ignorira zastavico »androidboot.selinux« za produkcijske gradnje: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

Zastavica ALLOW_DISABLE_SELINUX v izvorni kodi je nastavljena samo na 1 za uporabniško odpravljanje napak in inženirske gradnje

(To ne vpliva na moj ROM, ker gradim svoj ROM v produkcijskem (uporabniškem) načinu)

Torej je "androidboot.selinux" preprosto prezrt v mojem ROM-u, "fastboot oem selinux" Zdi se, da je ukaz tudi nekaj, kar je ustvaril OnePlus, saj tak ukaz ne obstaja v javnih virih zagonskega nalagalnika CAF. Na pamet se mi zdijo 4 načini, kako to popraviti za uporabnike z odklenjenimi zagonskimi nalagalniki:

  1. Šestnajstiško uredite zagonski nalagalnik, da spremenite vse primerke niza "selinux" v nekaj drugega (na primer "sclinux"), tako da zastavica za inicializacijo Androida ne bo prepoznana
  2. Šestnajstiško uredite zagonsko binarno datoteko Android v OxygenOS, da zamenjate vse primerke »androidboot.selinux« v nekaj drugega (na primer "androidboot.sclinux"), tako da Android init ne bo prepoznal zastavica androidboot.selinux
  3. Dodajte vdor v gonilnik ukazne vrstice jedra, podoben mojemu obvodu SafetyNet, da skrijete zastavico "androidboot.selinux" pred inicializacijo Androida

Radi bi se zahvalili Sultanxdi za njegov čas in trud, da nam je pomagal ugotoviti, kaj se dogaja v zakulisju. Obrnili smo se tudi na OnePlus, ki je seznanjen s situacijo in zadevo preučuje.


Upamo, da bo OnePlus javno priznal resno težavo in je pregleden v svojih načrtih za njeno odpravo.