Saltar al contenido principal
fr/blog/obscura/research/uncontrollable/gpu-rendering/

obscura/research/uncontrollable/gpu-rendering

6 min de lecture

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.