Unter Android 4 schlägt die folgende einfache native C-Codezeile mit einem Permission denied
Fehler fehl, wenn nicht als root
ausgeführt wird:
I tun haben root
Zugriff auf das Gerät, möchten den Prozess jedoch als nicht-privilegierter Benutzer ausführen.
Beachten Sie, dass der Fehler bereits vor dem Binden des Sockets auftritt.
Ich denke, es gibt einige Sicherheitseinstellungen, die angepasst werden müssen? Jeder kann mir sagen, wo ich suchen soll?
Das O / S ist in diesem Fall wirklich Android, aber ich denke, das Problem ist wirklich Linux-bezogen (da Android auf einem Linux-Kernel basiert).
Für diejenigen, die sich fragen: Dies ist ein benutzerdefiniertes Programm, das in einer vollständigen ( debootstrap
ped) Debian Jessie-Installation in einer Android 4-Umgebung ausgeführt wird.
Ich habe erfahren, dass der Android Kernel eine spezielle CONFIG_ANDROID_PARANOID_NETWORK
Erweiterung hat, die Netzwerkzugriff nur auf Benutzer in AID_INET
und AID_NET_RAW
Gruppen erlaubt.
Jedoch wird auch nach dem Hinzufügen des Benutzers zu diesen Gruppen socket()
immer noch abgelehnt (und ping
scheint das gleiche Problem zu haben, BTW).
Ich kann nicht sagen, ob das CONFIG_ANDROID_PARANOID_NETWORK
-Flag in diesem bestimmten Kernel gesetzt ist, da ich keinen Zugriff auf die Konfigurationsdatei habe.
Ich fand heraus, dass sowohl root
als auch mein unprivilegierter Benutzer imp
erfolgreich socket()
aufrufen kann - zumindest mit dem oben beschriebenen Gruppen-Setup.
Wenn Sie jedoch denselben Prozess wie root
aufrufen und dann mit dem imp
Systemaufruf zu seteuid()
wechseln, wird verhindert, dass socket()
erfolgreich ist. Irgendwelche Ideen?
Wie sich herausstellt, verwendet Android einen speziellen Kernel-Patch, der mit CONFIG_ANDROID_PARANOID_NETWORK
aktiviert wird. Dieser Patch ermöglicht Netzwerkzugriff auf Systembenutzer, die zu bestimmten speziellen Gruppen mit fest codierten IDs gehören.
Dies liegt daran, dass Android diesen Gruppen normalerweise nur Benutzer (d. h. Apps) hinzufügt, wenn die entsprechende App über Netzwerkberechtigungen verfügt.
Wenn Sie diesen Gruppen einen Benutzer hinzufügen, können Sie socket()
wie in der folgenden Frage beschrieben verwenden:
Jedoch , wenn ein Prozess seteuid()
verwendet, um von root
zu einem nichtprivilegierten Benutzer zu wechseln (z. B. someuser
), reicht das nicht aus (oder wahrscheinlich irrelevant ), dass dieser effektive Benutzer aid_*
Gruppenmitgliedschaft hat. Stattdessen muss der Benutzer root
explizit ein Mitglied dieser Gruppen sein:
Das hat das Problem für mich gelöst.
Beachten Sie, dass ich auch versucht habe, mit setegid()
und ähnlich als Alternative zu spielen, aber nichts half ...
Tags und Links android sockets permissions