Connexion Premium

L’app de vérification d’âge de la Commission européenne présente de « grosses lacunes »

Des p'tits trous, des p'tits trous, toujours des p'tits trous

L’app de vérification d’âge de la Commission européenne présente de « grosses lacunes »

Présentée comme « techniquement prête », l’app de vérification d’âge de la Commission européenne n’a pas tardé à soulever chez certains chercheurs des questions sur sa sécurité. Leurs découvertes sont pour le moins embarrassantes, même si le champ des attaques possibles est limité. Pour Olivier Blazy, contacté par Next, « les grosses lacunes ne mettent pas en danger directement les utilisateurs ».

L’application de vérification d’âge de l’Union européenne est « techniquement prête »… mais l’est-elle réellement ? Peu de temps après l’annonce d’Ursula von der Leyen du mercredi 15 avril, le chercheur en sécurité Paul Moore débusquait des vulnérabilités dans le code de l’app, disponible en open-source sur GitHub.

Des trous dans les bonnes pratiques de sécurité

Durant la configuration, l’application (testée sous Android) demande à l’utilisateur de créer un code PIN, ce qui jusque-là n’a rien d’anormal. Ce code est ensuite chiffré puis stocké dans un fichier local. Pour Paul Moore, ce code n’a aucune raison d’être chiffré car il n’est pas censé être récupérable : en cas de perte, il faut en créer un nouveau. L’app devrait normalement stocker une empreinte irréversible (hash).

Autre gros défaut de cette application : le code PIN sert juste de verrou local, il n’est pas techniquement attaché aux données qu’il protège. Un attaquant ayant accès au smartphone peut aller dans le fichier de configuration, supprimer les valeurs liées au code, relancer l’app et créer un nouveau PIN. Cela lui permettra d’accéder à l’identité d’un autre utilisateur. 

Captures d’écran : Paul Moore

Une démonstration confirmée dans une démo vidéo par Baptiste Robert, hacker éthique et patron de Predicta Lab. L’application intègre également une option permettant de désactiver l’authentification biométrique. En modifiant la valeur (de true à false), il est en effet possible de contourner complètement cette étape.

Faut-il pour autant prendre ses jambes à son cou ? « L’attaque la plus crédible, c’est votre neveu qui prend votre smartphone, il ne connait pas le code PIN, mais il existe malgré tout un moyen pour qu’il puisse utiliser votre vérification », explique Olivier Blazy, professeur à l’École polytechnique ayant notamment travaillé avec la CNIL sur un démonstrateur de vérification de l’âge en ligne. Il tempère : « C’est un peu limité comme champ d’attaque. »

Il reste 62% de l'article à découvrir.

Cadenas en colère - Contenu premium

Soutenez un journalisme indépendant,
libre de ton, sans pub et sans reproche.

Accédez en illimité aux articles

Profitez d'un média expert et unique

Intégrez la communauté et prenez part aux débats

Partagez des articles premium à vos contacts

Commentaires (32)

votre avatar
"Plus d'excuses", qu'ils disaient
votre avatar
Elle est téléchargeable où cette application ?? Il y a un lien direct vers l'APK sur github?? Ou dans le Google Play??
Je n'ai rien trouvé.
votre avatar
Si quelqu'un peut m'expliquer en pratique pourquoi pour un code à 6 chiffres il vaut mieux hasher que chiffrer je suis preneur.

Dans les deux cas, la façon la plus simple de retrouver le code PIN à partir du hash, reste une table de correspondance d'un million d'entrée ?
votre avatar
Si je dis pas de connerie, le chiffrement peut être déchiffré. Le Hash non.

Sauf table de correspondance effectivement mais normalement tu "Sel" ton Hash pour éviter ça.
votre avatar
L'utilisation d'un hashage du code pin auquel on a ajouté un sel permet d'éviter justement de pouvoir retrouver le pin original à partir d'une table de correspondance. Le sel est simplement une chaine aléatoire qu'on ajoute au code pin lors du hashage pour augmenter le nombre de possibilités de hash, et rendre une éventuelle table de correspondance trop grande. C'est la méthode recommandée pour le stockage de mots de passe comme des codes pin.
votre avatar
Sauf que le sel est disponible localement pour pouvoir comparer le hash du code pin saisi avec celui qui est stocké.
Pour 1 000 000 de possibilités, c'est assez rapide de trouver le bon code. C'est juste un peu plus long que déchiffrer le code pin chiffré.

