Slide 1

Slide 1 text

Le root : un inconnu chez soi ? Bruce BUJON – AndroidMakersFR 2017

Slide 2

Slide 2 text

Qui suis-je ? / $ whoiam  Architecte logiciel  Développeur Java  Hacker curieux Bruce BUJON PerfectSlayer @HardCoding

Slide 3

Slide 3 text

Qu’est-ce que le root ?  Compte utilisateur  UID = 0 (User IDentifier)  Tous les droits et toutes les permissions Le « SuperUser »

Slide 4

Slide 4 text

Qu’est-ce que rooter un device ?  Se donner la capacité de se connecter avec le compte root :  Depuis l’écran de connexion,  En substituant son utilisateur par le compte root.

Slide 5

Slide 5 text

Qu’est-ce que rooter un device ?  Se donner la capacité de se connecter avec le compte root :  Depuis l’écran de connexion,  En substituant son utilisateur par le compte root. Shell distant avec adb root Commande su (Substitute User)

Slide 6

Slide 6 text

Pourquoi rooter un device ?  Opportunités :  Xposed Framework  Sauvegarde et restauration avancées  Gestion du noyau  Suppression des bloatwares 5,6 % de devices rootés Source : Google Android Security 2016 report

Slide 7

Slide 7 text

Pourquoi rooter un device ?  Opportunités :  Xposed Framework  Sauvegarde et restauration avancées  Gestion du noyau  Suppression des bloatwares  Penser en dehors des API du SDK/NDK  Reprendre le contrôle de son device 5,6 % de devices rootés Source : Google Android Security 2016 report

Slide 8

Slide 8 text

Démonstration du root $ adb shell gretprop ro.build.type userdebug ROM de développement

Slide 9

Slide 9 text

Démonstration du root $ adb shell gretprop ro.build.type userdebug $ adb shell id uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input), … context=u:r:shell:s0 ROM de développement id : donne l’identifiant courant shell : un utilisateur standard

Slide 10

Slide 10 text

Démonstration du root $ adb shell gretprop ro.build.type userdebug $ adb shell id uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input), … context=u:r:shell:s0 $ adb root $ adb shell id uid=0(root) gid=0(root) groups=0(root),1004(input),… context=u:r:su:s0 ROM de développement id : donne l’identifiant courant shell : un utilisateur standard Redémarre adb avec les permissions root

Slide 11

Slide 11 text

Démonstration du root en production $ adb shell getprop ro.build.type user ROM de production

Slide 12

Slide 12 text

Démonstration du root en production $ adb shell getprop ro.build.type user $ adb root $ adb shell id uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input), … context=u:r:shell:s0 ROM de production Utilisateur standard

Slide 13

Slide 13 text

Démonstration du root en production $ adb shell getprop ro.build.type user $ adb root $ adb shell id uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input), … context=u:r:shell:s0 $ adb shell su -c id /system/bin/sh: su: not found ROM de production Utilisateur standard Commande su absente Lance id en tant que root

Slide 14

Slide 14 text

 lunch -  BUILD  BUILDTYPE : user userdebug eng (engineer) Accès limité : production User + root + debug Debug++ : développement Nom de code d’un device ROM cooking : Configuration de la cible

Slide 15

Slide 15 text

ROM cooking : modules d’une ROM  Le BUILDTYPE définit les modules de la ROM : "su": { "class": ["EXECUTABLES"], "path": ["system/extras/su"], "tags": ["debug"], "installed": ["out/target/product/generic/system/xbin/su"] }, "adbd": { "class": ["EXECUTABLES"], "path": ["system/core/adb"], "tags": ["optional"], "installed": ["out/target/product/generic/root/sbin/adbd"] }, Extraits de module-info.json

Slide 16

Slide 16 text

$ ls -l /system/xbin/su -rwsr-x--- root shell 10280 2017-02-15 21:15 su Setuid flag + root user ROM cooking : Module su (substitute user)

Slide 17

Slide 17 text

