Tracer un internaute en faisant abstraction de son adresse IP

J’ai précédemment écrit un article sur les méthodes de surveillance des activités d’un utilisateur en ligne, cet article avait pour but de vulgariser un maximum le phénomène pour qu’un novice d’internet puisse à peu près comprendre.

Mais pour être honnête je pense qu’un internaute un minimum consciencieux n’apprendrait rien à lire cet article. A vouloir trop vulgariser on perd de vue la nature même de la problématique qui est purement technique. Dans cet article je serais donc beaucoup plus technique.

Pour ma part j’avais écrit cet article sur des informations purement théoriques, je n’avais jamais vraiment cherché à tester ces méthodes pour pouvoir comprendre l’ampleur du problème.

J’ai donc voulu mettre en place une application me permettant de voir à quel point il est possible de tracer un internaute.

La méthode que j’ai mis en place consiste à identifier de la manière la plus unique possible le comportement du navigateur de l’internaute en lui faisant faire plusieurs actions qui viseront à le différencier. Chaque navigateur de chaque internaute aura donc dans l’idéal une empreinte unique.

Description de l’application

J’ai développé une application avec pour but principal de me reconnaître en faisant abstraction de mon adresse IP, de mon user-agent, de mes cookies ainsi que de toute autres données facilement falsifiables. Le but étant à l’origine d’uniquement me tracer.

Cette application est composée d’un script Javascript pouvant s’exécuter de manière invisible sur une page web. Ce script récupère des informations sur l’internaute et les envois vers un script PHP hébergé sur un serveur local qui consignera les informations dans une base de données MySQL.

Une autre application permettra d’organiser de façon visuelle les informations présentes dans la base de données et d’associer plusieurs requêtes qui pourraient avoir été faites par le même internaute.

J’ai dans un premier temps était le seul à être tracé par cette application, puis une fois que j’ai obtenu des résultats concluant, d’autres volontaires ont accepté de participer.

Les informations récoltées

Il me fallait trouver quelles informations collecter pour pouvoir le plus efficacement identifier un internaute.

Toutes les informations sont récupérées à l’aide de Javascript.

Les dimensions de l’écran

On récupère la hauteur et la largeur de l’écran ainsi que la distance qui sépare le haut de la fenêtre du navigateur du haut de l’écran ainsi que la distance qui sépare la gauche de la fenêtre à la gauche de l’écran.

Ces informations peuvent être notamment utiles pour définir si un utilisateur est sur son mobile ou sur son PC.

Les dimensions d’une chaîne de caractère

On crée une balise HTML dans laquelle on écrit un texte bien définit sans préciser de taille d’écriture et de police, puis on calcule la largeur et la hauteur de cette balise et enfin on récupère le rapport largeur sur hauteur.

La balise canvas

Le canvas est une balise HTML dans laquelle il est possible de dessiner en utilisant Javascript.

La méthode est la suivante : on dessine et on écrit dans le canvas en donnant des instructions vagues (on peut par exemple ne pas préciser la police de caractère à utiliser). Puis on récupère la somme de contrôle de l’image généré (j’utilise MD5 mais des algorithmes plus légers comme CRC doivent théoriquement suffire).

Les polices de caractère disponible

Contrairement à Flash Player, il est impossible de récupérer une liste complète des polices de caractère installé sur l’ordinateur d’un internaute en Javascript.

Mais il est possible de savoir si une police est supportée par un navigateur en connaissant uniquement son nom.

On teste donc plusieurs polices sur l’ordinateur et on récupère le résultat de ces tests.

Vous trouverez plus de détails sur la méthode utilisée pour tester une police ici.

Les règles CSS supportées

Les quatre principaux moteurs de rendu CSS qui existent sont Blink (Chrome, Opera), Gecko (Firefox), Trident (Internet Explorer) et Webkit (Safari).

Ils ont chacun des règles CSS qui leur sont propres, j’ai donc dressé quatre listes contenant des règles CSS propres à chacun de ces moteurs.

On teste chacune de ces listes puis on récupère les résultats en pourcentage de règles supportées dans chacune de ces listes.

La valeur de la fonction getClientRects

Cette fonction Javascript permet de savoir la distance en pixel qui sépare une balise HTML des bords de l’écran.

La méthode consiste à écrire dans une balise HTML un texte contenant plein de caractères différents (dont des caractères spéciaux et des emojis), puis à l’aide de règles CSS lui donner une perspective 3D avec des valeurs à virgule flottante non arrondi. Puis récupérer la valeur de la fonction getClientRects sur cette balise.

Résultats

En me basant sur plusieurs centaines de requêtes récupérer, il est possible d’identifier sans aucun problème que deux requêtes ont été effectués par le même navigateur sur le même ordinateur, y compris en navigation privée.

Voici quelques requêtes présentent dans la base de données.
Quelques requêtes effectuées depuis Chromium sous Linux, Chrome sous Android ainsi que depuis des navigateurs Android utilisant le moteur de rendu web d’Android (webview).
Ces polices de caractères correspondent à Linux, en effet, des polices comme Georgia ou Comic Sans MS ne sont pas supportés par contre la police Gentium qui est présente dans la plupart des distributions Linux l’est.
En corrélant les valeurs de plusieurs requêtes il est possible de déterminer qu’elles ont été faites par le même internaute. La méthode de la somme de contrôle du canvas (Canvas checksum) ainsi que celle de la fonction getClientRects (CR checksum) apportent généralement la plus grande précision.

Conclusion

Il est donc possible d’identifier un internaute en faisant une totale abstraction de son adresse IP. C’est à dire que si vous utilisez de temps en temps un VPN pour naviguer sur internet il est très facile d’associer vos requêtes que vous effectuez sous VPN avec celle que vous faites sans. Croire que derrière un VPN on est anonyme est un mythe la méthode ci-dessus le démontre.

Comment se protéger ? Et bien la méthode la plus radicale consiste à désactiver Javascript, ou à utiliser le navigateur du projet TOR qui est optimisé pour contrer des méthodes de traçage en tout genre.

Une méthode moins extrême consiste à utiliser un navigateur web différent lorsque vous utilisez un VPN. Ainsi il ne sera pas possible d’associer les requêtes que vous effectuez sous VPN à celle que vous faites sans.