OnePlus 3/3T Bootloader-sårbarhet tillater endring av SELinux til Permissive Mode i Fastboot

En alvorlig sårbarhet i OnePlus 3/3T bootloader lar angripere bytte SELinux-tilstand fra håndhevende til tillatende! Les videre for å vite mer!

De OnePlus 3 og OnePlus 3T er blant de beste telefonene du kan kjøpe akkurat nå. Mens de kommende flaggskipene i 2017 ennå ikke er avslørt for forbrukerne, i deres fravær OnePlus 3/3T dominerer ytelsen i den virkelige verden til en overkommelig pris.

Men hvis vi skal være rettferdige når vi vurderer enheten, vi må erkjenne at til tross for OnePlus beste innsats, er ikke OnePlus 3/3T uten sine feil. For eksempel har vi tidligere rapportert om sikkerhetsproblemer som f.eks OnePlus lekker IMEI-detaljer over nettverket når du ser etter oppdateringer på telefonen. Og nå har vi et annet sikkerhetsproblem å legge til listen, dette med potensielt farligere konsekvenser.

En sårbarhet i oppstartslasteren til OnePlus 3/3T åpner dører for ondsinnede angrep. Som funnet av Roee Hay fra IBM X-Force Application Security Research Team og avslørt på IBM X-Force Exchange-plattformen

, tillater denne sårbarheten en angriper å manipulere SELinux-tilstanden på enhetene, og dermed bytte den til permissiv modus. Alt angriperen trenger er enten fysisk tilgang til enheten, eller ekstern tilgang til en ADB-tilkobling til enheten.

SELinux, eller Security-Enhanced Linux, er en Linux-kjernesikkerhetsmodul som gir tilgang til og administrasjon av sikkerhetspolicyer. SELinux ble introdusert for Android fra og med Android 4.3 og ble satt til Håndheve modus som standard siden Android 4.4. Dette obligatoriske tilgangskontrollsystemet hjelper til med å håndheve eksisterende tilgangskontrollrettigheter og forsøker å forhindre eskaleringsangrep av privilegier. Dette fungerer som en hindring for uautorisert kontroll over enheten din, for eksempel en app eller sårbarhet som tar sikte på å få root-tilgang på en skadelig måte. Setter SELinux til Håndheve som standard på Android fungerer som det første trinnet for å beskytte normale brukere mot slike angrep.

Sårbarheten er ganske enkel å utnytte - faktisk ser det ut til å være en stor forglemmelse fra OnePlus sin side i stedet for hvordan du kan forestille deg at den typiske utnyttelsen skal se ut. Først starter en angriper OnePlus 3/3T på nytt i "fastboot"-modus - hvis du har fysisk tilgang, trykk ganske enkelt på volum opp-knappen under oppstart, men hvis du ikke gjør det, kan du gi ADB-kommandoen adb reboot bootloader til enheten. Fastboot-modusen på enheten avslører et USB-grensesnitt, som ikke skal tillate noen sikkerhetssensitive kommandoer å fullføre på låste enheter. Men på OnePlus 3/3T, bare utstede fastboot oem selinux permissive kommando gjennom fastboot-grensesnittet bytter SELinux-modus fra Håndheve til Permissive.

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

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

For å komplisere problemet ytterligere, har ikke OnePlus 3 og 3T noen oppføring i "Om skjermen" for å nevne den nåværende SELinux-tilstanden til enheten. Et offer vil fortsette å forbli uvitende om den kompromitterte tilstanden til enheten deres hvis de ikke var vitne til at utnyttelsen ble brukt aktivt. Mangelen på en SELinux-statusoppføring i 'Om skjermen' mangler fra både Android 6.0-baserte Open Beta-utgivelser så vel som Android 7.0 offisielle ROM-er.

Det finnes flere apper for å bytte SELinux-tilstand til Permissive, for eksempel SELinuxModeChanger applikasjon. Å veksle SELinux gjennom denne metoden lar ikke tilstanden vedvare gjennom en omstart. Skjønt, du kan bruke skript å opprettholde Permissive SELinux-tilstand på tvers av harde omstarter. Begge disse metodene krever root-tilgang, noe som innebærer at brukeren allerede har kunnskap om risikoen de er utsatt for. Men den største forskjellen med å endre SELinux-modus til Permissive ved hjelp av ovennevnte sårbarhet er at det ikke bare vedvarer over harde omstarter, det gjør det uten å trenge root-tilgang.

Det finnes ingen rettsmidler mot sårbarheten per i dag.


OPPDATER:

Vi rakk ut til Sultanxda, en av de mest anerkjente tilpassede ROM-utviklerne for OnePlus-enheter, for å se om han kunne hjelpe oss med å lære mer om dette problemet. Han gravde raskt i koden for å finne rotkilden, dette er hva han fant:

Måten som "fastboot oem selinux " Kommandoen fungerer er at den legger til et ekstra argument på kjernekommandolinjen når du starter Linux. Det ekstra argumentet kommer i form av "androidboot.selinux=", hvor kan være "tillatende". Det er der ting blir morsomme: "androidboot."-argumenter på kjernekommandolinjen analyseres av Androids init. I en vanlig Android-produksjonsbygging (en "bruker"-bygning), blir "androidboot.selinux"-argumentet fullstendig ignorert og selinux blir alltid tvunget til å håndheve. Så denne feilen består av to problemer:

  1. Brukere kan få oppstartslasteren til å passere et flagg som normalt vil gjøre selinux tillatt på en konstruksjons-/feilsøkings-ROM
  2. OnePlus modifiserte Androids init for å hedre "androidboot.selinux"-flagget selv for produksjon av ROM-bygg

Her er hvor Androids init er konfigurert til å ignorere "androidboot.selinux"-flagget for produksjonsbygg: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

ALLOW_DISABLE_SELINUX-flagget i kildekoden er bare satt til 1 for userdebug og engineering builds

(ROM-en min påvirkes ikke av dette fordi jeg bygger ROM-en min i produksjonsmodus (bruker))

Så "androidboot.selinux" blir ganske enkelt ignorert i ROM-en min, "fastboot oem selinux "-kommandoen ser også ut til å være noe OnePlus opprettet, siden ingen slik kommando eksisterer i CAFs offentlige oppstartslasterkilder. På toppen av hodet mitt kan jeg tenke på 4 måter å fikse dette på for brukere med ulåste oppstartslastere:

  1. Hex-rediger oppstartslasteren for å endre alle forekomster av strengen "selinux" til noe annet (som "sclinux") slik at flagget ikke gjenkjennes av Androids init
  2. Hex-rediger Android init-binæren i OxygenOS for å erstatte alle forekomster av "androidboot.selinux" til noe annet (som "androidboot.sclinux") slik at Android init ikke vil gjenkjenne androidboot.selinux flagg
  3. Legg til et hack til kjernekommandolinjedriveren som ligner på min SafetyNet-bypass for å skjule "androidboot.selinux"-flagget fra Androids init

Vi vil gjerne takke Sultanxda for hans tid og innsats for å hjelpe oss med å finne ut hva som skjer bak kulissene. Vi har også tatt kontakt med OnePlus, som er klar over situasjonen og ser på saken.


Vi håper OnePlus offentlig anerkjenner det alvorlige problemet og er transparente i planene deres for å fikse det.