$ ls -l /system/xbin/su -rwsr-x--- root shell 10280 2017-02-15 21:15 su $ cat system/extras/su/su.c … setuid(0); setgid(0); … execv(args[0], args); … Setuid flag + root user Utilisateur : root Groupe : root Exécute la commande en paramètre ROM cooking : Module su (substitute user)

Slide 18

Slide 18 text

 Processus de l’exemple de démonstration : « adb shell id » 0 (root) 0 (root) /init /sbin/adbd PID1 Démon adb ROM cooking : Module adbd (démon adb)

Slide 19

Slide 19 text

 Processus de l’exemple de démonstration : « adb shell id » 0 (root) 0 (root) 0 (root)  2000 (shell) /init /sbin/adbd /sbin/adbd PID1 Démon adb Fork adb ROM cooking : Module adbd (démon adb)

Slide 20

Slide 20 text

 Processus de l’exemple de démonstration : « adb shell id » 0 (root) 0 (root) 0 (root)  2000 (shell) 2000 (shell) 2000 (shell) /init /sbin/adbd /sbin/adbd /system/bin/sh /system/bin/id PID1 Démon adb Fork adb Shell Récupère l’identifiant ROM cooking : Module adbd (démon adb)

Slide 21

Slide 21 text

 Processus de l’exemple de démonstration : « adb shell id »  Avec « abd root » 0 (root) 0 (root) 0 (root)  2000 (shell) 2000 (shell) 2000 (shell) /init /sbin/adbd /sbin/adbd /system/bin/sh /system/bin/id PID1 Démon adb Fork adb Shell Récupère l’identifiant 0 (root) 0 (root) ROM cooking : Module adbd (démon adb)

Slide 22

Slide 22 text

 L’influence du BUILDTYPE sur le root : BUILDTYPE Modules adb shell user adb root eng su + adbd 0 (root) OK userdebug su + adbd 2000 (shell) / 0 (root) OK user adbd 2000 (shell) KO ROM cooking : Configuration & modules root

Slide 23

Slide 23 text

 L’influence du BUILDTYPE sur le root :  Impossible d’utiliser les modules officiels pour se connecter en root. BUILDTYPE Modules adb shell user adb root eng su + adbd 0 (root) OK userdebug su + adbd 2000 (shell) / 0 (root) OK user adbd 2000 (shell) KO ROM cooking : Configuration & modules root

Slide 24

Slide 24 text

Extrait de /system/code/adb/daemon/main.cpp Extrait de /system/code/adb/Android.mk Build type ROM cooking : Module adbd en production

Slide 25

Slide 25 text

Comment s’approprier le compte root en production ?

Slide 26

Slide 26 text

HTC Dream / G1  22 Octobre 2008 : Premier téléphone commercialisé sous Android

Slide 27

Slide 27 text

HTC Dream / G1  22 Octobre 2008 : Premier téléphone commercialisé sous Android  6 Novembre 2008 : AOSP Issue Tracker, Issue 1207 « In connectbot (ssh client) if you're connected to a remote server, and type reboot, it will reboot both the remote server and the local phone. »

Slide 28

Slide 28 text

HTC Dream / G1  22 Octobre 2008 : Premier téléphone commercialisé sous Android  6 Novembre 2008 : AOSP Issue Tracker, Issue 1207 « In connectbot (ssh client) if you're connected to a remote server, and type reboot, it will reboot both the remote server and the local phone. »

Slide 29

Slide 29 text

Communauté du root  « How-to-root » sur XDA :

Slide 30

Slide 30 text

Communauté du root  « How-to-root » sur XDA : Koush (Koushik Dutta) CyanogenMod ClockworkMod Cyanogen Inc CyanogenMod

Slide 31

Slide 31 text

CyanogenMod  Créée en 2009  Rapidement de plus en plus populaire  Accès au root inclus

Slide 32

Slide 32 text

CyanogenMod  Créée en 2009  Rapidement de plus en plus populaire  Accès au root inclus Mais « sécurisé » !

Slide 33

Slide 33 text

Superuser  Package OTA :  /system/app/Superuser.apk  /system/xbin/su Zinx (Christopher Lais) CyanogenMod Par la recovery

