33 votes

Comment fonctionne Magisk ?

Magisk est connue comme une méthode Root "sans système". Il s'agit essentiellement d'un moyen de modifier le système sans le modifier réellement. Les modifications sont stockées en toute sécurité dans la partition de démarrage au lieu de modifier les véritables fichiers système.

J'ai cherché un peu partout, mais je n'ai pas trouvé d'explication suffisante sur la façon dont cela fonctionne réellement. Comment l'accès à la racine est-il obtenu et maintenu ? Quel est exactement le rôle de la partition de démarrage et si elle s'intègre à la partition système, comment le fait-elle ?

Une description vraiment détaillée de son fonctionnement manque partout où j'ai cherché, donc ce serait vraiment très apprécié.

61voto

Irfan Latif Points 16863

La majeure partie de votre question est couverte dans Documentation sur Magisk . Je vais citer un de mes réponses précédentes à une autre question, avec quelques inutile détails :)

PREREQUIS :

Pour bien comprendre le fonctionnement de Magisk, il faut avoir des notions de base :

  • Contrôle d'accès discrétionnaire ( DAC )
  • Les identifiants des utilisateurs ( [ESR]UID ), set-user-ID
  • Capacités de Linux (processus et fichier) qui fournissent un contrôle fin sur les permissions du super utilisateur
  • Contrôle d'accès obligatoire ( MAC )
  • SELinux sur Android
  • L'utilisation des espaces de noms par Android pour les Permissions de stockage
  • Fixer le support
  • Processus de démarrage d'Android, partitions et systèmes de fichiers
  • Android init services (le tout premier processus lancé par le noyau)
  • Fichiers *.rc
  • Structure de boot partition (noyau + DTB + ramdisk), Device Tree Blobs DM-Verity ( Démarrage vérifié d'Android ), chiffrement complet du disque / chiffrement par fichier ( FDE/FBE ) etc.

Qu'est-ce que la racine ?

Obtenir les privilèges Root signifie exécuter un processus (généralement un shell) avec l'UID zéro (0) et toutes les capacités de Linux, de sorte que le processus privilégié puisse contourner tous les contrôles de permission du noyau.
Les privilèges du super-utilisateur sont obtenus généralement en exécutant un binaire qui a soit :

C'est ainsi que su y sudo travailler sur Linux dans un DAC UNIX traditionnel. Les utilisateurs non privilégiés exécutent ces binaires pour obtenir les droits Root.

Il s'agit de la méthode la moins utilisée.

Dans les deux cas, le processus appelant doit avoir toutes les capacités de son ensemble limitatif (l'une des 5 catégories de capacités qu'un processus peut avoir) pour avoir de véritables privilèges Root.

COMMENT Android RESTRICTE L'ACCÈS au Root ?

Jusqu'à Android 4.3, on pouvait simplement exécuter un set-user-ID-root su pour élever ses permissions à l'utilisateur Root. Cependant, il y avait un certain nombre de Améliorations de la sécurité dans Android 4.3 qui a cassé ce comportement :

  • Android est passé à des capacités de fichiers au lieu de s'appuyer sur set-user-ID type de failles de sécurité. Un mécanisme plus sûr : Capacités ambiantes a également été introduit dans Android Oreo.
  • Les démons et les services du système peuvent utiliser les capacités des fichiers pour obtenir des capacités de processus (voir la rubrique Transformation des capacités pendant l'exécution ) mais les applications ne peuvent pas non plus le faire car le code de l'application est exécuté par zygote avec attribut de contrôle de processus NO_NEW_PRIVS en ignorant set-user-ID ainsi que des capacités de classement. SUID est également ignoré par le montage /system y /data con nosuid pour toutes les applications.
  • L'UID ne peut être commuté que si le processus appelant a SETUID/SETGID dans son ensemble limitrophe. Mais les applications Android sont conçues pour fonctionner avec toutes les capacités déjà déposées dans tous les ensembles en utilisant l'attribut de contrôle du processus. CAPBSET_DROP .
  • À partir d'Oreo, la possibilité pour les applications de modifier l'UID/GID a été encore supprimée par bloquer certains appels système en utilisant filtres seccomp .

Étant donné que le système autonome su a cessé de fonctionner avec la sortie de Jelly Bean, une transition a été faite vers le mode su daemon . Ce démon est lancé au cours du démarrage et traite toutes les demandes de superutilisateur faites par les applications lorsqu'elles exécutent l'option spéciale su binaire ( 1 ) . install-recovery.sh (situé sous /system/bin/ o /system/etc/ ) qui est exécuté par un service init pré-installé flash_recovery (inutile pour les aventuriers ; récupération des mises à jour après une installation OTA) a été utilisé pour lancer ce démon SU au démarrage.

El prochain défi majeur a été confronté lorsque SELinux était réglé strictement enforcing avec la sortie d'Android 5.0. récupération flash a été ajouté à un contexte SELinux restreint : u:r:install_recovery:s0 qui a arrêté le pure l'accès au système. Même l'UID 0 ne pouvait effectuer qu'un ensemble très limité de tâches sur le dispositif. La seule option viable était donc de démarrer un nouveau service avec un accès illimité au système. SUPER CONTEXTE par Parcheando la politique SELinux. C'est ce qui a été fait (temporairement pour Lollipop ). ( 2 , 3 ) et ensuite de façon permanente pour Marshmallow) et c'est ce que fait Magisk.

COMMENT FONCTIONNE MAGISK ?

Flashing Magisk nécessite généralement un appareil avec bootloader déverrouillé afin que boot.img pourrait être modifié dynamiquement à partir d'une récupération personnalisée ( 4 ) ou une version pré-modifiée boot.img ( 5 ) pourrait être flashé/démarré, par exemple à partir de fastboot .
En outre, il est possible de lancer Magisk sur une ROM en cours d'exécution si vous obtenez les privilèges Root en utilisant un exploit dans le système d'exploitation. ( 6 ) . Cependant, la plupart de ces failles de sécurité ont été corrigées au fil du temps. ( 7 ) .
En outre, en raison de certaines vulnérabilités au niveau du SoC (telles que celle de Qualcomm Mode EDL ), le chargeur de démarrage verrouillé peut être piraté pour charger une image de démarrage/récupération modifiée, ce qui brise l'intégrité du système. La chaîne de confiance . Il ne s'agit toutefois que d'exceptions.

Une fois que le dispositif démarre à partir d'une version corrigée boot.img Dans le cas de Magisk, un démon Magisk entièrement privilégié (avec UID : 0, capacités complètes et contexte SELinux non restreint) fonctionne dès le début du processus de démarrage. Quand une application a besoin de l'accès Root, elle exécute le démon Magisk (/sbin/)su binaire (mondain accessible par DAC et MAC ) qui ne change pas l'UID/GID de lui-même, mais se connecte simplement au démon via un socket UNIX. ( 8 ) et demande de fournir à l'application requérante un shell Root avec toutes les capacités. Afin d'interagir avec l'utilisateur pour accorder/refuser su de la part des applications, le démon est connecté à l'application Magisk Manager qui peut afficher les invites de l'interface utilisateur. Une base de données ( /data/adb/magisk.db ) des permissions accordées/refusées est construit par le démon pour une utilisation future.

Processus de démarrage :
Le noyau d'Android démarre init avec SELinux dans permissive au démarrage (avec quelques exceptions ). init charges /sepolicy (ou politique de fractionnement ) avant de démarrer tout service/daemon/processus, le définit enforcing et passe ensuite à son propre contexte. A partir de là, même init n'est pas autorisé par la politique à revenir en mode permissif ( 9 , 10 ) . La politique ne peut pas non plus être modifiée, même par l'utilisateur root. ( 11 ) . Par conséquent, Magisk remplace /init avec un fichier personnalisé init qui corrige les règles de politique SELinux avec SUPER CONTEXTE ( u:r:magisk:s0 ) et définit le service pour lancer le démon Magisk avec ce contexte. Ensuite, l'original init est exécuté pour continuer le processus de démarrage ( 12 ) .

Travail sans système :
Depuis le init est construit dans boot.img il est inévitable de le modifier et /system la modification devient inutile. C'est là que le systemless Le terme a été inventé ( 13 , 14 ) . La principale préoccupation était de faciliter les OTAs - re-flasher les boot (et la récupération) est moins compliquée que le re-flash. system . OTA par blocs sur une version modifiée /system La partition échouera parce qu'elle permet l'utilisation de dm-verity pour signer cryptographiquement le system partition .

System-as-Root :
Sur les appareils plus récents utilisant système-as-Root le noyau ne se charge pas ramdisk から boot mais de system . Donc [system.img]/init doit être remplacé par celui de Magisk init . Magisk modifie également /init.rc et place ses propres fichiers dans /root y /sbin . Cela signifie system.img doit être modifié, mais l'approche de Magisk est de ne pas toucher à system partition.

Sur A/B les périphériques pendant le démarrage normal skip_initramfs est passée par le chargeur de démarrage dans la ligne de commande du noyau en tant que boot.img contient ramdisk pour la récupération. Donc Magisk patche le binaire du noyau pour toujours ignorer skip_initramfs c'est-à-dire démarrer en récupération, et place Magisk init binaire dans la récupération ramdisk à l'intérieur de boot.img . Au démarrage, lorsque le noyau démarre en mode de récupération, s'il n'y a pas d'erreur d'affichage, le système ne peut pas être utilisé. skip_initramfs c.-à-d. l'utilisateur a intentionnellement démarré à la récupération, puis Magisk init exécute simplement la récupération init . Sinon, system.img est monté à /system_root par Magisk init , contenu de ramdisk sont ensuite copiés dans / nettoyage de tout ce qui existait auparavant, les fichiers sont ajoutés/modifiés dans rootfs / , /system_root/system est monté en liaison avec /system et enfin [/system]/init est exécuté ( 15 , 16 ) .

Cependant, les choses ont encore changé avec Q, maintenant /system est monté à / mais les fichiers à ajouter/modifier comme /init , /init.rc y /sbin sont recouverts de supports de fixation ( 17 ) .

Sur non-A/B system-as-root les appareils, Magisk doit être installé pour la récupération ramdisk afin de conserver une approche sans système, car boot.img ne contient pas ramdisk ( 18 ) .

Modules :
Un avantage supplémentaire de systemless est l'utilisation de Magisk Modules . Si vous voulez placer certains binaires sous /system/*bin/ ou modifier certains fichiers de configuration (comme hosts o dnsmasq.conf ) ou certaines bibliothèques/fichiers d'infrastructure (comme ceux requis par des mods tels que XPOSED ) en /system o /vendor vous pouvez le faire sans toucher à la partition en utilisant la fonction Monture magique (sur la base des montages de reliure). Magisk permet d'ajouter et de supprimer des fichiers en les superposant.

MagiskHide : ( 19 )
Un autre défi consistait à masquer la présence de Magisk afin que les applications ne puissent pas savoir si l'appareil est enraciné. De nombreuses applications n'aiment pas les appareils enracinés et peuvent cesser de fonctionner. Google a été l'un des principaux concernés, et a donc introduit SafetyNet dans le cadre de Play Protect qui s'exécute en tant que processus GMS (Play Services) et qui indique aux applications (y compris à leurs propres Google Pay ) et donc leurs développeurs que l'appareil est actuellement dans un état non altéré ( 20 ) .

Le Rooting est l'un des nombreux états tempérés possibles, les autres étant le Boot non vérifié, le bootloader déverrouillé, la non-certification CTS, la ROM personnalisée, la construction débuggable, permissive SELinux, ADB activé, quelques mauvais la présence de Lucky Patcher, Xposed, etc. Magisk utilise quelques astuces pour s'assurer que la plupart de ces propriétés ne sont pas modifiées. tests passe toujours, bien que les applications puissent utiliser d'autres API Android ou lire directement certains fichiers. Certains modules fournissent une obfuscation supplémentaire.

En plus de dissimuler sa présence dans le réseau SafeyNet de Google, Magisk permet également aux utilisateurs de dissimuler le système Root ( su et tout autre fichier lié à Magisk) à partir de n'importe quelle application, en utilisant à nouveau les montages liés et les espaces de noms de montage. Pour cela, zygote doit être surveillé en permanence pour les VM des applications nouvellement bifurquées.

Toutefois, il n'est pas facile de dissimuler réellement un appareil enraciné aux applications, car de nouvelles techniques évoluent pour détecter la présence de Magisk, principalement à partir des éléments suivants /proc ou d'autres systèmes de fichiers. Ainsi, un certain nombre de les bizarreries sont faites pour prendre en charge correctement la dissimulation des modifications à la détection . Magisk essaie de supprimer toutes les traces de sa présence pendant le processus de démarrage. ( 21 ) .


Magisk prend également en charge :

  • Désactivation de dm-verity y /data cryptage en modifiant fstab (en ramdisk , /vendor o DTB ). Voir Comment désactiver dm-verity sur Android ?
  • Modification des propriétés en lecture seule en utilisant resetprop outil, Modifier boot.img en utilisant magiskboot y Modifier la politique SELinux en utilisant magiskpolitique .
  • Exécution de scripts de démarrage en utilisant init.d -mécanisme similaire ( 22 ) .

C'est une brève description des fonctionnalités actuellement offertes par Magisk (AFAIK).


POUR EN SAVOIR PLUS :

6voto

Guillermo Gomez Points 423

Magisk fournit l'accès Root en fournissant un binaire "Root" fonctionnel monté sur le disque dur de l'ordinateur. /sbin/magisk . Toute application qui tente d'exécuter ce binaire fera appel à Magisk pour lui accorder l'accès Root, qui est à son tour géré et maintenu par l'application Magisk Manager.

El /boot est une partition séparée qui stocke certaines données nécessaires au démarrage du système. Elle comprend l'initialisation de certains mécanismes de très bas niveau comme le noyau Linux, les pilotes de périphériques, les systèmes de fichiers, etc., avant que la couche supérieure du système d'exploitation Android ne soit activée. Elle est séparée de telle sorte que les données de niveau Linux sont stockées dans cette partition tandis que les données de niveau Android (SystemUI, Paramètres, etc.) sont stockées dans la partition /system partition. Modifier /boot ne compte pas comme modifiant /system C'est ce dernier point que vérifient généralement DM-verity et AVB.

Et Magisk patche et s'intègre dans le site /boot partition donc ça ne touche pas du tout la partition système. Il utilise une technique appelée "une monture de liaison" pour modifier le contenu des fichiers système que d'autres programmes voient, sans modifier réellement le système de fichiers sous-jacent sous la partition système (les "vrais" fichiers restent donc intacts).

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