3 votos

init: no puede execve('/system/bin/custom.sh'): Permiso denegado

Tengo un sistema rooteado como root Dispositivo Samsung y estoy tratando de ejecutar un servicio init que se ejecuta custom.sh con la ayuda de u:r:su:s0 Contexto SELinux.

# define service, use executable here if script not needed
service custom /system/bin/custom.sh

    # don't start unless explicitly asked to
    disabled

    # Use `seclabel u:r:magisk:s0` to run with unrestricted SELinux context to avoid avc denials
    # can also use "u:r:su:s0" on userdebug / eng builds if no Magisk.
    # It's required if SELinux is enforcing and service needs access
    # to some system resources not allowed by default sepolicy
    seclabel u:r:su:s0

# start the service when boot is completed
on property:sys.boot_completed=1
    # Use it to start the service
    start custom

Según tengo entendido, las normas de transición de init contexto a su el contexto no está definido, por lo que debería obtener avc: denial error.

Pero, estoy recibiendo un error de permiso denegado como el siguiente:

init: no puede execve('/system/bin/custom.sh'): Permiso denegado

He comprobado el permiso de custom.sh y es el siguiente:

-r-xr-xr-- 1 Root Root 153 2019-11-04 13:25 /system/custom.sh

Por favor, sugiera qué está sucediendo aquí y cómo puedo solucionarlo.

5voto

Jack Wade Puntos 231

Como se desprende de init código fuente :

...
static bool ExpandArgsAndExecv(const std::vector<std::string>& args) {
    ...
    return execv(c_strings[0], c_strings.data()) == 0;
}
...
        if (!ExpandArgsAndExecv(args_)) {
            PLOG(ERROR) << "cannot execve('" << args_[0] << "')";
        }

Por la razón que sea, si init falla al ejecutar el script custom.sh (es decir, syscall execve devuelve un código de salida distinto de cero), obtendrá cannot execve error. Permission denied (EACCES) es devuelto por execve en múltiples situaciones, por ejemplo, no se puede leer la ruta del archivo, no hay +x en un sistema de archivos o binario montado con noexec . Incapacidad de read | open | execute script o hacer la transición de contexto se devuelve como EACCES .

También cannot execve es registrado por init pero avc: denied es registrado por el subsistema SELinux a través de audit subsistema o el registro del kernel. Debería obtener ambos errores en dmesg o logcat -b events o logcat -b kernel . Si no lo hace, puede que haya una dontaudit regla definida para los contextos de origen, de destino o ambos.

Por favor, sugiera qué está sucediendo aquí y cómo puedo solucionarlo.

Como he explicado en mi respuesta a su pregunta anterior: ¿Cómo ejecutar un servicio init de Android con contexto SELinux de superusuario? definir las reglas de SELinux para permitir init leer / ejecutar custom.sh y hacer la transición a u:r:su:s0 .

0 votos

No encontré ninguna avc: denied error para custom.sh . El único error que puedo ver con dmesg | grep avc: es avc: denied { find } .. pero entiendo tu punto de vista y lo que entiendo es que se debe arreglar inyectando el permiso SELinux necesario. Gracias.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X