Slide 34

Slide 34 text

Superuser  Package OTA :  /system/app/Superuser.apk  /system/xbin/su  Usage :  Runtime.getRuntime().exec("su id");  Popup de confirmation Zinx (Christopher Lais) CyanogenMod Par la recovery

Slide 35

Slide 35 text

com.myapp Superuser : Communications entre processus

Slide 36

Slide 36 text

su com.myapp (1) su id Superuser : Communications entre processus

Slide 37

Slide 37 text

su com.myapp (1) su id (2) uid/gid/cmd Superuser : Communications entre processus

Slide 38

Slide 38 text

su com.myapp (1) su id (2) uid/gid/cmd permissions.db (3) Vérification Superuser : Communications entre processus

Slide 39

Slide 39 text

su com.myapp (1) su id (2) uid/gid/cmd permissions.db (3) Vérification (4) socket + uid/gid/cmd Superuser : Communications entre processus

Slide 40

Slide 40 text

su com.myapp superuser (1) su id (2) uid/gid/cmd permissions.db (3) Vérification (4) socket + uid/gid/cmd (5) ActivityManager Superuser : Communications entre processus

Slide 41

Slide 41 text

su com.myapp superuser (1) su id (2) uid/gid/cmd permissions.db (3) Vérification (4) socket + uid/gid/cmd (5) ActivityManager (6) Popup Superuser : Communications entre processus

Slide 42

Slide 42 text

su com.myapp superuser (1) su id (2) uid/gid/cmd permissions.db (3) Vérification (4) socket + uid/gid/cmd (5) ActivityManager (6) Popup (7) Réponse Superuser : Communications entre processus

Slide 43

Slide 43 text

su com.myapp superuser (1) su id (2) uid/gid/cmd permissions.db (3) Vérification (4) socket + uid/gid/cmd (5) ActivityManager (6) Popup (7) Réponse (8) Mise à jour Superuser : Communications entre processus

Slide 44

Slide 44 text

su com.myapp superuser (1) su id (2) uid/gid/cmd permissions.db (3) Vérification (4) socket + uid/gid/cmd (5) ActivityManager (6) Popup (7) Réponse id (8) Mise à jour (9) exécute Superuser : Communications entre processus

Slide 45

Slide 45 text

 Processus 0 (root) 0 (root) 0 (root)  10042 (u0_a42) /init zygote com.myapp Superuser : Résumé des processus

Slide 46

Slide 46 text

 Processus 0 (root) 0 (root) 0 (root)  10042 (u0_a42) 10042 (u0_a42) /init zygote com.myapp /system/xbin/su Superuser : Résumé des processus

Slide 47

Slide 47 text

 Processus 0 (root) 0 (root) 0 (root)  10042 (u0_a42) 10042 (u0_a42) 10064 (u0_a64) /init zygote com.myapp /system/xbin/su superuser Superuser : Résumé des processus

Slide 48

Slide 48 text

 Processus 0 (root) 0 (root) 0 (root)  10042 (u0_a42) 10042 (u0_a42) 0 (root) 10064 (u0_a64) /init zygote com.myapp /system/xbin/su /system/bin/id superuser  0 (root) Superuser : Résumé des processus

Slide 49

Slide 49 text

2008 2009 2010 2011 2012 2013 2014 Zinx Superuser : Historique

Slide 50

Slide 50 text

2008 2009 2010 2011 2012 2013 2014 Zinx ChainsDD (Adam Shanks) CyanogenMod Superuser : Historique

Slide 51

Slide 51 text

2008 2009 2010 2011 2012 2013 2014 Zinx Koush ChainsDD (Adam Shanks) CyanogenMod Superuser : Historique

Slide 52

Slide 52 text

2008 2009 2010 2011 2012 2013 2014 Zinx Koush ChainsDD (Adam Shanks) CyanogenMod Android 4.3 ! Superuser : Historique

Slide 53

Slide 53 text

Plus de su depuis une application Plus de mount Android 4.3 : Renfort de la sécurité

Slide 54

