2016-04-17 10 views
0

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.

+0

Verwenden Sie eine Java-Anwendung, um C-Code auszuführen? –

+0

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

+0

Vielleicht ist es explizite Erlaubnis auf Manifest? versuche, WRITE_EXTERNAL_STORAGE hinzuzufügen –

Antwort

1

Nach der Suche nach "Restricted making process" bei Google stolperte ich über Samsung Kernel für die S5 und S6 (nicht die S7).

if(CHECK_ROOT_UID(current)) 
    if(sec_restrict_fork()) 
    { 
     PRINT_LOG("Restricted making process. PID = %d(%s) " 
         "PPID = %d(%s)\n", 
      current->pid, current->comm, 
      current->parent->pid, current->parent->comm); 
     return -EACCES; 
    } 

Und die sec_restrict_fork() enthält dieses:

if (sec_check_execpath(current->mm, "/data/")) { 
    ret = 1; 
    goto out; 
} 

daher das Scheitern auf Samsung-Geräten und keine andere.