OnePlus 3/3T Bootloader sårbarhet tillåter ändring av SELinux till Permissive Mode i Fastboot

En allvarlig sårbarhet i OnePlus 3/3T-starthanteraren gör att angripare kan växla SELinux-tillstånd från Enforcing till Permissive! Läs vidare för att veta mer!

De OnePlus 3 och den OnePlus 3T är bland de bästa telefonerna du kan köpa just nu. Medan de kommande flaggskeppen 2017 ännu inte har avslöjats för konsumenterna, i deras frånvaro OnePlus 3/3T dominerar verkliga prestanda till ett överkomligt pris.

Men om vi ska vara rättvisa när vi bedömer enheten, vi måste erkänna att trots OnePlus bästa ansträngningar är OnePlus 3/3T inte utan sina fel. Vi har till exempel tidigare rapporterat om säkerhetsfrågor som t.ex OnePlus läcker IMEI-detaljer över nätverket när du söker efter uppdateringar på din telefon. Och nu har vi ytterligare ett säkerhetsproblem att lägga till i listan, det här med potentiellt farligare konsekvenser.

En sårbarhet i starthanteraren för OnePlus 3/3T öppnar dörrar för skadliga attacker. Som hittats av Roee Hay från IBM X-Force Application Security Research Team och avslöjades på IBM X-Force Exchange-plattformen

, tillåter denna sårbarhet en angripare att manipulera SELinux-tillståndet på enheterna och därmed växla det till tillåtande läge. Allt angriparen behöver är antingen fysisk åtkomst till enheten, eller fjärråtkomst till en ADB-anslutning till enheten.

SELinux, eller Security-Enhanced Linux, är en Linux-kärnasäkerhetsmodul som möjliggör åtkomst och hantering av säkerhetspolicyer. SELinux introducerades till Android från och med Android 4.3 och var inställd på Genomdrivande läge som standard sedan Android 4.4. Detta obligatoriska åtkomstkontrollsystem hjälper till att upprätthålla befintliga åtkomstkontrollrättigheter och försöker förhindra attacker med eskalering av rättigheter. Detta fungerar som ett hinder för obehörig kontroll över din enhet, till exempel en app eller sårbarhet som syftar till att få root-åtkomst på ett skadligt sätt. Ställer in SELinux på Genomdrivande som standard på Android fungerar som det första steget för att skydda normala användare från sådana attacker.

Sårbarheten är ganska enkel att utnyttja - i själva verket verkar det vara en enorm förbiseende från OnePlus sida snarare än hur du skulle kunna föreställa dig att din typiska utnyttjande skulle se ut. Först startar en angripare om OnePlus 3/3T till "snabbboot" -läge - om du har fysisk åtkomst, tryck helt enkelt på Volym-upp-knappen under uppstart, men om du inte gör det kan du utfärda ADB-kommandot adb reboot bootloader till enheten. Fastboot-läget på enheten exponerar ett USB-gränssnitt, vilket inte bör tillåta något säkerhetskänsligt kommando att utföra på låsta enheter. Men på OnePlus 3/3T, bara utfärda fastboot oem selinux permissive kommandot via fastboot-gränssnittet växlar SELinux-läget från Genomdrivande till Tolerant.

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

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

För att ytterligare komplicera problemet har OnePlus 3 och 3T inte någon post i "Om skärmen" för att nämna enhetens nuvarande SELinux-tillstånd. Ett offer kommer att fortsätta att förbli omedveten om det komprometterade tillståndet för sin enhet om de inte bevittnade utnyttjandet som aktivt användes. Avsaknaden av en SELinux-tillståndspost i "Om skärmen" saknas från både Android 6.0-baserade Open Beta-utgåvor såväl som Android 7.0 officiella ROM.

Det finns flera appar för att växla SELinux-tillståndet till Permissive, såsom SELinuxModeChanger Ansökan. Att växla SELinux genom denna metod tillåter inte tillståndet att bestå genom en omstart. Fast det kan du använda skript att upprätthålla Tolerant SELinux-tillstånd över hårda omstarter. Båda dessa metoder kräver root-åtkomst, vilket innebär att användaren redan har kunskap om de risker de utsätts för. Men den stora skillnaden med att ändra SELinux-läget till Tolerant använder ovanstående sårbarhet är att det inte bara kvarstår vid hårda omstarter, det gör det utan att behöva root-åtkomst.

Inga åtgärder finns mot sårbarheten i dagsläget.


UPPDATERING:

Vi sträckte ut handen till Sultanxda, en av de mest erkända anpassade ROM-utvecklarna för OnePlus-enheter, för att se om han kunde hjälpa oss att lära oss mer om det här problemet. Han grävde omedelbart i koden för att hitta rotkällan, det här är vad han hittade:

Sättet att "fastboot oem selinux " Kommandot fungerar är att det lägger till ett extra argument på kärnans kommandorad när du startar Linux. Det extra argumentet kommer i form av "androidboot.selinux=", var kan vara "tillåtande". Det är där saker och ting blir roliga: "androidboot."-argument på kärnans kommandorad tolkas av Androids init. I ett normalt Android-produktionsbygge (en "användare") ignoreras argumentet "androidboot.selinux" totalt och selinux tvingas alltid att tillämpa. Så denna bugg består av två problem:

  1. Användare kan få bootloadern att passera en flagga som normalt skulle göra selinux tillåtande på en ingenjörs-/felsöknings-ROM-byggnad
  2. OnePlus modifierade Androids init för att hedra flaggan "androidboot.selinux" även för produktions-ROM-byggen

Här är Androids init konfigurerad för att ignorera flaggan "androidboot.selinux" för produktionsbyggen: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

ALLOW_DISABLE_SELINUX-flaggan i källkoden är endast inställd på 1 för userdebug och tekniska builds

(Mitt ROM påverkas inte av detta eftersom jag bygger min ROM i produktionsläge (användarläge)

Så "androidboot.selinux" ignoreras helt enkelt i min ROM, "fastboot oem selinux "-kommandot verkar också vara något som OnePlus skapade, eftersom inget sådant kommando finns i CAF: s offentliga bootloader-källor. Jag kan komma på fyra sätt att fixa detta för användare med olåsta bootloaders:

  1. Hexredigera starthanteraren för att ändra alla instanser av strängen "selinux" till något annat (som "sclinux") så att flaggan inte kommer att kännas igen av Androids init
  2. Hexredigera Android init-binären i OxygenOS för att ersätta alla instanser av "androidboot.selinux" till något annat (som "androidboot.sclinux") så att Android init inte känner igen androidboot.selinux flagga
  3. Lägg till ett hack till kärnans kommandoradsdrivrutin som liknar min SafetyNet-bypass för att dölja flaggan "androidboot.selinux" från Androids init

Vi vill tacka Sultanxda för hans tid och ansträngning för att hjälpa oss ta reda på vad som händer bakom kulisserna. Vi har också kontaktat OnePlus, som är medveten om situationen och undersöker saken.


Vi hoppas att OnePlus offentligt erkänner det allvarliga problemet och är transparenta i sina planer för att fixa det.