Slide 54 text

 Processus 0 (root) 0 (root) 0 (root)  10042 (u0_a42) 10042 (u0_a42) 0 (root) /init zygote com.myapp /system/xbin/su /system/bin/id  0 (root) Android 4.3 : Nouvelle approche

Slide 55

Slide 55 text

 Processus 0 (root) 0 (root) 0 (root)  10042 (u0_a42) 10042 (u0_a42) 0 (root) /init zygote com.myapp /system/xbin/su /system/bin/id  0 (root) nosuid capacités-- Android 4.3 : Nouvelle approche

Slide 56

Slide 56 text

ChainFire (Jorrit Jongma) SuperSU  Processus 0 (root) 0 (root) 0 (root)  10042 (u0_a42) 10042 (u0_a42) 0 (root) /init zygote com.myapp /system/xbin/su /system/bin/id  0 (root) nosuid capacités-- Android 4.3 : Nouvelle approche

Slide 57

Slide 57 text

ChainFire (Jorrit Jongma) SuperSU  Processus  su devient un service (démon su) 0 (root) 0 (root) 0 (root)  10042 (u0_a42) 10042 (u0_a42) 0 (root) 0 (root) /init zygote com.myapp /system/xbin/su /system/bin/id su --daemon  0 (root) nosuid capacités-- Android 4.3 : Nouvelle approche

Slide 58

Slide 58 text

SuperSU : Mise en place du service  Services lancés par init  Configuration : /init.rc  Dans la partition boot  Non (facilement) modifiable

Slide 59

Slide 59 text

SuperSU : Mise en place du service  Services lancés par init  Configuration : /init.rc  Dans la partition boot  Non (facilement) modifiable  Extrait : service flash_recovery /system/bin/install-recovery.sh class main oneshot Extraits de /system/code/rootdir/init.rc Patché pour démarrer le démon su

Slide 60

Slide 60 text

init SuperSU : Communications entre processus

Slide 61

Slide 61 text

su (démon) init (1) install-recovery.sh SuperSU : Communications entre processus

Slide 62

Slide 62 text

su (démon) init (1) install-recovery.sh (2) socket SuperSU : Communications entre processus

Slide 63

Slide 63 text

com.myapp su (démon) init (1) install-recovery.sh (2) socket SuperSU : Communications entre processus

Slide 64

Slide 64 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket SuperSU : Communications entre processus

Slide 65

Slide 65 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket (4) pid/uid/cmd SuperSU : Communications entre processus

Slide 66

Slide 66 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket (4) pid/uid/cmd su (fils) (5) fork SuperSU : Communications entre processus

Slide 67

Slide 67 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket (4) pid/uid/cmd su (fils) (5) fork SuperSU : Communications entre processus

Slide 68

Slide 68 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket (4) pid/uid/cmd su (fils) (5) fork SuperSU : Communications entre processus

Slide 69

Slide 69 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket (4) pid/uid/cmd su (fils) (5) fork (6) exit code SuperSU : Communications entre processus

Slide 70

Slide 70 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket (4) pid/uid/cmd su (fils) (5) fork (6) exit code (7) exit code SuperSU : Communications entre processus

Slide 71

Slide 71 text

com.myapp su (client) (3) su id su (démon) init (1) install-recovery.sh (2) socket (4) pid/uid/cmd su (fils) (5) fork (6) exit code (7) exit code (8) exit code SuperSU : Communications entre processus

Slide 72

Slide 72 text

 Processus 0 (root) 0 (root) 0 (root) /init su --daemon zygote SuperSU : Résumé des processus

Slide 73

Slide 73 text

 Processus 0 (root) 0 (root) 0 (root) 10042 (u0_a42) 10042 (u0_a42) /init su --daemon zygote com.myapp /system/xbin/su SuperSU : Résumé des processus

Slide 74

Slide 74 text

 Processus 0 (root) 0 (root) 0 (root) 0 (root) 10042 (u0_a42) 10042 (u0_a42) /init su --daemon su zygote com.myapp /system/xbin/su SuperSU : Résumé des processus

