2016-04-17 2 views
0

У меня есть двоичный код C, который я запускаю с использованием пользователя root (su -c binary_path) в Android.Разрешение отклонено на exec() из двоичного файла, выполняющегося как root

Все работает нормально, пока двоичный файл не попытается выполнить exec *() другой двоичный код. Он действительно работает на большинстве устройств, однако на некоторых я получаю ошибку EACCES.

: C двоичная фактически начал использовать это:

execlp("su","su","-c",binary_path,NULL); 

В какой-то момент, двоичное будет пытаться сделать эти звонки (упрощенно):

fork(); 

... 

// child here 

execlp("sh","sh","-c",script,NULL); 

На самом деле протестирован на различных устройствах Android 6.0 , Nexus 9 и S7. Nexus 9 нормально, S7 терпит неудачу.

Так что я проверил все права доступа и безопасности контекст следующего, не нашел никакой разницы:

/system/bin 
/system/bin/sh 
/system/bin/ls 
<library_path> 
/su/bin/su 

Также проверяется двоичная был запущен с UID/GID = 0, правда на обоих устройствах.

В logcat я не вижу никакой проверки на отсутствие разрешения или нарушение безопасности.

EDIT: Просто проверить контекст безопасности бинарное выполняется под:

$ps -Z 
u:r:init:s0   root ... 

одинаковы для обоих устройств работает ли Exec() или нет.

EDIT2: На устройстве он терпит неудачу,/Proc/kmsg содержит это при попытке EXEC():

Restricted making process. PID = 8868(<binary>) PPID = 8340(<binary>) 

Нет АКА от SELinux, и этот текст не может быть найден в AOSP исходного кода.

+0

использовать приложение Java для запуска кода C? –

+0

Двоичный файл запускается из общей библиотеки, вызываемой из приложения Java. Чтобы снова прояснить, двоичный файл получил root, и он может вызвать exec(), который не будет работать на некоторых устройствах, а не во всех. – 3c71

+0

Возможно, это явное разрешение на манифест? попробуйте добавить WRITE_EXTERNAL_STORAGE –

ответ

1

После поиска «Ограниченного процесса создания» в Google я наткнулся на ядра Samsung для S5 и S6 (а не 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; 
    } 

И sec_restrict_fork() содержит это:

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

Таким образом, отказ от устройств Samsung и никаких других.

Смежные вопросы