5 votes

Comment exécuter un service d'initialisation Android avec un contexte SELinux superutilisateur ?

Je veux faire fonctionner un système Android init service. J'ai un appareil dont la coque est enracinée (achetée au fabricant comme enracinée). Cet appareil ne dispose pas de Magisk ou d'un autre gestionnaire de su mais adb shell est enracinée et elle a userdebug ROM installée dessus.

J'ai suivi les étapes suivantes pour mettre en place init service :

  1. Créée /etc/init/custom.rc avec le contenu suivant :

    /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. Créée /system/bin/custom.sh avec le contenu suivant :

    !/system/bin/sh

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

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

  3. J'ai placé mon exécutable à /system/bin/executable .

  4. Les autorisations pour tous les fichiers sont les suivantes :

    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. Redémarrer le système.

J'ai obtenu l'erreur suivante :

[   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

J'ai très peu d'expérience avec les politiques SELinux. Je vous prie de m'indiquer comment je peux résoudre ce problème.

6voto

Irfan Latif Points 16863

L'erreur est ici :

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 termes simples, il stipule que init est en cours d'exécution avec son contexte u:r:init:0 vous voulez qu'il exécute /system/bin/custom.sh avec contexte u:r:su:s0 mais ce n'est pas autorisé dans la politique de sécurité. .

Le rootage d'un téléphone permet d'obtenir deux choses : L'UID 0 (ce que vous avez) et un contexte SELinux non restreint (ce que vous n'avez pas). Magisk permet à tout autre contexte de faire n'importe quoi avec ses propres contextes ( u:r:magisk:s0 y u:object_r:magisk:s0 ). Et il peut faire n'importe quoi à n'importe quel autre contexte. Voir les détails dans cette réponse .

u:r:su:s0 est un contexte limité qui ne permet pas à l init de faire la transition vers lui-même. Seul adb peut le faire sur userdebug o eng d'une ROM. Voir aussi référence y cette réponse pour plus de détails.

Solutions possibles :

  • Exécuter le service en init s'il n'a pas besoin d'accéder à des ressources qui ont été utilisées par le contexte de la init n'est pas autorisé à accéder. Mais dans la plupart des cas, c'est très peu probable.

  • Rootez votre appareil avec Magisk et exécutez le service avec u:r:magisk:s0 comme expliqué dans l'article cette réponse .

  • Modifiez votre politique SELinux pour permettre cette transition. Injectez l'instruction suivante dans sepolicy mit magiskpolicy o sepolicy-inject :

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

    Voir aussi dmesg pour tout autre refus. À titre de référence, sur mon appareil init est autorisé à effectuer les opérations suivantes sur 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 }

    Extraire ensuite boot.img y ramdisk (uniquement pour les pays non membres de l'UE) système en tant que racine ), remplacer /sepolicy avec un nouveau fichier de politique copié à partir de /sys/fs/selinux/policy , repack boot.img et revenir en arrière.

  • Définir SELinux permissive

    De la racine adb shell do echo -n 0 >/sys/fs/selinux/enforce o setenforce 0 . Toutefois, cette mesure n'est pas permanente et sera réglée sur enforced au démarrage. init ne peut pas être permissif. De plus, le fait de rendre SELinux permissif constitue un risque pour la sécurité et n'est donc pas recommandé.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X