5 votos

¿Cómo ejecutar un servicio init de Android con contexto SELinux de superusuario?

Quiero ejecutar un Android init servicio. Tengo un dispositivo que tiene shell rooteado (comprado de la fabricación como rooteado). Este dispositivo no tiene Magisk u otro gestor de su pero adb shell tiene root y tiene userdebug ROM instalada en él.

He seguido los siguientes pasos para configurar init servicio:

  1. Creado /etc/init/custom.rc con el siguiente contenido:

    /etc/init/custom.rc

    define service, use executable here if script not needed

    service custom /system/bin/custom.sh

    # don't start unless explicitly asked to
    disabled
    
    # 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:magisk:s0
    seclabel u:r:su:s0

    start the service when boot is completed

    on property:sys.boot_completed=1 start custom

  2. Creado /system/bin/custom.sh con los siguientes contenidos:

    !/system/bin/sh

    execute the binary, should run in foreground, otherwise get in loop

    echo "$(date): Starting program..." exec /system/bin/executable

  3. Colocó mi ejecutable en /system/bin/executable .

  4. Se han dado permisos a todos los archivos de la siguiente manera:

    Give rights to the executable

    chown 0.0 /system/bin/executable chmod 554 /system/bin/executable chcon u:object_r:system_file:s0 /system/bin/executable

    Give rights to the custom.sh

    chown 0.0 /system/bin/custom.sh chmod 554 /system/bin/custom.sh chcon u:object_r:system_file:s0 /system/bin/custom.sh

    Give rights to the custom.rc

    chown 0.0 /etc/init/custom.rc chmod 644 /etc/init/custom.rc chcon u:object_r:system_file:s0 /etc/init/custom.rc

  5. Reinicie el sistema.

Tengo el siguiente error:

[   55.829099 / 06-09 23:51:09.279][0] init: cannot execve('/system/bin/custom.sh'): Permission denied
[   55.850172 / 06-09 23:51:09.309][6] init: Service 'custom' (pid 7729)
[   55.850224 / 06-09 23:51:09.309][6] init: Service 'custom' (pid 7729) exited with status 127
[   55.850243 / 06-09 23:51:09.309][6] init: Sending signal 9 to service 'custom' (pid 7729) process group...
[   60.830224 / 06-09 23:51:14.289][6] init: starting service 'custom'...
[   60.832073 / 06-09 23:51:14.289][1] init: cannot execve('/system/bin/custom.sh'): Permission denied
[   60.832153 / 06-09 23:51:14.289][3] audit: type=1400 audit(1560142274.289:131): avc:  denied  { transition } for  pid=8035 comm="init" path="/system/bin/custom.sh" dev="sda24" ino=8146 scontext=u:r:init:s0 tcontext=u:r:su:s0 tclass=process permissive=0

Tengo muy poca experiencia con las políticas de SELinux. Por favor, guíeme cómo puedo arreglar esto.

6voto

Jack Wade Puntos 231

Aquí está el error:

audit: type=1400 audit(1560142274.289:131): avc: denied { transition } for pid=8035 comm="init" path="/system/bin/custom.sh" dev="sda24" ino=8146 scontext=u:r:init:s0 tcontext=u:r:su:s0 tclass=process permissive=0

En palabras sencillas, afirma que init se ejecuta con su contexto u:r:init:0 , quieres que se ejecute /system/bin/custom.sh con contexto u:r:su:s0 , pero no está permitido en la sepolítica .

Rooteando un teléfono se consiguen dos cosas: UID 0 (que tiene) y un contexto SELinux sin restricciones (que no tiene). Magisk permite a cualquier otro contexto hacer cualquier cosa con sus propios contextos ( u:r:magisk:s0 y u:object_r:magisk:s0 ). Y puede hacer cualquier cosa a cualquier otro contexto. Ver detalles en esta respuesta .

u:r:su:s0 es un contexto limitado que no permite init para hacer la transición a sí mismo. Sólo adb puede hacer esto en userdebug o eng construye una ROM. Ver referencia y esta respuesta para más detalles.

Posibles soluciones:

  • Ejecutar el servicio en init si no necesita acceder a ningún recurso que init no puede acceder. Pero en la mayoría de los casos es muy poco probable.

  • Rootea tu dispositivo con Magisk y ejecuta el servicio con u:r:magisk:s0 contexto como se explica en esta respuesta .

  • Modifique su política de SELinux para permitir esta transición. Inyecte la siguiente declaración a sepolicy utilizando política mágica o sepolicy-inject :

    ~# magiskpolicy --live 'allow init su process transition'
    ~# sepolicy-inject -s init -t su -c process -p transition -l

    Ver también dmesg para cualquier otra denegación. Como referencia, en mi dispositivo init puede realizar las siguientes operaciones en Magisk:

    allow init magisk : process { fork transition sigchld sigkill sigstop signull signal ptrace getsched setsched getsession getpgid setpgid getcap setcap share getattr setexec setfscreate noatsecure siginh setrlimit rlimitinh dyntransition setcurrent execmem execstack execheap setkeycreate setsockcreate getrlimit }
    allow init magisk : fifo_file { read write getattr open }
    allow init magisk : fd use
    allow init magisk : unix_stream_socket { getopt connectto }
    allow init magisk : binder { impersonate call set_context_mgr transfer }

    A continuación, extraiga boot.img y ramdisk (sólo en caso de no system-as-Root dispositivos), sustituir /sepolicy con el nuevo archivo de política copiado de /sys/fs/selinux/policy , reempaquetar boot.img y el flash de vuelta.

  • Establecer la permisividad de SELinux

    Desde root adb shell hacer echo -n 0 >/sys/fs/selinux/enforce o setenforce 0 . Sin embargo, esto no es permanente y se ajustará a enforced en el arranque. init no puede establecerlo como permisivo. Además, configurar SELinux de forma permisiva es un riesgo de seguridad y por lo tanto nunca se recomienda.

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