La question d' @aureus me semble pertinente.
votre avatar
+1

Quand j'étais étudiant, un prof avait mis en ligne une plateforme totalement gérée via la DB (CouchDB à l'époque) pour qu'on puisse uploader nos projets. Le mot de passe par défaut c'était notre date de naissance (6 chiffres) et toute la base était accessible en lecture seule, l'écriture était limitée à une authentification, il me semble.
Bah j'ai pu bruteforcer tous les mots de passes (sauf celui d'un petit malin qui était parti le changer :-p ) en un temps relativement court.
votre avatar
En général, pour éviter le bruteforce, on ajoute des contraintes supplémentaires : par exemple, si 3 saisies successives invalides du code pin, on bloque le compte pour une durée donnée (10 minutes par exemple). Ça permet de ralentir l'attaquant : si on ne peut plus faire que 3 essais toutes les 10 minutes, le temps nécessaire pour tester le million de possibilités de code pin à 6 chiffres passe de quelques minutes à plusieurs jours/mois/années.
votre avatar
La solution n'est-elle pas que le sel ne soit pas disponible localement ? Voire qu'il soit lui même salé par une variable propre au terminal utilisateur ?
votre avatar
Le sel est bien disponible localement, et si l'attaquant le récupère, il peut générer une rainbow table pour chaque sel. Mais générer une rainbow table prend un peu de temps, et s'il faut la regénérer pour chaque sel qu'on a récupéré, ça ralentit/complexifie les choses.

L'algo de hashage est également à considérer : il existe des algos de hashage qui sont conçus pour prendre du temps pour calculer un hash. Si calculer chaque hash prend 100ms, le calcul d'une rainbow table à 1 million d'entrée (pour un code pin à 6 chiffres) prend un peu plus d'une journée.

Après, de toute façon si la seule chose qui protège l'accès c'est un code pin à 6 chiffres, on voit vite les limites en terme de sécurisation...
votre avatar
, il peut générer une rainbow table pour chaque sel. Mais générer une rainbow table prend un peu de temps, et s'il faut la regénérer pour chaque sel qu'on a récupéré, ça ralentit/complexifie les choses.
Cela n'a surtout aucun intérêt ! On ne calcule pas une rainbow table pour casser un seul mot de passe (ou ici, PIN). Cela ne sert absolument à rien.

Une table n'est utile que si on n'a plusieurs (généralement, beaucoup) de mot de passe à "craquer". Si on en a qu'un, autant faire un brut force classique. Plus simple, et plus efficace.
votre avatar
On est d'accord, je me contentais de pousser jusqu'à l'absurde le raisonnement initial sur l'utilisation de rainbow tables pour des hash de code pins salés :)
votre avatar
Simplement car la fonction de hash n'est pas mathématiquement conçu pour être réversible. C'est-à-dire que connaissant le hash il est très difficile de de trouver le message originel.

Un chiffrement d'un code pin impliquerait de deux voir stocker deux informations : La clé ayant servit au chiffrement, et le résultat du chiffrement. Ce qui implique de devoir stocker de manière trés sécurisée à la fois la clé et le résultat du chiffrement. Car si les deux sont compromis, il est évidemment très facile de retrouver le mot de passe.

A contrario, une fonction de hashage ne prend qu'une entrée correspondant au mot de passe, et par une série de décalage de bits, rotations, et autres joyeusetés te produit une sortie unique (en théorie). Mais cette étape de transformation mathématique n'est pas réversible (en théorie). Dès lors, stocker un mot de passe sous cette forme revient à simplement stocker son hash. S'il est compromis, ce n'est pas très grava car la conversion du hash vers le message d'origine est très lourd en temps de calcul.

Ainsi c'est plus safe que de chiffrer, car pas besoin d'une clé à stocker en plus (et ceux de manière sécurisée) et deuxième le hash est prévu pour être facile à calculer dans le sens du mot de passe -> hash, mais dans le sens inverse rendant sa compromission coûteuse pour l'adversaire.