Slide 75

Slide 75 text

 Processus 0 (root) 0 (root) 0 (root) 0 (root) 10042 (u0_a42) 10042 (u0_a42) 10064 (u0_a64) /init su --daemon su zygote com.myapp /system/xbin/su superuser SuperSU : Résumé des processus

Slide 76

Slide 76 text

 Processus 0 (root) 0 (root) 0 (root) 0 (root) 0 (root) 10042 (u0_a42) 10042 (u0_a42) 10064 (u0_a64) /init su --daemon su /system/bin/id zygote com.myapp /system/xbin/su superuser SuperSU : Résumé des processus

Slide 77

Slide 77 text

Modifications de la ROM détectées Plus d’OTA Android 4.4 / Android 5.0 : Verified boot & block-based OTA

Slide 78

Slide 78 text

SuperSU : « systemless » root ChainFire boot / /init.rc /system /data /xbin/su /install-recovery.sh /app /data Operating System User data Kernel RAM disk

Slide 79

Slide 79 text

SuperSU : « systemless » root ChainFire boot / /init.rc /system /data /xbin/su /install-recovery.sh /app /data Verified boot Operating System User data Kernel RAM disk

Slide 80

Slide 80 text

SuperSU : « systemless » root ChainFire boot / /init.rc /system /data /xbin/su /install-recovery.sh /app /data /su.img Verified boot /su /bin/daemonsu /bin/su + patchs Operating System User data SuperUser Kernel RAM disk

Slide 81

Slide 81 text

SuperSU : Modifitations du boot  Modifications de la configuration d’init : # mount /data/su.img to /su on property:sukernel.mount=1 mount ext4 loop@/data/su.img /su noatime # launch SuperSU daemon service daemonsu /sbin/launch_daemonsu.sh service class late_start user root seclabel u:r:init:s0 oneshot Partition /su Démon su Extraits de init.su.rc

Slide 82

Slide 82 text

Android 4.3 / 4.4 / 5.0 / 7.0 : SELinux  Security-Enhanced Linux pour Android :  Amélioration du sandboxing

Slide 83

Slide 83 text

≤ 4.4 : permissive 5.0 : enforcing Android 4.3 / 4.4 / 5.0 / 7.0 : SELinux  Security-Enhanced Linux pour Android :  Amélioration du sandboxing

Slide 84

Slide 84 text

≤ 4.4 : permissive 5.0 : enforcing Android 4.3 / 4.4 / 5.0 / 7.0 : SELinux  Security-Enhanced Linux pour Android :  Amélioration du sandboxing  1ère solution de contournement par ChainFire’s SuperSU

Slide 85

Slide 85 text

Résumé : Complexité du « root »  Évolutions :  Gestion des permissions + interactions utilisateur  Nouveau service Linux  Nouvelle partition  Support des règles de sécurité

Slide 86

Slide 86 text

Résumé : Complexité du « root »  Évolutions :  Gestion des permissions + interactions utilisateur  Nouveau service Linux  Nouvelle partition  Support des règles de sécurité  Services personnalisés  Surcouche de /system

Slide 87

Slide 87 text

Résumé : Complexité du « root »  Évolutions :  Gestion des permissions + interactions utilisateur  Nouveau service Linux  Nouvelle partition  Support des règles de sécurité  Services personnalisés  Surcouche de /system  ChainFire’s SuperSU toujours précurseur su.d su --bind

Slide 88

Slide 88 text

SuperSU : solution closed source  Exécutables installés : /data/SuperSU.apk /su/bin/daemonsu /su/bin/app_process /su/bin/su /su/bin/sukernel /su/bin/supolicy_wrapped /su/bin/supolicy /su/lib/supol.so /su/bin/sush /sbin/launch_daemonsu.sh

Slide 89

Slide 89 text

SuperSU : solution closed source  Exécutables installés : /data/SuperSU.apk /su/bin/daemonsu /su/bin/app_process /su/bin/su /su/bin/sukernel /su/bin/supolicy_wrapped /su/bin/supolicy /su/lib/supol.so /su/bin/sush /sbin/launch_daemonsu.sh Closed source

