Note : Cette documentation est une reconstitution de la bataille qu'a representé la mise en place de cette machine virtuelle. Certains éléments ne sont probablement pas assez détaillés, et il se peut que certaines étapes manquent complètement. Faire signe à Lunar au cas où une tentative de reproduction s'avérerait impossible.

Introduction

Notre banque, le Crédit Mutuel — suite à la directive sur les services de paiements 2 (dîte DSP2, ou UE 2015/2366) — nous a imposé l'usage d'une application Android pour obtenir l'accès à l'interface de gestion du compte.

Cela pose problème à nos pratiques collectives. Nous ne souhaitons pas limiter l'accès au compte à une seule personne. Par ailleurs, installer une telle application sur un mobile Android utilisé pour tout un tas d'autres choses nous paraît diminuer la sécurité par rapport à nos pratiques habituelles.

Par toutes ces raisons, nous avons dû trouver une astuce : installer une machine virtuelle Android, dans laquelle on installera l'application du Crédit Mutuel. Il suffira aux membres du C.A. de copier l'image de la machine virtuelle pour pouvoir disposer de l'application sur leur ordinateur.

On va également installer Orbot et AFWall+ afin d'obliger le trafic de l'application du Crédit Mutuel à passer par Tor.

Installation de la machine virtuelle

On aura utiliser libvirt et son interface virt-manager pour piloter la création de la machine virtuelle et son utilisation, mais d'autres solutions telles que VirtualBox devraient fonctionner pareil.

Android-x86 est une adaptation du système Android pour processeurs de la famille « x86 », les plus courants pour les ordinateurs portables et ordinateurs de bureau.

On utilisera la version 7.1. Les versions plus récentes ne fonctionnait pas correctement avec avec Orbot et AFWall+ d'après mes tests (janvier 2020). Le mode VPN de Orbot reste néanmoins pas fiable : les connexions Tor se retrouvent souvent elles-mêmes coincées par la couche VPN… On ne l'utilisera pas pour préférer la redirection via iptables contrôlée par AFWall+.

Il faut configurer la machine virtuelle avec un minimum 2 Go de mémoire vive. 10 Go d'espace disque semble aussi raisonnable.

La procédure d'installation est relativement simple à suivre. On utilisera ext4, puis GRUB, et /system en mode read-write.

Configuration de la machine virtuelle

Il faut ensuite répondre aux questions du premier assistant de configuration.

Pour la suite :

F-Droid

F-Droid est un « magasin d'applications » qui ne propose que des logiciels libres qu'on utilisera en priorité plutôt que le PlayStore.

  1. Installer F-Droid en téléchargeant l'APK sur f-droid.org.

  2. Autoriser le système à installer des paquets en provenance de sources externes.

  3. Activer le dépôt du Guardian Project dans la configuration des dépôts de F-Droid.

  4. Recharger les dépôts.

Orbot

Orbot est le client Tor pour Android.

  1. Installer Orbot via F-Droid.

  2. Désactiver le lancement automatique qui pose parfois des problèmes d'ordonencement au démarrage.

AFWall+

AFWall+ est un pare-feu pour Android. Il permet de filtrer quelles applications vont avoir accès au réseau et à quel réseau. AFWall+ permet également de forcer n'importe quelle application à passer par Tor.

  1. Installer AFWall+ via F-Droid.

  2. Activer le mode Tor dans les options.

  3. Afin de permettre de se connecter à la machine virtuelle via ADB, on va mettre dans les « custom scripts » :

    iptables -I INPUT -p tcp --dport 5555 -j ACCEPT
    iptables -I OUTPUT -p tcp --sport 5555 -j ACCEPT
    
  4. Autoriser :

    • (LAN) (Wi-Fi) (   ) (ntp) Internet time servers
    • (   ) (Wi-Fi) (Tor) Aurora Store
    • (LAN) (Wi-Fi) (   ) CaptivePortalLogin
    • (LAN) (Wi-Fi) (   ) F-Droid
    • (LAN) (Wi-Fi) (   ) Orbot

Aurora Store

