Une discussion sur les problèmes de sécurité dans les navigateurs modernes
Les navigateurs sont le principal point de connexion entre les utilisateurs et leurs services. Il n’est donc pas surprenant qu’un effort considérable soit fait pour les sécuriser.
Il y a quelque temps, les navigateurs étaient défendus pour fournir plus de fonctionnalités aux développeurs afin de créer des expériences nouvelles et meilleures sur le Web. Ce sentiment a changé depuis que les géants de la technologie ont été exposés à la collecte d’informations sur les utilisateurs et au suivi de chaque action, même via différents sites Web.
Cette prise de conscience a déclenché une course aux armements entre les développeurs d’API de navigateur et les développeurs des scripts de suivi. Depuis lors, plus votre navigateur a de fonctionnalités et d’options, plus vous avez d’options pour suivre chaque utilisateur avec une granularité plus fine.
L’une des méthodes les plus simples de traçage d’un utilisateur consiste à stocker des données dans des cookies ou dans un stockage local. Tout ce que vous avez à faire est de mettre une valeur aléatoire suffisamment grande et l’utilisateur est suivi de manière unique.
Cela présente cependant quelques défis. Par exemple, ces données peuvent expirer et être supprimées après le redémarrage du navigateur ou la fermeture des onglets privés. De plus, dans les pays occidentaux, les utilisateurs doivent autoriser explicitement à être suivis par de tels moyens, ce qui peut rendre ces tentatives plutôt évidentes.
Un type de suivi qu’aucune de ces méthodes ne peut effectuer consiste à suivre l’emplacement réel des utilisateurs. De nos jours, de nombreuses personnes utilisent les VPN pour de bonnes raisons, et ils fonctionnent très bien pour vous donner un peu plus de confidentialité. L’un des problèmes est que cela pourrait fausser certaines statistiques sur l’utilisation de votre site Web et rendre plus difficile la sécurisation de vos sessions de navigation.
Supposons que vous vous connectez à votre site Web bancaire. Lors de la connexion, votre banque stocke votre adresse IP et peut même essayer de se rapprocher de votre emplacement. Soudain, une autre connexion apparaît avec votre jeton de session, mais cette fois-ci, elle vient de l’autre bout du monde. Il y a deux raisons plausibles à cela :
- Votre compte vient d’être compromis
- Vous venez de permettre à un VPN d’apparaître d’ailleurs
Que doit faire votre banque ? Interdire cette session et demander à l’utilisateur de se reconnecter. Cela pourrait rendre les VPN beaucoup plus gênants pour les gens à long terme. Autoriser la connexion ? Des dizaines de milliers de personnes sont concernées chaque année par de tels programmes, et ce supplément de sécurité aurait pu leur faire économiser beaucoup de temps, d’inquiétude et d’argent.
Avoir de vraies statistiques sur l’emplacement de l’utilisateur est un cauchemar pour la confidentialité, mais parfois, cela a le potentiel d’aider beaucoup. C’est pourquoi j’ai commencé à fouiller dans les API des navigateurs et à essayer de créer un tableau gargantuesque de tout le contenu qu’ils pourraient exposer aux développeurs.
Une de mes premières idées était : la disposition du clavier. Toutes les dispositions de clavier ne sont pas très utiles pour déterminer l’emplacement. Presque tous les développeurs utilisent la mise en page américaine dans le monde, mais cela donne un point de référence. Si quelqu’un s’est connecté en utilisant une disposition de clavier allemande et qu’une autre page s’est soudainement chargée deux secondes plus tard et qu’elle a une disposition hongroise, c’est en effet suspect.
À ma plus grande surprise, j’ai trouvé quelque chose d’encore mieux.
Intégrée à chaque navigateur moderne, il existe une API appelée Intl. Il s’agit de l’API d’internationalisation qui fournit des fonctions pour afficher des données personnalisées pour les coutumes linguistiques de chaque utilisateur. Par exemple, il a une classe nommée NumberFormat
qui formate les objets JavaScript de type Nombre à afficher selon les coutumes locales.
Intl.NumberFormat().format(3.6) // '3.6' or '3,6'
La « résolution » de cette métrique n’est pas assez élevée pour déterminer grand-chose sur l’utilisateur, donc après avoir creusé un peu plus, j’ai trouvé quelque chose de bien plus intéressant.
Fuseaux horaires.
Sur les systèmes modernes, ils ont renoncé à ce que les gens saisissent combien d’heures vous êtes décalé par rapport à CET ou UTC, par exemple. Ils vous demandent plutôt la capitale de votre pays ou une grande ville proche. Ces données peuvent être interrogées par le navigateur et transmises à notre code JavaScript avec cette seule ligne :
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone
Dans mon cas, cela revient Europe/Budapest
. Ce n’est pas tout à fait exact, mais vous pouvez voir comment, avec cette seule information, nous savons que notre utilisateur se trouve quelque part autour de Budapest, en Hongrie, en Europe. Si leur adresse IP qui nous est exposée provient d’une petite entreprise de télécommunications aux États-Unis, au Texas, cela pourrait déclencher quelques signaux d’alarme.
Comment pouvons-nous utiliser ces connaissances ?
J’ai préparé une courte démo sur mon GitHub pour que tout le monde puisse essayer :
Vous pouvez suivre les instructions et ouvrir la page, puis jouer et voir comment il essaie de prédire votre emplacement réel et si vous utilisez un VPN à ce moment-là. Changez votre emplacement et activez et désactivez votre VPN pour voir l’effet réel.
Les meilleures solutions aux problèmes sont généralement simples. Celui-ci est, en fait, très simple.
J’espère que vous avez appris quelque chose. Bon piratage !