Le root : un inconnu chez soi ?

Le root : un inconnu chez soi ?

Vous laisseriez le compte admin de votre laptop à un inconnu ? Ou même votre password Gmail ? Alors pourquoi tant d’utilisateurs installent le root sur leurs devices ?
Venez découvrir comment marche réellement ce hack, son évolution au cours des dernières années et ses implications un peu trop vite oubliées.

68965cf5515367665a3803e5ba59e184?s=128

Bruce BUJON

April 11, 2017
Tweet

Transcript

  1. Le root : un inconnu chez soi ? Bruce BUJON

    – AndroidMakersFR 2017
  2. Qui suis-je ? / $ whoiam  Architecte logiciel 

    Développeur Java  Hacker curieux Bruce BUJON PerfectSlayer @HardCoding
  3. Qu’est-ce que le root ?  Compte utilisateur  UID

    = 0 (User IDentifier)  Tous les droits et toutes les permissions Le « SuperUser »
  4. 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.
  5. 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)
  6. 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
  7. 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
  8. Démonstration du root $ adb shell gretprop ro.build.type userdebug ROM

    de développement
  9. 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
  10. 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
  11. Démonstration du root en production $ adb shell getprop ro.build.type

    user ROM de production
  12. 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
  13. 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
  14.  lunch <BUILD>-<BULDTYPE>  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
  15. 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
  16. $ 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)
  17. $ 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)
  18.  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)
  19.  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)
  20.  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)
  21.  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)
  22.  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
  23.  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
  24. Extrait de /system/code/adb/daemon/main.cpp Extrait de /system/code/adb/Android.mk Build type ROM cooking

    : Module adbd en production
  25. Comment s’approprier le compte root en production ?

  26. HTC Dream / G1  22 Octobre 2008 : Premier

    téléphone commercialisé sous Android
  27. 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. »
  28. 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. »
  29. Communauté du root  « How-to-root » sur XDA :

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

    Koush (Koushik Dutta) CyanogenMod ClockworkMod Cyanogen Inc CyanogenMod
  31. CyanogenMod  Créée en 2009  Rapidement de plus en

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

    plus populaire  Accès au root inclus Mais « sécurisé » !
  33. Superuser  Package OTA :  /system/app/Superuser.apk  /system/xbin/su Zinx

    (Christopher Lais) CyanogenMod Par la recovery
  34. 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
  35. com.myapp Superuser : Communications entre processus

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

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

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

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

    (4) socket + uid/gid/cmd Superuser : Communications entre processus
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45.  Processus 0 (root) 0 (root) 0 (root)  10042

    (u0_a42) /init zygote com.myapp Superuser : Résumé des processus
  46.  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
  47.  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
  48.  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
  49. 2008 2009 2010 2011 2012 2013 2014 Zinx Superuser :

    Historique
  50. 2008 2009 2010 2011 2012 2013 2014 Zinx ChainsDD (Adam

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

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

    (Adam Shanks) CyanogenMod Android 4.3 ! Superuser : Historique
  53. Plus de su depuis une application Plus de mount Android

    4.3 : Renfort de la sécurité
  54.  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
  55.  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
  56. 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
  57. 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
  58. SuperSU : Mise en place du service  Services lancés

    par init  Configuration : /init.rc  Dans la partition boot  Non (facilement) modifiable
  59. 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
  60. init SuperSU : Communications entre processus

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

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

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

    Communications entre processus
  64. com.myapp su (client) (3) su id su (démon) init (1)

    install-recovery.sh (2) socket SuperSU : Communications entre processus
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. 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
  72.  Processus 0 (root) 0 (root) 0 (root) /init su

    --daemon zygote SuperSU : Résumé des processus
  73.  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
  74.  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
  75.  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
  76.  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
  77. Modifications de la ROM détectées Plus d’OTA Android 4.4 /

    Android 5.0 : Verified boot & block-based OTA
  78. SuperSU : « systemless » root ChainFire boot / /init.rc

    /system /data /xbin/su /install-recovery.sh /app /data Operating System User data Kernel RAM disk
  79. 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
  80. 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
  81. 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
  82. Android 4.3 / 4.4 / 5.0 / 7.0 : SELinux

     Security-Enhanced Linux pour Android :  Amélioration du sandboxing
  83. ≤ 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
  84. ≤ 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
  85. Résumé : Complexité du « root »  Évolutions :

     Gestion des permissions + interactions utilisateur  Nouveau service Linux  Nouvelle partition  Support des règles de sécurité
  86. 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
  87. 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
  88. 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
  89. 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
  90. 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 »
  91. 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 »
  92.  Gratuit (option « Pro » ≤ 5%)  5

    ans de développement  Large support de devices SuperSU Interrogations
  93.  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
  94. Installations « one-click » : King Root, One-click root, KingoRoot

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

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

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

     Adressées aux néophytes :  Solutions en 1 clic !  Gratuites !  24/7 support !
  98. 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
  99. 2008 2009 2010 2011 2012 2013 2014 Zinx Koush ChainsDD

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

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

    Résumé : Superuser / SuperSU / Magisk 2015 2016 2017 ChainFire CCMT phhusson topjohnwu Superuser SuperSU ?
  102.  Fonctionnement du root Conclusion

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

  104.  Fonctionnement du root  Implications sur la sécurité 

    Importance d’une solution open-source Conclusion
  105.  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
  106. Merci à vous ! Questions ? Bruce Bujon – @HardCoding

    Slides : speakerdeck.com/perfectslayer/