Aurora Store est un « magasin d'applications » alterntif permettant d'accéder au PlayStore sans passer par Google.

  1. Installer Aurora Store via F-Droid.

  2. Autoriser Aurora Store à utiliser Wi-Fi et Tor dans AFWall+. (Si Google est trop pénible à cause de Tor, basculer en Wi-Fi seul).

Crédit Mutuel

L'application du Crédit Mutuel est l'objectif de toute cette histoire. Malheureusement, cela va être plus compliqué qu'un simple installation car l'application refuse normalement de s'éxecuter sur un système Android avec un accès « root ». Pour contourner cela on va patcher le code qui s'occupe de cette vérfication…

  1. Installer Crédit Mutuel via Aurora Store.

  2. (À faire seulement la première fois :) sur un ordinateur sous Debian/Ubuntu, va installer les outils nécesaires :

    sudo apt install openjdk-jre-headless adb apktool apksigner
    
  3. (À faire seulement la première fois :) afin de pouvoir signer notre version de l'application, créer une clé de signature :

    keytool -genkey -v -keystore nos-oignons.keystore -alias nos-oignons -keyalg RSA \
            -keysize 2048 -validity 10000 -protected false
    pass: nos-oignons
    
  4. Toujours sur l'ordinateur, on va récupérer l'archive de l'application via ADB :

    adb connect 192.168.122.205:5555   # adapter l'adresse IP à celle de la VM
    adb pull /data/app/com.cm_prod.bad-1/base.apk com.cm_prod.bad.apk
    
  5. On décompile ensuite l'application :

    apktool d com.cm_prod.bad.apk --no-res
    
  6. Il s'agit ensuite de trouver la modification à faire dans le code… D'abord, chercher où pourrait se trouver la fonction de vérification :

    rgrep 'bin/su' com.cm_prod.bad
    

    On s'aperçoit que cette chaîne est présente dans une méthode static qui instancie un objet et y change une valeur booléenne avant de sortir. Elle consigne également des explications dans ce même objet sur ce qu'elle a pu trouver comme éléments d'accès root… Donc essayons de lui faire toujours renvoyer « faux » le plus vite possible ?

    En regardant le début de la méthode, on voit que le code vient mettre 0x0 dans le registre v1 :

    .prologue
    const/4 v1, 0x0
    

    Puis, juste en-dessous, instanciation et initialisation de l'objet :

    new-instance v4, Lo/Lf$ˋ;
    invoke-direct {v4}, Lo/Lf$ˋ;-><init>()V
    

    Bon, bah super, on a qu'à se greffer juste en dessous. La modification finale devient :

    --- com.cm_prod.bad-old/smali/o/Lf.smali Lf.smali    2019-11-11 13:05:12.084531671 +0100
    +++ com.cm_prod.bad/smali/o/Lf.smali 2019-11-11 13:21:20.402726609 +0100
    @@ -210,6 +210,9 @@
    
         invoke-direct {v4}, Lo/Lf$ˋ;-><init>()V
    
    +    iput-boolean v1, v4, Lo/Lf$ˋ;->ˊ:Z
    +    return-object v4
    +
         .line 73
         const-string v5, "; "
    
  7. On peut maintenant recompiler l'application :

    apktool b com.cm_prod.bad -o com.cm_prod.bad-patched.apk
    
  8. Il faut la signer avant de pouvoir l'installer sur un système Android :

    apksigner sign --ks nos-oignons.keystore com.cm_prod.bad-patched.apk
    
  9. On profite d'adb pour faire l'installation de la nouvelle version :

    adb install com.cm_prod.bad-patched.apk
    
  10. Utiliser AFWall+ pour donner accès au réseau via Tor à l'application Crédit Mutuel.

Ça devrait être bon. Au démarrage il faudra commencer par démarrer Orbot, puis l'application Crédit Mutuel. Il est possible que le nœud de sortie choisi par tor soit bloqué par les serveurs du Crédit Mutuel. Dans ce cas, il faut jouer du redémarrage et du changement d'identité pour tomber sur un serveur autorisé.