Après il faudrait discuter des algorithmes, des dérivations, du sel (comme mentionné par @Raikiwi avec la table de correspondance (rainbow table dans le jargon) et @ray_lifequest ), du poivre... Mais c'est l'idée.
votre avatar
Pour le cas particulier d'un code à 6 chiffres, je ne vois guère d'intérêt effectivement, une attaque par force brute étant largement faisable, ce dont ni le chiffrement, ni le hashage protège dans ce cas.

En général par contre, c'est effectivement ce qui est recommandé, pour éviter de pouvoir remonter au mot de passe originel et garantir que les responsables même de l'application ne puissent pas récupérer le mot de passe (c'est une sécurité supplémentaire pour les utilisateurs).

A retenir donc : pour la généralité, c'est hashage (avec sel au minimum) et non chiffrement.
votre avatar
Est-ce qu'on peux pas ajouter une bonne dose de PBKDF2 histoire de ralentir les attaques par force brute ? (ya ptet mieux remarque comme méthode)
votre avatar
Si on peut. C'est même prévu pour ce cas d'usage.
votre avatar
Le sous-titre 😅.

Sérieusement, en l"état, faut pas l'utiliser ce truc.
votre avatar
Le sous-titre 😅.
🎶♫ Un trou de classe européenne ♬🎵
votre avatar
Ben en l'état c'est sur mais au moins ça va dans le bon sens.
Par contre qu'il y ai besoin qu'une personne externe pointe les défauts de sécurité de l'app c'est quand même abusé.

Secure by design qu'il disait... :windu:
votre avatar
Plus un MVP qu'autre chose, on dirait.

Cela dit, l'avantage que l'application soit en open source, c'est qu'elle a permis ce genre d'audit plus facilement. Un bon point pour la transparence.
votre avatar
Je me permets de rappeler que, lorsqu'on parle de hash pour stocker des mots de passe, on ne fait pas référence aux SHA, mais à la famille des KDF (Argon2, scrypt, bcrypt, PBKDF2).
Ces algorithmes présentent plusieurs avantages :

  • ils sont plus coûteux à calculer

  • ils nécessitent l'ajout d'un sel



Pour plus d'information : https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
votre avatar
SHA existe aussi dans les KDF e.g., PBKDF2-HMAC-SHA256 (il me semble que c'est celui de bitlocker d'ailleurs).
votre avatar
Merci à Next de mettre un peu de sérieux dans ce bad buzz fallacieux.

Il est dit "un attaquant ayant accès au smartphone peut aller dans le fichier de configuration, supprimer les valeurs liées au code", donc l'attaquant doit avoir le phone, et pouvoir éditer un fichier sur la partition système.
Chose possible que si on est root.
Et on peut empêcher une appli de se lancer sur un appareil modifié (avec un root par exemple) en utilisant l'API PlayIntegrity, qui est (quasi) impossible à contourner (beaucoup d'applis bancaires, ou même Google Pay, l'utilisent).

Donc quand ils se défendent et disent "c’est un SDK, un embryon pour que les pays développent ensuite leurs propres apps", eh bien c'est vrai.
Chaque État va proposer sa propre version, et surement y intégrer PlayIntegrity, car les applis sensibles (sérieuses) l'intègrent toutes.

Bref, moi aussi mes applis Android vous pourriez en faire ce que vous voulez si vous avez accès en écriture sur la partition système. Mais je peux me protéger avec PlayIntegrity.
votre avatar
Je vais reposer une question stupide mais je crois que tu n'as pas besoin d'être root pour accéder a com.example.app/shared_prefs/ non ?
votre avatar
Le chemin complet est : /data/data/package_name/shared_prefs/xxxx.xml
Et le dossier "data" n'est accessible que si on est root 🙂
votre avatar
Moi j'ai énormément de mal avec PlayIntegrity car c'est vraiment un truc créé parce que le créateur de l'app et Google ne font pas confiance au propriétaire de l'appareil et interdit certains usage "pour notre bien".

Et ça, désolé, c'est non.
Que ce soit soumis à une validation utilisateur, que le boot demande confirmation (voire un code PIN) , OK.

Mais interdire le root, c'est admettre que l'algo est faillible et qu'on joue la carte de l’obscurité. Ça achète du temps avant que qu'un hack ne trouve une faille et ça incite à la complaisance.
Outre le fait que c'est remettre à un acteur étranger la possibilité d'utiliser les applis (et un jour le tél ?) puisque Play Integrity échange un token avec un serveur google - serveur qui, si injoignable, implique que le test échoue, ça favorise aussi l'obsolescence programmée lorsque au bout de 2/3 ans les constructeurs arrêtent les mises à jour, et sans possibilité de le reflasher c'est une brique.


J'ai pas ce souci pour des téléphones pro où je ne suis pas administrateur, comme pour mon PC pro managé par l'IT de ma boite où , idem, je ne peux pas aller farfouiller partout.
Mais c'est pas mon PC (Et l'IT de la boite , elle , peux intervenir).

