Saltar al contenido principal
fr/blog/obscura/research/uncontrollable/cpu-platform/

obscura/research/uncontrollable/cpu-platform

5 min de lecture

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).