Catégorie : Moteur Navigateur / Plateforme Web
1. Description
Chaque moteur de navigateur (Blink/Chrome, Gecko/Firefox, WebKit/Safari) implémente un sous-ensemble différent d'API Web et de fonctionnalités CSS. De plus, chacun a des bizarreries de rendu uniques, des paramètres par défaut et des modèles de comportement. Ce sont des caractéristiques inhérentes au navigateur — aucun proxy ne peut les changer car elles sont compilées dans le binaire du navigateur.
2. Vecteurs
2.1 Support des Fonctionnalités des API Web
Le navigateur expose ~100+ tests de fonctionnalités que les scripts d'empreinte énumèrent :
Fonctionnalités à haute valeur pour l'identification :
| API | Chrome | Firefox | Safari | Notes |
|---|---|---|---|---|
| WebGL 2 | Tous modernes | |||
| WebGPU | (flag) | Chrome uniquement | ||
| WebUSB | Chrome uniquement | |||
| Web Bluetooth | Chrome uniquement | |||
| Web NFC | Android | Chrome uniquement | ||
| Web Serial | Chrome uniquement | |||
| Web Share | Varie selon plateforme | |||
| Battery API | Firefox uniquement | |||
| Speech Synthesis | Varie selon voix | |||
| GamePad API | Partiel | Safari limité | ||
| MathML | Firefox/Safari uniquement | |||
| Web Workers | Tous, mais Shared Workers varient | |||
| Service Workers | Tous modernes | |||
| CSS Container Queries | Safari tardif à adopter | |||
| CSS Subgrid | Safari tardif à adopter |
Entropie : ~10-15 bits (mais hautement corrélée — se réduit à famille + version du navigateur)
2.2 Support des Fonctionnalités CSS
Des centaines de propriétés et valeurs CSS varient selon le navigateur :
/* Test via @supports */
@supports (backdrop-filter: blur(1px)) { /* Chrome + Safari */ }
@supports (-webkit-backdrop-filter: blur(1px)) { /* Safari legacy */ }
@supports (accent-color: red) { /* Chrome 93+, Firefox 92+, Safari 15.4+ */ }
@supports (container-type: inline-size) { /* Chrome 105+, Firefox 110+, Safari 16+ */ }
Entropie : ~8-12 bits (identifie le moteur du navigateur + version majeure)
2.3 Bizarreries d'Implémentation du Navigateur
Chaque navigateur a un comportement de rendu unique :
| Bizarrerie | Exemple | Navigateur |
|---|---|---|
| Largeur de barre de défilement | 12px vs 15px vs 0px (superposé) | Dépendant OS* |
| Style des éléments de formulaire | Remplissage des boutons, rayon de bordure | Spécifique au moteur |
| Rendu Unicode | Version de support des emojis | Dépendant OS+navigateur |
Comportement de <details> |
Animation ouverture/fermeture | Spécifique au moteur |
Analyse de Date() |
Formats de date non standard | Spécifique au moteur |
Ordre de JSON.stringify() |
Ordre d'énumération des propriétés | Spécifique au moteur (fixé en ES6) |
Résolution de performance.now() |
5μs vs 100μs vs 1ms | Chrome vs Firefox vs Safari |
*La largeur de barre de défilement révèle l'OS : Windows=12-17px, macOS=variable (fin/superposé), Linux=varie
2.4 Métriques de Rendu des Polices
Même avec les mêmes polices installées, différentes combinaisons OS/navigateur rendent le texte différemment :
const span = document.createElement('span')
span.textContent = 'mmmmmmmmmmlli'
document.body.appendChild(span)
const width = span.getBoundingClientRect().width
// La largeur varie selon le moteur de rendu de polices OS (FreeType, CoreText, DirectWrite)
Entropie : ~4-6 bits
2.5 Configuration Par Défaut du Navigateur
Les navigateurs sont livrés avec différents paramètres par défaut :
| Paramètre | Chrome | Firefox | Safari |
|---|---|---|---|
| Police par défaut | Times New Roman | Times New Roman | Times |
| Taille de police par défaut | 16px | 16px | 16px |
| Taille de police minimale | 0px | 0px | 12px (varie) |
| Langue par défaut | Locale OS | Locale OS | Locale OS |
| Chargement automatique d'images | Activé | Activé | Activé |
| JavaScript | Activé | Activé | Activé |
| Cookies | Autorisés | Autorisés | Autorisés (bloqués en privé) |
2.6 Spécifique à Chrome : Réduction du User-Agent
Chrome réduit progressivement les informations du User-Agent. La nouvelle API navigator.userAgentData fournit des données structurées :
- Liste de marques (ex.,
"Google Chrome";v="120") - Plateforme (ex.,
"Windows","macOS") - Drapeau mobile
- Architecture, bitness, modèle, platformVersion (peut être masqué)
Notable : Safari n'implémente pas userAgentData, et Firefox a seulement récemment commencé. C'est en soi un signal.
3. Forces de l'Attaquant
| Force | Explication |
|---|---|
| Ne peut pas être changé | Les fonctionnalités du navigateur sont compilées dans le navigateur |
| Aucune autorisation requise | Les tests de fonctionnalités sont exécutés silencieusement |
| Énumération rapide | 100+ fonctionnalités testées en <10ms |
| Stable entre versions | Les fonctionnalités changent rarement au sein d'une version de navigateur |
| Vecteur binaire (oui/non) | Peut être facilement combiné en un hachage unique |
4. Faiblesses de l'Attaquant
| Faiblesse | Explication | Exploitable ? |
|---|---|---|
| Faible entropie individuelle | Identification basique du navigateur ; pas un utilisateur individuel | Non |
| Blocable par DNS | Les scripts de détection de fonctionnalités doivent charger depuis le serveur | Oui |
| Corrélée | Tous les utilisateurs Chrome 120 se ressemblent | Non |
| Change avec les mises à jour | Les mises à jour du navigateur changent les ensembles de fonctionnalités | Occasionnel |
| Le mode privé affecte | Le mode privé/incognito modifie certaines fonctionnalités | Partiel |
5. Détection de la Manipulation
| Technique | Comment Ça Marche |
|---|---|
| Incohérence de fonctionnalités | Revendiquer des fonctionnalités Chrome mais retourner l'ensemble de fonctionnalités Firefox |
| Fonctionnalités attendues manquantes | Chrome sans WebUSB est suspect |
| Anomalies de timing | L'énumération des fonctionnalités prend trop de temps ? |
| Vecteur de fonctionnalités trop propre | Les vrais navigateurs ont quelques fonctionnalités rares manquantes |
6. Atténuations pour Obscura
6.1 Ce Qu'Obscura Peut Faire
| Atténuation | Efficacité | Détectabilité | Implémentation |
|---|---|---|---|
| Bloquer DNS des domaines d'empreinte | Élevée (empêche l'énumération) | Faible | Gestion des listes de blocage |
| Injecter JS de surcharge de fonctionnalités | Faible (trop de fonctionnalités) | Élevée | Surcharger des API individuelles |
| Accepter — les fonctionnalités navigateur sont à faible entropie | Passif | Aucun | Documenter le risque résiduel |
6.2 Ce Qu'Obscura Ne Peut Pas Faire
| Ne Peut Pas | Pourquoi |
|---|---|
| Ajouter des fonctionnalités que le navigateur n'a pas | Ne peut pas faire supporter WebUSB à Firefox |
| Supprimer des fonctionnalités que le navigateur a | Ne peut pas désactiver des fonctionnalités depuis le proxy (l'utilisateur peut via des drapeaux) |
| Changer le rendu CSS | Le rendu est dans le moteur du navigateur |
| Changer les métriques de police | Le rendu des polices est dans l'OS/navigateur |
6.3 Approche Recommandée
1. Blocage DNS des domaines d'empreinte (empêche l'énumération des fonctionnalités — meilleure défense)
2. Cohérence de profil (au moins faire correspondre le navigateur revendiqué aux fonctionnalités réelles)
3. Accepter le risque résiduel (le vecteur de fonctionnalités identifie principalement la version du navigateur, pas l'utilisateur)
7. Références de Recherche
- Eckersley, P. (2010). "How Unique Is Your Web Browser?" PETS 2010.
- Mulazzani, M. et al. (2013). "Fast and Reliable Browser Fingerprinting." ACSAC 2013.
- Laperdrix, P. et al. (2020). "Browser Fingerprinting: A Survey." ACM TOIT.
- Modernizr (2026). "Feature detection library." github.com/modernizr/modernizr.
- BrowserLeaks (2026). "Features Detection." browserleaks.com/features.