Là, à ce que je sache, je ne loue pas un téléphone à Samsung ni Google, ni Orange ni personne.

l'hégémonie n'est jamais une bonne chose, or là entre Apple et Google , bah on a pas le choix (c'est pas demain la veille que ni l'EU, ni les banques développeront une app pour Ubuntu Touch ou PostmarketOS).
votre avatar
C'est pas a cause de playintegrity qu'il y a une hégémonie de Google et Apple cela dit...

Ils ont juste été meilleurs que les autres, dans un bon timing, maintenant la course est terminée. Et les banques ne feront jamais des appli pour moins de 1% des utilisateurs.
Windows Phone, blackberry Os, Bada, firefox Os, Symbian, Ubuntu touch, /e/ OS, Sailfish... La liste est longue.
votre avatar
C'est pas a cause de playintegrity qu'il y a une hégémonie de Google et Apple cela dit...
Non bien sur, par contre c'est un des multiple moyens d'asseoir la position de Google.
Et les banques ne feront jamais des appli pour moins de 1% des utilisateurs.
Un des soucis est que tu commences à avoir certaines banques qui ne permettent même plus un accès par une autre méthode (y compris web) , ou qui oblige à avoir un smartphone pour certaines opérations. On en a déjà parlé bien des fois ici..

Alors oui je comprends les dev de ces applis : Moins de plateformes c'est moins de boulot, et même 2 plateformes c'est 1 de trop déjà (heureusement que des frameworks existent pour mutualiser le dev) , surtout en embrassant la promesse de Google : "Ne vous inquiétez pas notre plateforme est sécurisé, sécurisé je vous dit !" .
Windows Phone, blackberry Os, Bada, firefox Os, Symbian, Ubuntu touch, /e/ OS, Sailfish... La liste est longue.
Pas si longue si l'on élimine les OS qui ont été officiellement abandonnés.
Pour moi /e/OS n'en fait pas partie car c'est un Android , comme lineage & co.
Donc Ubuntu Touch, Sailfish, Postmarket... j'en connais pas d'autre.
Mais de toute façon, sans une couche de virtualisation pour les app existantes c'est inutilisable en tant que smartphone au sens où on l'entends actuellement.
votre avatar
Playintegrity est un moyen de sécurisation, iOs et Android n'ont plus vraiment besoin d'asseoir leur position. La messe est dite depuis un moment je pense...

Oui c'est un sujet récurrent. Le secteur bancaire est aussi l'un des domaines les plus sécurisé, donc on peut comprendre qu'en réduisant la voilure, ils réduisent aussi les risques, sans trop s'embêter et en réduisant les coûts.
votre avatar
Je dis ça comme ça mais mon tel sous /e/os et sans GooglePlay lance sans souci les applis de banque.
votre avatar
J'ai aussi un téléphone sous /e/OS.
Certaines appli marchent avec MicroG, d'autres non (je pense à l'identité numérique et France Connect). Pour les banques ça dépends effectivement des apps de banques - la mienne marche par exemple (Nickel) mais j'ai dû abandonner Boursorama à cause de ça.

J'ai testé mon tel avec PlayIntegrity API Checker, et j'ai un fail sur les 3 niveaux:

  • Basic_Integrity

  • Device_Integrity

  • Strong_Integrity



Plus PlayIntegrity va se répandre (poussé par Google dans leurs docs & API) plus ça va devenir un problème pour moi.
votre avatar
Je suis root aussi, et PlayIntegrity me rend la vie super difficile.
Je suis obligé de passer par le site web de Boursorama, par exemple.

Et je suis 100% d'accord avec ton avis sur cette API : le phone nous appartient, et on ne devrait pas dépendre du bon vouloir d'un serveur géré à l'étranger.

Mais bon, comme a dit dvr-x : c'est foutu, la bataille est perdue d'avance.