![](https://www.developpez.com/images/logos/securite2.png)
Motivations
Après que les titres aient attiré mon attention, j'ai commencé à faire de la rétro-ingénierie sur une copie de l'APK que j'ai trouvé sur internet (oui, « RabbitOS » est juste une application fonctionnant en mode kiosque sur Android 13 AOSP). Il n'y a pas de « modèles d'IA locaux » ou quoi que ce soit de ce genre, donc une fois que vous comprenez l'API qu'il utilise pour parler au Cloud, vous pouvez remplacer le matériel Rabbit R1 par un petit script Python. J'ai fait de la rétro-ingénierie de leur API, et j'ai écrit mes conclusions (ce n'est rien de très excitant, juste du JSON sur une websocket).
Il y a environ une semaine, j'ai acheté un R1 sur eBay pour 122 livres sterling (ce qui est toujours bien plus que ce qu'il vaut objectivement). Alors pourquoi l'ai-je acheté en toute connaissance de cause ?
Eh bien, dans les mises à jour ultérieures de l'application, ils ont commencé à obscurcir leur code, et je l'ai pris personnellement ! J'adore le jeu du chat et de la souris (ou de la tortue et du lièvre ?), et le jeu était lancé. Quels sont les secrets qu'ils essaient de me cacher ?
Ils utilisent un obscurcisseur commercial, et pour être honnête, il est plutôt bon, ce qui rend mon approche purement statique fastidieuse. J'ai donc décidé qu'il était temps d'avoir une R1 en main, pour la manipuler. Oui, j'avais déjà compris l'API, mais je ne voulais pas être exclu des futures mises à jour. Non pas parce que je tiens particulièrement à pouvoir interroger les médiocres API de Rabbit, mais parce que c'est ma fierté qui est en jeu.
De plus, je n'avais jamais examiné la sécurité de démarrage d'un appareil Android moderne auparavant, c'était donc une occasion d'apprentissage intéressante sur ce front.
Au cours de mon analyse statique de leur code obscurci, j'ai noté une logique permettant de détecter des outils d'analyse standard tels que Magisk et Frida (s'il était détecté, il refuserait de s'exécuter). J'allais donc probablement devoir développer mon propre outil. Amusant ! Bien sûr, je pourrais essayer de contourner leurs détections anti-analyse, mais c'est beaucoup moins amusant. Le code obfusqué prend également des mesures pour vérifier qu'il s'exécute sur un R1, par opposition à n'importe quel autre appareil Android, et je pourrais usurper ou patcher ces vérifications, mais cela devient ennuyeux (et tend à ne pas être une approche à l'épreuve du temps).
Pousser la charge utile
J'ai commencé à écrire mon propre logiciel client USB en Python, non pas parce qu'il y a quelque chose de mal avec mtkclient (qui implémente déjà tout ce qui est nécessaire) mais parce que je voulais m'assurer que je comprenais tout autant que possible. Une fois que j'ai réussi à le faire fonctionner, j'ai décidé de le porter sur js/WebSerial, juste pour le plaisir.
Et maintenant, j'ai une page web qui peut jailbreaker un Rabbit R1 physiquement connecté.
Dans l'esprit des jeux de mots terribles sur le thème du lapin, j'ai nommé le jailbreak « carroot ».
Au démarrage, ça ressemble à ça :
Une fois qu'il aura démarré, nous pourrons nous connecter et jeter un coup d'œil rapide :
Code : | Sélectionner tout |
1 2 3 4 5 | $ rlwrap nc 192.168.0.69 1337 # id uid=0(root) gid=0(root) groups=0(root) context=u:r:rootkit:s0 # getprop ro.boot.verifiedbootstate green |
Le domaine SELinux privilégié « rootkit » est configuré dans le cadre de flashable-android-rootkit.
Constatations
Alors, qu'est-ce qu'ils essayaient de nous cacher ?
Pour être honnête, je n'ai encore rien trouvé de particulièrement intéressant. L'analyse ne fait que commencer ! Si je partage mon jailbreak, c'est en grande partie dans l'espoir que d'autres personnes se joindront à moi dans mon analyse.
Ce que j'ai remarqué, c'est qu'ils enregistraient tout dans des fichiers texte sur le stockage interne :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | :/storage/emulated/0 # ls -al ./Android/data/tech.rabbit.r1launcher.r1/files/logs/ total 7140 drwxrws--- 2 u0_a66 ext_data_rw 4096 2024-07-07 00:52 . drwxrws--- 3 u0_a66 ext_data_rw 4096 2024-07-04 22:11 .. -rw-rw---- 1 u0_a66 ext_data_rw 671954 2024-07-05 01:37 2024-07-01.log -rw-rw---- 1 u0_a66 ext_data_rw 1472020 2024-07-04 23:40 2024-07-04.log -rw-rw---- 1 u0_a66 ext_data_rw 782800 2024-07-06 16:45 2024-07-05.log -rw-rw---- 1 u0_a66 ext_data_rw 1747449 2024-07-07 00:52 2024-07-06.log -rw-rw---- 1 u0_a66 ext_data_rw 2565224 2024-07-07 03:47 2024-07-07.log |
Mais en y regardant de plus près, et en y réfléchissant plus profondément, les choses sont devenues inquiétantes.
Ces enregistrements comprennent :
- Vos positions GPS précises (qui sont également envoyées à leurs serveurs).
- Le nom de votre réseau WiFi.
- Les identifiants des tours de téléphonie mobile à proximité (même si aucune carte SIM n'est insérée, ces identifiants sont également envoyés à leurs serveurs).
- Votre adresse IP orientée vers l'internet.
- Le jeton d'utilisateur utilisé par l'appareil pour s'authentifier auprès de l'API de Rabbit.
- Les MP3 codés en base64 de tout ce que le Rabbit vous a dit (et leur transcription textuelle).
Cette situation est préoccupante pour les raisons suivantes : il n'est tout simplement pas nécessaire d'enregistrer autant de données de manière aussi détaillée :
- Il n'est tout simplement pas nécessaire d'enregistrer autant de données avec autant de détails, en particulier sur un appareil qui ne dispose pas d'une sécurité matérielle digne de ce nom. Je n'ose imaginer ce qu'ils enregistrent aussi du côté du back-end !
- Il n'existait aucun moyen pour l'utilisateur final de réinitialiser l'appareil en usine, ce qui rendait les enregistrements permanents. Si l'on ajoute à cela le fait que les marchés d'occasion sont très actifs, on obtient la recette d'un désastre. Il n'y a même pas de bouton « déconnexion » sur l'appareil !
Heureusement pour la personne à qui j'ai acheté mon R1, je l'ai réinitialisé en utilisant mtkclient avant de faire quoi que ce soit avec.
Heureusement pour tous les autres, la dernière mise à jour de RabbitOS (v0.8.112) a corrigé ce problème alors que j'étais en train d'écrire cet article. Ils ont réduit la journalisation et ajouté une option de réinitialisation des paramètres d'usine !
C'est la première fois que je vois Rabbit être un tant soit peu proactif en ce qui concerne les problèmes de confidentialité et de sécurité des utilisateurs, plutôt que de simplement réagir aux articles de presse écrits à ce sujet.
Je n'ai pas pris la peine de le signaler en tant que problème de sécurité, tout d'abord parce que je n'avais pas pleinement réfléchi aux conséquences à ce moment-là, et ensuite parce que je ne m'attendais pas à être pris au sérieux par l'entreprise, sur la base de ses réponses antérieures aux problèmes de sécurité. J'étais également préoccupé par le développement de mon outil de jailbreaking ! Je suppose que quelqu'un d'autre leur a signalé le problème et je dois admettre que j'ai été positivement surpris par leur réponse. J'espère que cela marque un pas dans la bonne direction en ce qui concerne leur attitude vis-à-vis des problèmes de sécurité. En tout cas, ils ont fait paraître le problème plus grave qu'il ne l'est en réalité, plutôt que d'essayer de le minimiser.
Il serait évidemment préférable qu'ils n'enregistrent jamais ces informations, mais cela fait partie de l'état d'esprit « aller vite et pulvériser des informations confidentielles partout » que nous attendons de l'industrie technologique moderne.
Cela réaffirme ma conviction que les consommateurs devraient avoir la possibilité d'inspecter et de modifier le code qui s'exécute sur les appareils qu'ils possèdent. Lorsque ces capacités sont refusées par un fournisseur, je prends des mesures pour rectifier la situation.
![:fleche:](https://www.developpez.net/forums/images/smilies/fleche.gif)
Source : David Buchanan
Et vous ?
![:fleche:](https://www.developpez.net/forums/images/smilies/fleche.gif)
![:fleche:](https://www.developpez.net/forums/images/smilies/fleche.gif)
![:fleche:](https://www.developpez.net/forums/images/smilies/fleche.gif)
![:fleche:](https://www.developpez.net/forums/images/smilies/fleche.gif)
![:fleche:](https://www.developpez.net/forums/images/smilies/fleche.gif)