Saltar al contenido principal
fr/blog/obscura/research/uncontrollable/browser-features-quirks/

obscura/research/uncontrollable/browser-features-quirks

7 min de lecture

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.