L'empreinte canvas au-delà des bases : pourquoi deux Chrome identiques rendent des pixels différents
Deux appareils avec les mêmes Chrome, OS et GPU rendent pourtant des pixels canvas différents. Pourquoi le rendu est non déterministe, pourquoi l'injection de bruit « privacy » produit l'effet inverse, et où le canvas s'inscrit aujourd'hui.
L'empreinte canvas est utilisée en production depuis 2012. L'idée est simple : demander au navigateur de rendre du contenu 2D, relire les pixels et les hacher. Des appareils différents produisent des pixels légèrement différents pour les mêmes instructions, et ces différences sont suffisamment stables pour identifier un appareil d'une session à l'autre.
Tout cela est bien connu. Ce qui l'est moins, c'est pourquoi la technique fonctionne — pourquoi des configurations logicielles identiques sur un matériel identique produisent malgré tout des sorties de pixels différentes. La réponse se situe à l'intersection des pilotes GPU, du rendu des polices et de l'arithmétique en virgule flottante.
Le pipeline de rendu n'est pas déterministe
Quand JavaScript appelle context.fillText("Cwm fjord bank glyphs vext quiz", 4, 45), Chrome ne rend pas les pixels lui-même. Il génère des instructions pour Skia — la bibliothèque graphique 2D — qui émet à son tour des commandes de dessin vers un backend accéléré par le GPU (généralement ANGLE sous Windows, Metal sous macOS, ou un fallback logiciel dans les conteneurs).
À chaque étape, de petites différences d'implémentation s'accumulent :
-
Le sous-système de polices de Skia sélectionne une famille de polices. Si Arial n'est pas installée, il se rabat sur une autre — et ce fallback varie selon les polices installées sur le système.
-
La police sélectionnée est rendue à la taille demandée par FreeType (sous Linux), DirectWrite (sous Windows) ou Core Text (sous macOS). Chaque bibliothèque a des algorithmes de hinting différents.
-
Le positionnement sous-pixel est appliqué. C'est là que des polices identiques commencent à produire des pixels différents — l'algorithme arrondit les positions à des décalages de pixel fractionnaires, et les règles d'arrondi diffèrent selon les plateformes.
-
Le texte rastérisé est composité sur le canvas. Le mélange est effectué par des shaders GPU sur les systèmes à accélération matérielle, et par du code CPU en mode fallback.
Chacune de ces étapes peut introduire des différences d'une ou deux valeurs de pixel. Individuellement invisibles. Collectivement uniques.
Les versions de pilotes GPU dominent l'empreinte
Deux machines Windows 11 équipées de puces Intel UHD Graphics 620 peuvent produire des sorties canvas différentes si leurs pilotes GPU diffèrent. Intel publie des mises à jour de pilotes plusieurs fois par an, et chaque mise à jour peut modifier le filtrage sous-pixel, la correction gamma et l'anticrénelage du texte.
Cela signifie que la stabilité de l'empreinte canvas est bornée par la fréquence des mises à jour de pilotes. Un utilisateur qui met à jour son pilote graphique — souvent silencieusement, via Windows Update — verra son empreinte canvas changer.
Les systèmes de détection gèrent cela en traitant l'empreinte canvas comme un signal parmi beaucoup d'autres, pas comme un identifiant autonome. Quand elle change mais que les autres signaux restent stables (empreinte TLS, renderer WebGL, fuseau horaire, polices installées), le visiteur est toujours reconnu.
Le rendu des emoji est une mine d'or
L'élément le plus identifiant d'une empreinte canvas n'est souvent ni le texte ni les formes, mais les emoji. Le rendu des emoji dépend de la police d'emoji livrée avec l'OS — Segoe UI Emoji sous Windows, Apple Color Emoji sous macOS, Noto Color Emoji sous Android.
Même au sein d'un seul OS, le rendu des emoji change d'une version à l'autre. Le rendu d'un emoji arc-en-ciel sous Windows 10 diffère de celui de Windows 11. Le visage souriant d'iOS 16 a un anticrénelage différent de celui d'iOS 17.
Les scripts d'empreinte canvas modernes rendent spécifiquement des séquences d'emoji incluant les ajouts récents à Unicode. Un visiteur qui prétend utiliser Safari sur iPhone mais ne peut pas rendre un emoji ajouté dans iOS 17 utilise un iOS plus ancien — ou ment sur sa plateforme.
Les frameworks d'automatisation produisent des empreintes distinctives
Chrome headless, exécuté dans un conteneur Docker sans GPU, utilise SwiftShader pour le rendu. SwiftShader produit des sorties canvas cohérentes en interne mais distinctes de n'importe quel Chrome à accélération matérielle.
La signature est reconnaissable : un anticrénelage inhabituellement propre, des valeurs de couleur spécifiques dans les régions de dégradé, et des bords de texte qui ne correspondent à aucun pilote GPU connu. Une empreinte canvas qui correspond à « SwiftShader dans Chrome 124 dans un conteneur Linux » est presque certainement de l'automatisation — aucun utilisateur réel ne fait tourner un navigateur de cette façon.
Puppeteer-extra-stealth tente d'usurper la sortie canvas en interceptant toDataURL() et en renvoyant des données modifiées. Mais la modification introduit souvent ses propres artefacts — des motifs de bruit qui se répètent d'une session à l'autre, ce qui rend paradoxalement l'effort d'anti-empreinte plus détectable que de ne rien faire.
Pourquoi l'injection de bruit fonctionne mal
Les navigateurs centrés sur la vie privée comme Brave injectent du bruit dans la sortie canvas pour empêcher le suivi. L'idée est d'ajouter de petites variations aléatoires aux valeurs de pixels pour que le même appareil produise des empreintes différentes à chaque session.
En pratique, l'injection de bruit a trois problèmes :
1. Le bruit est lui-même une empreinte. Un visiteur dont la sortie canvas change à chaque chargement, mais dont les autres signaux restent identiques, est reconnaissable comme un navigateur à injection de bruit. C'est en soi identifiant.
2. L'algorithme de bruit est stable. L'implémentation de Brave produit des motifs de bruit spécifiques qui ne correspondent pas à la variance naturelle du rendu GPU. Les systèmes de détection peuvent distinguer les sorties canvas qui semblent artificiellement bruitées de celles qui semblent naturelles.
3. Les systèmes sophistiqués combinent les échantillons. Plusieurs rendus sur la même page, ou entre sessions, peuvent être moyennés. Si le bruit est faible, la moyenne converge vers l'empreinte déterministe sous-jacente.
Ce que capture l'empreinte canvas
Au-delà de la sortie visuelle évidente, l'empreinte canvas peut extraire plusieurs attributs de l'appareil comme effets secondaires :
Le temps de rendu — la durée du rendu du canvas révèle les capacités du GPU. Un poste de travail 4K avec un GPU dédié rend plus vite qu'un ordinateur portable de milieu de gamme.
Les métriques de texte — measureText() renvoie des largeurs exactes en pixels qui varient selon le rendu des polices. La largeur du texte peut servir d'empreinte même sans rendu.
Le support des opérations de composition — certains navigateurs ou configurations GPU prennent en charge des modes de composition étendus. Tester ce support révèle les frontières de capacité.
Les effets de filtre — les filtres de type CSS appliqués au canvas produisent des sorties différentes selon les GPU, en particulier les filtres blur et drop-shadow.
Où l'empreinte canvas s'inscrit dans une stack de détection
À elle seule, l'empreinte canvas n'est pas un identifiant robuste. Les pilotes changent. Les utilisateurs changent de navigateur. L'injection de bruit est courante dans les audiences soucieuses de leur vie privée.
Sa vraie force est celle d'un recoupement. Quand une session prétend être un utilisateur récurrent sur la base de cookies ou d'un login de compte, l'empreinte canvas agit comme un second signal — une correspondance avec l'empreinte historique confirme la prétention, une divergence signale une prise de contrôle de compte ou un détournement de session.
Pour la détection de bots, l'empreinte canvas excelle à attraper l'automatisation conteneurisée. Les utilisateurs réels ont de vrais GPU. Les vrais GPU produisent des signatures de rendu reconnaissables. Tout ce qui rend comme SwiftShader, ou comme un canvas mal usurpé, tombe dans la catégorie « presque certainement un bot ».
La technique de 2012 fonctionne toujours en 2026 pour la même raison : le rendu est déterministe par environnement mais presque impossible à usurper complètement. Chaque tentative de dissimulation laisse des traces de la tentative elle-même.