apk android e binario suid

2

È corretto per me supporre che, non c'è modo di fare un'app Android (APK) per eseguire in proprio il privilegio di root (senza un eseguibile nativo "su" esterno), anche quando sta usando il codice nativo NDK ?

Chiedo perché presumo dal momento che le app Android non sono eseguibili nativi, ma eseguono invece il runtime Dalvik. Quindi, non c'è modo di impostare "bit suid" sull'APK, permettendogli di chiamare NDK seteuid (0) e privilegiare l'escalation su root?

Sto cercando di capire, è che il motivo per il dispositivo Android rootato richiede sempre la presenza dell'eseguibile nativo "su" in modo che l'altra app che deve eseguire qualche operazione di privilegio possa farlo chiamando qualcosa come system () o exec ()?

Per favore sentiti libero di indicare se qualcuna delle mie ipotesi / comprensione è errata.

    
posta wei 01.12.2015 - 05:01
fonte

1 risposta

4

Android assegna diversi ID utente per ciascuna applicazione installata come meccanismo di separazione dei privilegi. Questo può essere influenzato dal certificato utilizzato per firmare un'applicazione ( link ) in combinazione con l'attributo android:sharedUserId nel file AndroidManifest.xml dell'applicazione:

When an application (APK file) is installed onto an Android device, the Package Manager verifies that the APK has been properly signed with the certificate included in that APK. If the certificate (or, more accurately, the public key in the certificate) matches the key used to sign any other APK on the device, the new APK has the option to specify in the manifest that it will share a UID with the other similarly-signed APKs.

Le applicazioni Android lanciate dagli utenti finali sono tutte generate dal processo Zygote (questo serve ad accelerare l'avvio dell'applicazione, dato che Zygote può forkare e caricare il codice dell'applicazione e non dover ricaricare un sacco di librerie di sistema). Al momento della stesura di questo, la configurazione del servizio Zygote si presenta così:

  service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd
    writepid /dev/cpuset/foreground/tasks

La sintassi di questo file è descritta qui: link , che ha questo da dire sui livelli di privilegio assegnati ai servizi per impostazione predefinita (così puoi vedere che, per impostazione predefinita, Zygote viene eseguito come root):

user <username>
  Change to username before exec'ing this service.
  Currently defaults to root.  (??? probably should default to nobody)
  Currently, if your process requires linux capabilities then you cannot use
  this command. You must instead request the capabilities in-process while
  still root, and then drop to your desired uid.

Zygote utilizza un metodo JNI denominato forkAndSpecialize (cerca " com_android_internal_os_Zygote.cpp ") per gestire l'attività specifica della piattaforma di chiamata setuid () all'UD che il gestore pacchetti ha assegnato in base alle applicazioni manifest e installate. Fallire correttamente se quella chiamata setuid non è riuscita è stata l'origine delle vulnerabilità di escalation dei privilegi Android in passato (leggi l'exploit RageAgainstTheCage se sei interessato, anche se non era correlato a Zygote).

Questo è il motivo principale per cui è necessario un binario separato privilegiato / setuid per avviare le applicazioni usando i privilegi di livello root. Se hai creato la tua immagine di sistema personalizzata, potresti probabilmente modificare PackageManager / Zygote per mantenere i privilegi di root, ma in questo modo si interrompe fondamentalmente il modello di sicurezza di Android.

    
risposta data 01.12.2015 - 06:07
fonte

Leggi altre domande sui tag