OnePlus 3/3T Bootloader-sårbarhed tillader ændring af SELinux til Permissive Mode i Fastboot

En alvorlig sårbarhed i OnePlus 3/3T bootloaderen gør det muligt for angribere at skifte SELinux-tilstand fra håndhævende til tilladende! Læs videre for at vide mere!

Det OnePlus 3 og OnePlus 3T er blandt de bedste telefoner, du kan købe lige nu. Mens de kommende flagskibe i 2017 endnu ikke er afsløret for forbrugerne, i deres fravær OnePlus 3/3T dominerer den virkelige verdens ydeevne til en overkommelig pris.

Men hvis vi skal være retfærdige i vurderingen af ​​enheden, vi er nødt til at erkende, at på trods af OnePlus' bedste indsats, er OnePlus 3/3T ikke uden deres fejl. For eksempel har vi tidligere rapporteret om sikkerhedsproblemer som f.eks OnePlus lækker IMEI-detaljer over netværket, når du tjekker efter opdateringer på din telefon. Og nu har vi endnu et sikkerhedsproblem at tilføje til listen, dette med potentielt mere farlige konsekvenser.

En sårbarhed i bootloaderen til OnePlus 3/3T åbner døre for ondsindede angreb. Som fundet af Roee Hay fra IBM X-Force Application Security Research Team og 

afsløret på IBM X-Force Exchange-platformen, tillader denne sårbarhed en angriber at manipulere SELinux-tilstanden på enhederne og derved skifte den til tilladelig tilstand. Alt hvad angriberen behøver er enten fysisk adgang til enheden, eller fjernadgang til en ADB-forbindelse til enheden.

SELinux, eller Security-Enhanced Linux, er et Linux-kernesikkerhedsmodul, som giver mulighed for adgang og administration af sikkerhedspolitikker. SELinux blev introduceret til Android startende med Android 4.3 og blev indstillet til Håndhævelse tilstand som standard siden Android 4.4. Dette obligatoriske adgangskontrolsystem hjælper med at håndhæve de eksisterende adgangskontrolrettigheder og forsøger at forhindre privilegieeskaleringsangreb. Dette fungerer som en hindring for uautoriseret kontrol over din enhed, såsom en app eller sårbarhed, der sigter mod at få root-adgang ondsindet. Indstilling af SELinux til Håndhævelse som standard på Android fungerer som det første skridt til at beskytte normale brugere mod sådanne angreb.

Sårbarheden er ret ligetil at udnytte - faktisk ser det ud til at være en enorm forglemmelse fra OnePlus side i stedet for, hvordan du ville forestille dig, at din typiske udnyttelse skulle se ud. Først genstarter en angriber OnePlus 3/3T i 'fastboot'-tilstand - hvis du har fysisk adgang, skal du blot trykke på Volume-Up-knappen under opstart, men hvis du ikke gør det, kan du udstede ADB-kommandoen adb reboot bootloader til enheden. Fastboot-tilstanden på enheden afslører en USB-grænseflade, som ikke bør tillade nogen sikkerhedsfølsom kommando at udføre på låste enheder. Men på OnePlus 3/3T udsteder du blot fastboot oem selinux permissive kommando gennem fastboot-grænsefladen skifter SELinux-tilstand fra Håndhævelse til Tilladende.

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

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

For yderligere at komplicere problemet, har OnePlus 3 og 3T ikke nogen indgang i 'Om skærmen' for at nævne enhedens aktuelle SELinux-tilstand. Et offer vil fortsat være uvidende om deres enheds kompromitterede tilstand, hvis de ikke var vidne til, at udnyttelsen blev brugt aktivt. Manglen på en SELinux-tilstandsindgang i 'Om skærmen' mangler fra både Android 6.0-baserede Open Beta-udgivelser såvel som Android 7.0 officielle ROM'er.

Der findes adskillige apps til at skifte SELinux-tilstand til Permissive, såsom SELinuxModeChanger Ansøgning. Skift af SELinux gennem denne metode tillader ikke tilstanden at fortsætte gennem en genstart. Selvom du kan bruge scripts at vedligeholde Tilladende SELinux-tilstand på tværs af hårde genstarter. Begge disse metoder kræver root-adgang, hvilket indebærer, at brugeren allerede har kendskab til de risici, de er udsat for. Men den største forskel med at ændre SELinux-tilstanden til Tilladende at bruge ovenstående sårbarhed er, at det ikke kun vedvarer på tværs af hårde genstarter, det gør det uden behov for root-adgang.

Der findes ingen midler mod sårbarheden i dag.


OPDATERING:

vi rakte ud til Sultanxda, en af ​​de mest anerkendte brugerdefinerede ROM-udviklere til OnePlus-enheder, for at se, om han kunne hjælpe os med at lære mere om dette problem. Han gravede straks i koden for at finde rodkilden, dette er hvad han fandt:

Den måde, som "fastboot oem selinux " kommandoen virker, er, at den tilføjer et ekstra argument til kernekommandolinjen, når du starter Linux. Det ekstra argument kommer i form af "androidboot.selinux=", hvor kan være "tilladende". Der er hvor tingene bliver sjove: "androidboot."-argumenter på kernens kommandolinje parses af Androids init. I en normal Android-produktionsbygning (en "bruger"-bygning) ignoreres argumentet "androidboot.selinux" totalt, og selinux er altid tvunget til at håndhæve. Så denne fejl består af to problemer:

  1. Brugere kan få bootloaderen til at passere et flag, der normalt ville gøre selinux tilladeligt på en engineering/debugging ROM build
  2. OnePlus modificerede Androids init for at hædre "androidboot.selinux"-flaget selv for produktions-ROM-bygninger

Her er hvor Androids init er konfigureret til at ignorere flaget "androidboot.selinux" for produktionsbygninger: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

ALLOW_DISABLE_SELINUX-flaget i kildekoden er kun indstillet til 1 for brugerfejlretnings- og tekniske builds

(Min ROM påvirkes ikke af dette, fordi jeg bygger min ROM i produktionstilstand (bruger))

Så "androidboot.selinux" ignoreres simpelthen i min ROM, "fastboot oem selinux " kommando ser også ud til at være noget, som OnePlus har oprettet, da der ikke findes en sådan kommando i CAF's offentlige bootloader-kilder. Fra toppen af ​​mit hoved kan jeg komme i tanke om 4 måder at løse dette på for brugere med ulåste bootloadere:

  1. Hex-rediger bootloaderen for at ændre alle forekomster af strengen "selinux" til noget andet (såsom "sclinux"), så flaget ikke genkendes af Androids init
  2. Hex-rediger Android init binær i OxygenOS for at erstatte alle forekomster af "androidboot.selinux" til noget andet (som "androidboot.sclinux"), så Android init ikke genkender androidboot.selinux flag
  3. Tilføj et hack til kernens kommandolinjedriver svarende til min SafetyNet bypass for at skjule "androidboot.selinux" flaget fra Androids init

Vi vil gerne takke Sultanxda for hans tid og indsats for at hjælpe os med at finde ud af, hvad der foregår bag kulisserne. Vi har også kontaktet OnePlus, som er klar over situationen og undersøger sagen.


Vi håber, at OnePlus offentligt anerkender det alvorlige problem og er gennemsigtige i deres planer om at løse det.