Slide 90

Slide 90 text

SuperSU : solution closed source  Exécutables installés : /data/SuperSU.apk /su/bin/daemonsu /su/bin/app_process /su/bin/su /su/bin/sukernel /su/bin/supolicy_wrapped /su/bin/supolicy /su/lib/supol.so /su/bin/sush /sbin/launch_daemonsu.sh Closed source Extrait de « How-To SU »

Slide 91

Slide 91 text

SuperSU : solution closed source  Exécutables installés :  Bonus :  Remplace forceencrypt par encryptable dans fstab  Désactive dm-verity et supprime les clefs (par défaut) /data/SuperSU.apk /su/bin/daemonsu /su/bin/app_process /su/bin/su /su/bin/sukernel /su/bin/supolicy_wrapped /su/bin/supolicy /su/lib/supol.so /su/bin/sush /sbin/launch_daemonsu.sh Closed source Extrait de « How-To SU »

Slide 92

Slide 92 text

 Gratuit (option « Pro » ≤ 5%)  5 ans de développement  Large support de devices SuperSU Interrogations

Slide 93

Slide 93 text

 Gratuit (option « Pro » ≤ 5%)  5 ans de développement  Large support de devices  Septembre 2015 : acquisition par CCMT (Coding Code Mobile Technology) LLC  « They have invested in, or own, a number of popular root apps (though I am not at liberty to disclose which ones) » - ChainFire  Enregistée dans le Delaware (US) mais WHOIS chinois et offres d’emploi à Pékin ? SuperSU Interrogations

Slide 94

Slide 94 text

Installations « one-click » : King Root, One-click root, KingoRoot  Adressées aux néophytes :  Solutions en 1 clic !  Gratuites !  24/7 support !

Slide 95

Slide 95 text

Installations « one-click » : King Root, One-click root, KingoRoot  Adressées aux néophytes :  Solutions en 1 clic !  Gratuites !  24/7 support !

Slide 96

Slide 96 text

Installations « one-click » : King Root, One-click root, KingoRoot  Adressées aux néophytes :  Solutions en 1 clic !  Gratuites !  24/7 support !

Slide 97

Slide 97 text

Installations « one-click » : King Root, One-click root, KingoRoot  Adressées aux néophytes :  Solutions en 1 clic !  Gratuites !  24/7 support !

Slide 98

Slide 98 text

Privacy ? Malware ? Installations « one-click » : King Root, One-click root, KingoRoot  Adressées aux néophytes :  Solutions en 1 clic !  Gratuites !  24/7 support !  Excellent référencement  Toutes closed source

Slide 99

Slide 99 text

2008 2009 2010 2011 2012 2013 2014 Zinx Koush ChainsDD Résumé : Superuser / SuperSU / Magisk 2015 2016 2017 Superuser

Slide 100

Slide 100 text

2008 2009 2010 2011 2012 2013 2014 Zinx Koush ChainsDD Résumé : Superuser / SuperSU / Magisk 2015 2016 2017 ChainFire CCMT Superuser SuperSU ?

Slide 101

Slide 101 text

2008 2009 2010 2011 2012 2013 2014 Zinx Koush ChainsDD Résumé : Superuser / SuperSU / Magisk 2015 2016 2017 ChainFire CCMT phhusson topjohnwu Superuser SuperSU ?

Slide 102

Slide 102 text

 Fonctionnement du root Conclusion

Slide 103

Slide 103 text

 Fonctionnement du root  Implications sur la sécurité Conclusion

Slide 104

Slide 104 text

 Fonctionnement du root  Implications sur la sécurité  Importance d’une solution open-source Conclusion

Slide 105

Slide 105 text

 Fonctionnement du root  Implications sur la sécurité  Importance d’une solution open-source phh‘s Superuser goo.gl/4lWtqd Magisk goo.gl/2pYeie Conclusion

Slide 106

Slide 106 text

Merci à vous ! Questions ? Bruce Bujon – @HardCoding Slides : speakerdeck.com/perfectslayer/