was kann einen socket () "Permission denied" Fehler verursachen?

9

Unter Android 4 schlägt die folgende einfache native C-Codezeile mit einem Permission denied Fehler fehl, wenn nicht als root ausgeführt wird:

%Vor%

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.

Aktualisieren

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).

%Vor%

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.

Update 2

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?

    
Udo G 05.04.2016, 12:49
quelle

1 Antwort

11

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.

%Vor%

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:

%Vor%

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:

%Vor%

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 ...

    
Udo G 05.04.2016 16:06
quelle

Tags und Links