Catégorie : Matériel / Architecture Processeur
1. Description
L'empreinte CPU mesure les caractéristiques du processeur et de la plateforme qui sont exposées via JavaScript et WebAssembly. Ces signaux dérivent de :
- Comportement de l'unité de virgule flottante (FPU)
- Extensions de jeu d'instructions CPU (SIMD, AES-NI, AVX, BMI, POPCNT)
- Hiérarchie et timing du cache
- Résolution de
performance.now()(temporisateur matériel) - Vitesse d'exécution WebAssembly (benchmark relatif)
2. Vecteurs
2.1 Empreinte Mathématique / FPU
// Différences de précision en virgule flottante
function mathFingerprint() {
const inputs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
return inputs.map(x => {
// Opérations qui exposent les différences de précision
return Math.sin(x) * Math.cos(x) + Math.tan(x) - Math.asin(x) * Math.atan(x)
}).join(',')
}
// Différents CPUs produisent des résultats subtilement différents
Entropie : ~4-6 bits
Stabilité : Très Élevée — le comportement FPU du CPU est fixe
Mécanisme : La conformité IEEE 754 varie légèrement entre les fabricants et modèles de CPU. Les instructions FMA (Fused Multiply-Add) produisent des résultats différents des opérations multiplie+addition séparées.
2.2 Détection de Fonctionnalités WebAssembly
// Module Wasm qui teste le support des fonctionnalités CPU
const wasmCode = new Uint8Array([
0x00, 0x61, 0x73, 0x6d, // magic
0x01, 0x00, 0x00, 0x00, // version
// ... Détection SIMD, AES-NI via instructions wasm
])
const module = await WebAssembly.instantiate(wasmCode)
const result = module.instance.exports.test()
Fonctionnalités détectables :
- SIMD (instructions vectorielles 128-bit)
- Opérations d'extension de signe
- Variables globales mutables
- Opérations mémoire en bloc
- Types de référence
- Appels de queue
- SIMD à largeur fixe
Entropie : ~8-12 bits (quelles fonctionnalités sont supportées)
Stabilité : Très Élevée — les fonctionnalités CPU sont fixes
2.3 Résolution de Performance.now()
// Mesurer la résolution du temporisateur
const t1 = performance.now()
const t2 = performance.now()
const resolution = t2 - t1 // Intervalle minimum mesurable
Entropie : ~2-3 bits
Stabilité : Modérée — l'OS et le navigateur peuvent changer la résolution
2.4 Benchmark WebAssembly
// Benchmark de vitesse CPU relative
const start = performance.now()
// Exécuter du code wasm intensif
const elapsed = performance.now() - start
// La vitesse relative est identifiable
Entropie : ~4-8 bits
Stabilité : Faible-Modérée — affectée par la limitation CPU, les processus d'arrière-plan, la gestion d'énergie
3. Forces de l'Attaquant
| Force | Explication |
|---|---|
| Verrouillé au matériel | Les fonctionnalités CPU ne peuvent pas être changées sans remplacer le matériel |
| Wasm est rapide | Détection de fonctionnalités en <1ms |
| Aucune autorisation nécessaire | Les API Wasm et Math ne nécessitent aucun consentement utilisateur |
| Multi-navigateur | Le même CPU produit des empreintes similaires sur différents navigateurs |
| Passif | Aucune interaction utilisateur requise |
4. Faiblesses de l'Attaquant
| Faiblesse | Explication |
|---|---|
| Faible entropie par vecteur | L'empreinte mathématique seule est insuffisante |
| Le navigateur réduit la précision du temporisateur | La résolution de performance.now() est intentionnellement réduite |
| Wasm peut être bloqué | Les paramètres du navigateur peuvent désactiver WebAssembly |
| Variance du benchmark | La limitation CPU rend les mesures bruitées |
| Regroupe les utilisateurs par classe CPU | Tous les utilisateurs avec le même CPU se ressemblent |
5. Détection de la Manipulation
| Technique | Comment Ça Marche |
|---|---|
| Comparaison de résultats mathématiques | Les méthodes Math surchargées retournent des valeurs suspectes |
| Temps d'exécution Wasm | Wasm bloqué est détectable (l'instanciation échoue) |
| Résolution du temporisateur | Une résolution inhabituellement arrondie suggère une surcharge |
6. Atténuations pour Obscura
6.1 Ce Qu'Obscura Peut Faire
| Atténuation | Efficacité | Détectabilité | Implémentation |
|---|---|---|---|
Surcharger la précision de performance.now() |
Faible | Faible | Arrondir à 100ms |
| Bloquer Wasm entièrement | Élevée | Moyenne | JS : WebAssembly → undefined |
Surcharger hardwareConcurrency |
Élevée | Faible | Injection JS (déjà dans la liste contrôlable) |
Surcharger deviceMemory |
Élevée | Faible | Injection JS (déjà dans la liste contrôlable) |
6.2 Ce Qu'Obscura Ne Peut Pas Faire
| Ne Peut Pas | Pourquoi |
|---|---|
| Changer le comportement FPU | Le matériel CPU exécute les instructions directement |
| Empêcher la détection CPU Wasm | Wasm s'exécute nativement, le proxy ne peut pas intercepter |
| Normaliser la vitesse d'exécution | La vitesse CPU est physique |
| Supprimer les canaux auxiliaires de timing | Toute exécution JS révèle du timing |
6.3 Approche Recommandée
1. Surcharger hardwareConcurrency + deviceMemory (déjà planifié)
2. Surcharger la précision de performance.now() (effort faible, bénéfice partiel)
3. Accepter l'empreinte mathématique FPU + détection CPU Wasm (faible entropie individuelle)
7. Références de Recherche
- Mowery, K. et al. (2011). "Are These Your Keys? Using Cryptographic Fingerprints to Detect Malicious Applets." IEEE S&P 2011.
- Mulazzani, M. et al. (2013). "Fast and Reliable Browser Fingerprinting." ACSAC 2013.
- Olejnik, L. et al. (2015). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014 (section timing CPU).