3 votes

init : cannot execve('/system/bin/custom.sh') : Permission refusée

J'ai un système enraciné-as-Root Appareil Samsung et j'essaie d'exécuter un service init qui fonctionne custom.sh script utilisant u:r:su:s0 Contexte 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

D'après ce que j'ai compris, les règles pour la transition de l'état d'urgence à l'état d'urgence sont les suivantes init le contexte pour su Le contexte n'est pas défini, je devrais donc obtenir avc: denial erreur.

Mais, je reçois une erreur de permission refusée comme suit :

init : cannot execve('/system/bin/custom.sh') : Permission refusée

J'ai vérifié l'autorisation de custom.sh et il est le suivant :

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

Veuillez suggérer ce qui se passe ici et comment je peux le réparer ?

5voto

Irfan Latif Points 16863

Comme le montre init code source :

...
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] << "')";
        }

Pour une raison quelconque, si init ne parvient pas à exécuter le script custom.sh (c'est-à-dire syscall execve retourne un code de sortie non nul), vous obtiendrez cannot execve erreur. Permission denied (EACCES) est retourné par execve dans de nombreuses situations, par exemple, impossibilité de lire le chemin d'accès au fichier, pas de réponse à la question de savoir si l'on peut lire le fichier. +x sur un binaire ou un système de fichiers monté avec noexec . Incapacité à read | open | execute ou faire une transition de contexte est retourné comme EACCES .

Aussi cannot execve est enregistré par init pero avc: denied est enregistré par le sous-système SELinux via audit le sous-système ou la journalisation du noyau. Vous devriez obtenir les deux erreurs dans dmesg ou logcat -b events ou logcat -b kernel . Si ce n'est pas le cas, il y a peut-être un dontaudit règle définie pour les contextes source ou cible ou les deux.

Veuillez suggérer ce qui se passe ici et comment je peux le réparer ?

Comme expliqué dans ma réponse à votre question précédente : Comment exécuter un service init Android avec un contexte SELinux de superutilisateur ? définir des règles SELinux pour autoriser init lire / exécuter custom.sh et faire la transition vers u:r:su:s0 .

0 votes

Je n'ai pas trouvé de avc: denied erreur pour custom.sh . La seule erreur que je vois avec dmesg | grep avc: es avc: denied { find } .. mais j'ai compris votre point de vue et ma compréhension est la suivante : cela devrait être corrigé en injectant l'autorisation SELinux requise. Je vous remercie.

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