Ich habe eine C-Binärdatei, die ich mit Root-Benutzer (su -c binary_path) in Android ausführen.Berechtigung verweigert auf exec() von einer Binärdatei läuft als root
Alles funktioniert gut, bis die Binärdatei versucht, *() eine andere Binärdatei auszuführen. Es funktioniert tatsächlich auf den meisten Geräten, aber bei einigen bekomme ich EACCES Fehler.
Die C binäre dies mit tatsächlich gestartet wird:
execlp("su","su","-c",binary_path,NULL);
An einem gewissen Punkt wird die binäre versuchen, diese Anrufe (vereinfacht) zu machen:
fork();
...
// child here
execlp("sh","sh","-c",script,NULL);
Eigentlich auf verschiedenen Android 6.0 Geräte getestet , ein Nexus 9 und eine S7. Nexus 9 ok, S7 schlägt fehl.
So überprüfte ich alle Berechtigungen und Sicherheitskontext der folgenden, fand keinen Unterschied:
/system/bin
/system/bin/sh
/system/bin/ls
<library_path>
/su/bin/su
geprüft Auch die Binärdatei mit UID ausgeführt wurde/GID = 0, auf beiden Geräten wahr.
In Logcat, sehe ich keine Prüfung für eine fehlende Erlaubnis oder sicheren Richtlinienverstoß.
EDIT: prüft einfach den Sicherheitskontext der binäre unter ausgeführt wird:
$ps -Z
u:r:init:s0 root ...
für beide Geräte gleich, ob exec() funktioniert oder nicht.
EDIT2: Auf dem Gerät es fehlschlägt,/proc/kmsg enthält diese, wenn sie versuchen() exec:
Restricted making process. PID = 8868(<binary>) PPID = 8340(<binary>)
Kein avc von SELinux, und dieser Text nicht in AOSP Quellcode gefunden werden.
Verwenden Sie eine Java-Anwendung, um C-Code auszuführen? –
Die Binärdatei wird von einer gemeinsam genutzten Bibliothek aus einer Java-App gestartet. Nur um es noch einmal zu verdeutlichen, die Binärdatei wird Root gut gegeben und kann exec() aufrufen, was bei einigen Geräten fehlschlägt, nicht bei allen. – 3c71
Vielleicht ist es explizite Erlaubnis auf Manifest? versuche, WRITE_EXTERNAL_STORAGE hinzuzufügen –