У меня есть двоичный код 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 исходного кода.
использовать приложение Java для запуска кода C? –
Двоичный файл запускается из общей библиотеки, вызываемой из приложения Java. Чтобы снова прояснить, двоичный файл получил root, и он может вызвать exec(), который не будет работать на некоторых устройствах, а не во всех. – 3c71
Возможно, это явное разрешение на манифест? попробуйте добавить WRITE_EXTERNAL_STORAGE –