Hier soir, j'ai découvert un problème de sécurité sur l'app Elyze (numéro 1 des stores en France cette semaine) qui m'a permis d'apparaître comme candidat à la présidentielle sur le téléphone de plusieurs centaines de milliers de français.
Je vous explique ce qui s'est passé ⤵️
Ça fait plusieurs jours que l'appli est sous le feu des critiques car le code n'est pas open source et plusieurs bugs y ont été relevés :
- En cas d'ex aequo, l'application favorise Emmanuel Macron
- Parfois, l'ordre affiché ne correspond pas au pourcentage
Convaincu que ces problèmes ne proviennent pas d'une intention malveillante des créateurs de l'appli, j'ai décidé d'utiliser mes compétences en reverse engineering pour trouver l'origine des bugs et en faire un article.
Après avoir chargé l'appli dans mon outil de décompilation Android (j'utilise JADX), je vois que le cœur de l'application est quasiment vide alors que je devrais y trouver un paquet de fichiers Java.
En fait, comme plein d'applis récentes, Elyze est codé avec React Native, un framework JavaScript qui permet de publier la même appli sur Android et iOS sans avoir à la coder deux fois dans les langages respectifs de ces plateformes.
Tout le code de l'appli se retrouve dans un unique fichier de 9MB. Pour prendre moins de place le code est minifié, c'est à dire que la plupart des variables ont des noms très courts et les retours à la ligne sont retirés.
Autrement dit, c'est illisible.
Dites vous aussi que 9MB peut sembler assez peu, mais ici on travaille avec du texte : si le code devait être imprimé sur papier, ça prendrait 3000 pages !
Evidemment, seule une toute petite fraction est écrite par la team Elyze, le reste sert au fonctionnement de React Native.
En faisant des recherches, on tombe rapidement sur la liste qui nous permet de trouver le bug mettant toujours Macron en premier sur les ex-aequo : comme JavaScript utilise un algorithme de tri stable, en cas d'ex-aequo c'est l'ordre original dans la liste qui est retenu.
L'autre bug m'a tenu éveillé pendant de longues heures, et le code illisible combiné à mon allergie au JavaScript ne m'a pas permis de comprendre ce comportement inattendu.
Mais dans mes recherches, j'ai plusieurs fois été attiré par quelque chose du coin de l'oeil.
Pour échanger des données avec le serveur, Elyze utilise principalement une base de données GraphQL qui semble contenir toutes les infos sur les propositions des candidats ainsi que les données utilisateur.
L'URL de la base de données se trouve aussi quelque part dans le code, avec un jeton d'authentification qui est le même pour tout le monde.
Avec l'outil GraphQLmap de l'ami @pentest_swissky, je récupère en deux commandes la structure de la base de données :
Avoir un accès direct à GraphQL n'est pas une faille en soi : certes, c'est mieux de passer par une API qui se charge des requêtes, mais si les permissions sont bien configurées on peut se débrouiller sans.
Mais le souci justement, c'est que les permissions étaient mal configurées. Tout ce qui touchait aux candidats était autorisé en lecture et en écriture, notamment la fonction permettant d'ajouter ou de modifier une proposition...
Les développeurs ont été réactifs pour rectifier ça (merci à @GuillaumeRozier et son carnet d'adresses immense) et j'ai passé une partie de la nuit à les aider, il n'y a pas eu à ma connaissance d'autre exploitation de cette vulnérabilité à des fins de manipulation politique.
Heureusement, les autres parties de la base de données n'ont pas été affectées : ça aurait été vraiment terrible d'avoir une fuite des données utilisateur (date de naissance, code postal, intentions de vote en 2017 et 2022, résultat de chaque swipe sur l'app)
On peut d'ailleurs se demander si l'engagement de confidentialité est bien respecté : à mon avis, la date de naissance et le code postal permettent assez facilement d'identifier une personne directement...
En résumé, le chemin d'attaque était relativement simple à exploiter :
- récupération du fichier .apk
- extraction du bundle.js
- récupération de l'endpoint GraphQL et de la clé API
- identification de la faiblesse de configuration
En tout, j'en ai eu pour environ 3 heures.
Pour conclure, je pense que les développeurs d'Elyze devraient rendre l'application open source.
On voit bien que la sécurité par l'obscurité n'empêche absolument pas les attaques, et la transparence algorithmique est nécessaire dans un contexte d'élections.
Ce thread reprend un peu d'activité aujourd'hui donc je me permets une mise à jour liée à l'actu :
Le créateur d'Elyze, qui s'est toujours revendiqué apartisan, vient de rejoindre le cabinet de la porte-parole du gouvernement. (Info Mediapart)
• • •
Missing some Tweet in this thread? You can try to
force a refresh
THREAD : TikTok a mis en place 8 protections pour éviter de fuiter 750GB de données par jour sur leur appli.
Je vais vous détailler comment contourner chacune de ces sécurités, et pourquoi j'ai besoin des données de plusieurs millions de créateurs de contenus.
Aujourd'hui avec @flefgraph et @clement_hammel, on lance officiellement notre agence d'analyse de réseaux sociaux, @agoratlas !
Vous avez sûrement déjà vu passer les études de Florent, notre objectif est de faire encore plus grand :
Bien sûr, la plupart des réseaux sociaux ont tout intérêt à ne pas ouvrir leurs bases de données immenses à n'importe qui, donc on doit passer par du scraping.
Le scraping est parfaitement légal, à condition d'être réglo sur la protection des données (on en reparle plus bas)
THREAD - Une immense avancée pour l'humanité : on a réussi à afficher Bad Apple et jouer à Doom sur une croix de pharmacie.
Petit complément technique à la vidéo de @Sylvqin pour vous montrer les coulisses du reverse-engineering de cet objet mystique.
Le socle de la croix de pharmacie est occupé par une carte de contrôle électronique relativement simple, entourée de composants d'électronique de puissance (mine de rien, 2560 LED ça consomme pas mal de watts)
Les composants ont résisté au temps et aux éléments, mais les gravures des puces ont quasiment disparu.
Heureusement, on peut les identifier grâce au circuit imprimé sur lequel figurent les références, et comprendre le layout de la carte :
J'en ai trop marre de voir des smicards pleurer pour qu'on augmente pas les impôts des millionnaires.
J'ai gagné un peu plus de 7000€/mois pendant plusieurs années, si tu te considères pas riche à ce niveau c'est du déni ou de la malhonnêteté. Thread ⤵️
J'aime pas trop parler d'argent ici parce que ça peut passer pour de l'orgueil, mais on voit tellement de conneries se propager en ce moment que je me suis senti obligé de partager mon expérience (je supprimerai probablement le thread d'ici quelques jours)
Commençons par "tu t'offres un ou deux resto par mois" : je mange au resto quasiment chaque midi en semaine.
Le soir j'aime bien cuisiner, jamais aucune hésitation avant de prendre des produits bio ou premium.
THREAD - les manipulations illicites du classement lors de la compétition la plus chère d'Europe.
Cette semaine, l'équipe de l'European Cyber Cup a trafiqué arbitrairement son scoreboard pour favoriser certaines équipes qui lui faisaient pression. 1/14
Je suis coach de 10 étudiant·es de @Guardia_School qui ont participé cette semaine aux épreuves de l'European Cyber Cup.
Cette compétition est organisée par le forum InCyber (anciennement FIC, qui a discrètement changé de nom à cause de quelques casseroles).
Le prix d'inscription n'est pas rendu public, mais en 2021 je me souviens que mon entreprise avait dû payer 10.000€ pour nous inscrire, sachant que le cash prize pour l'équipe gagnante est de 5.000€ 🙃
J'ai besoin de votre aide pour m'aider à entraîner l'équipe de France de cybersécurité !
Quelques détails ci-dessous, merci de partager au maximum 🙏
En janvier, j'ai eu l'honneur d'être nommé entraîneur des compétiteurs français en cybersécurité, pour la prestigieuse compétition WorldSkills qui opposera 65 pays cette année.
Contrairement aux excellentes compétitions FCSC/ECSC qui sont très orientées CTF, le challenge WorldSkills va plutôt demander des compétences métier, appliquées à des environnements réalistes.