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.