Catégorie : Matériel / Rendu Bas Niveau
1. Description
L'empreinte GPU exploite le fait que le rendu graphique n'est pas identique au niveau du bit sur différents matériels. Le même code JavaScript produit différentes sorties de pixels sur différents GPUs en raison de :
- Microarchitecture GPU (nombre d'ALU, unités de rastérisation, TMU, ROP)
- Version du pilote et optimisations du compilateur de shaders
- Précision en virgule flottante dans les calculs de shaders
- Algorithmes d'anti-aliasing et leur implémentation
- Ordre de rendu subpixel (RVB vs BVR)
- Matrices de conversion d'espace colorimétrique
- Support de compression de texture
- Taille de texture maximale et autres limites matérielles
2. Vecteurs
2.1 Empreinte Canvas
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
ctx.font = '14px Arial'
ctx.fillStyle = '#f60'
ctx.fillRect(125, 1, 62, 20)
ctx.fillStyle = '#069'
ctx.fillText('Chaîne de test', 2, 15)
const hash = md5(canvas.toDataURL())
Entropie : ~5-7 bits (32-128 appareils distinguables)
Stabilité : Élevée — stable entre redémarrages du navigateur, modérée entre mises à jour du navigateur
2.2 Empreinte WebGL
const gl = canvas.getContext('webgl')
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')
// Modèle GPU exact :
const renderer = debugInfo.UNMASKED_RENDERER_WEBGL
// "NVIDIA GeForce RTX 3080/PCIe/SSE2"
const vendor = debugInfo.UNMASKED_VENDOR_WEBGL
// "NVIDIA Corporation"
Signaux WebGL supplémentaires :
- Hachage de rendu de scène WebGL (rendre une scène 3D, hacher les pixels)
- Précision des shaders (support et précision de highp, mediump, lowp)
MAX_TEXTURE_SIZE,MAX_VERTEX_ATTRIBS,MAX_VIEWPORT_DIMS(50+ paramètres numériques)- Liste d'extensions WebGL
Entropie : ~20-25 bits (rendu + extensions + limites)
Stabilité : Très Élevée — change seulement avec les mises à jour du pilote GPU
2.3 Empreinte WebGPU
const adapter = await navigator.gpu.requestAdapter()
const info = await adapter.requestAdapterInfo()
// { vendor: "nvidia", architecture: "ampere", device: "GA102", driver: "535.129.03", backend: "Vulkan" }
// adapter.limits contient 50+ capacités numériques
// adapter.features contient ~30+ drapeaux de fonctionnalités
Entropie : ~30+ bits (info adaptateur + limites + fonctionnalités)
Stabilité : Très Élevée — verrouillé au matériel
3. Forces de l'Attaquant
| Force | Explication |
|---|---|
| Verrouillé au matériel | L'empreinte GPU ne peut pas changer sans remplacement matériel |
| Multi-navigateur | Le même GPU produit des empreintes similaires sur Chrome, Firefox, Edge |
| Passif | Ne nécessite aucune interaction utilisateur, fonctionne en arrière-plan |
| Aucune dépendance réseau | Le rendu est local, aucune requête nécessaire |
| Précis | Le modèle GPU exact est hautement identifiable (les GPUs rares sont très uniques) |
| Cohérent | Même version de pilote GPU — même sortie de rendu à chaque fois |
4. Faiblesses de l'Attaquant
| Faiblesse | Explication | Exploitable ? |
|---|---|---|
| Blocable | WebGL/WebGPU peut être désactivé dans les paramètres du navigateur | Oui — mais détectable |
| Injection de bruit | CanvasBlocker ajoute des pixels aléatoires à la sortie canvas, brisant l'empreinte | Oui — mais détectable |
| Mises à jour de pilotes | Les nouveaux pilotes changent la sortie de rendu, invalidant les empreintes stockées | Occasionnel |
| Tor Browser | Le rendu logiciel normalise toute la sortie GPU | Oui — mais énorme coût de performance |
| Identifie le GPU, pas l'utilisateur | Tous les utilisateurs avec le même modèle GPU se ressemblent | Seulement pour les GPUs courants |
5. Détection de la Manipulation
Les attaquants peuvent détecter l'usurpation canvas/WebGL via :
| Technique | Comment Ça Marche |
|---|---|
| Comparaison de lectures séquentielles | Lire le canvas 2-3 fois, comparer les hachages. L'injection de bruit produit des hachages différents. |
| Analyse statistique | La sortie matérielle réelle a des motifs de bruit caractéristiques ; le bruit injecté a l'air différent |
| Corrélation inter-API | Le hachage canvas + le rendu WebGL + AudioContext doivent tous être cohérents |
| Présence de fonctionnalité | WEBGL_debug_renderer_info retournant null est suspect |
| Informations d'adaptateur WebGPU manquantes | Si WebGL fonctionne mais pas WebGPU, c'est inhabituel |
6. Atténuations pour Obscura
6.1 Ce Qu'Obscura Peut Faire
| Atténuation | Efficacité | Détectabilité | Implémentation |
|---|---|---|---|
Bloquer WEBGL_debug_renderer_info |
Élevée (cache le modèle GPU) | Moyenne | Injection JS : retourner null |
| Bloquer les infos d'adaptateur WebGPU | Élevée (cache les infos GPU) | Moyenne | Injection JS : requestAdapter → null |
| Injection de bruit Canvas | Moyenne | Élevée | Injection JS : algorithme CanvasBlocker |
| Bloquer WebGL entièrement | Très Élevée | Élevée | Injection JS : getContext → null |
| Bloquer WebGPU entièrement | Très Élevée | Élevée | Injection JS : requestAdapter → null |
| Arrondir les dimensions canvas | Faible | Moyenne | Injection JS : Math.round() |
6.2 Ce Qu'Obscura Ne Peut Pas Faire
| Ne Peut Pas | Pourquoi |
|---|---|
| Changer le rendu GPU réel | Le rendu s'effectue sur le matériel GPU local |
| Usurper le hachage de rendu de scène WebGL | La sortie de rendu dépend du matériel |
| Usurper les limites WebGPU | Les limites sont interrogées depuis l'adaptateur physique |
| Normaliser la sortie canvas entre utilisateurs | Nécessite un GPU logiciel (SwiftShader) — Tor Browser uniquement |
6.3 Approche Recommandée
1. Bloquer WEBGL_debug_renderer_info (cache le modèle GPU — valeur élevée, coût faible)
2. Bloquer les infos adapterInfo WebGPU (cache les infos GPU nouvelle génération — valeur élevée, coût faible)
3. Injecter du bruit canvas (brise l'empreinte canvas — valeur moyenne, coût moyen)
4. Si l'appareil est puissant : suggérer Tor (protection complète — valeur élevée, coût utilisateur élevé)
7. Références de Recherche
- Mowery, K. & Shacham, H. (2012). "Pixel Perfect: Fingerprinting Canvas in HTML5." WOOT 2012.
- Acar, G. et al. (2014). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014.
- Cao, Y. et al. (2017). "WebRTC and Canvas-based Device Fingerprinting." PET Symposium 2017.
- FingerprintJS (2026). "Canvas Fingerprinting: What It Is and How It Works." fingerprintjs.com/blog.