Empreinte

Fingerprinting Navigator : fuites du navigateur

Comment navigator.platform, hardwareConcurrency et deviceMemory exposent votre identité, et comment garantir des propriétés navigator cohérentes.

Documentation

Vous préférez la doc produit maintenue ?

Cet article a une page équivalente dans le centre de documentation. Utilisez les docs pour le flux canonique, les flags à jour et la référence durable.

Introduction

L'objet navigator en JavaScript est l'une des sources d'informations sur l'appareil les plus accessibles pour n'importe quel site web. Les propriétés comme navigator.platform, navigator.hardwareConcurrency, navigator.deviceMemory, navigator.userAgent et navigator.languages révèlent des détails sur votre système d'exploitation, votre CPU, votre RAM et la configuration de votre navigateur. Individuellement, chaque propriété fournit un pouvoir d'identification limité. Combinées, elles forment une empreinte composite qui réduit significativement la population d'utilisateurs. Contrairement aux API expérimentales qui peuvent nécessiter des permissions, les propriétés du navigator sont universellement disponibles, largement supportées et interrogées par pratiquement tous les scripts de pistage sur le web. Cet article explique comment les propriétés du navigator contribuent au fingerprinting et comment BotBrowser fournit des valeurs cohérentes et pilotées par profil pour chaque propriété.

Impact sur la vie privée

Les propriétés du navigator sont la couche fondamentale du fingerprinting de navigateur. Chaque script de pistage commence par le navigator, parce que les données sont gratuites, ne nécessitent aucune permission et sont disponibles immédiatement.

Une étude de 2020 de l'Université d'Iowa a analysé plus de 100 000 empreintes de navigateur et a constaté que la combinaison de navigator.userAgent, navigator.platform, navigator.hardwareConcurrency, navigator.deviceMemory et navigator.languages fournissait en moyenne 12,8 bits d'information identifiante. Pour contexte, 12,8 bits peuvent distinguer environ 7 000 configurations uniques. Ajoutez la résolution d'écran et le fuseau horaire, et la combinaison identifie généralement plus de 90% des utilisateurs de manière unique.

Le Privacy Interest Group du W3C a documenté les implications de confidentialité des propriétés du navigator de manière extensive. Leur document de guidance sur le fingerprinting liste hardwareConcurrency, deviceMemory et languages comme des surfaces "à haute entropie" qui contribuent de manière significative au pistage inter-sites. Malgré cela, ces propriétés restent disponibles sans restrictions dans tous les navigateurs majeurs car trop d'applications web légitimes en dépendent.

Les environnements d'entreprise et de développement font face à un risque supplémentaire. Des valeurs non standard comme un hardwareConcurrency de 64 cœurs (tests serveur), un deviceMemory de 0,25 Go (appareils embarqués), ou des combinaisons de langues inhabituelles se distinguent immédiatement dans n'importe quelle population.

Contexte technique

L'objet navigator contient des dizaines de propriétés. Voici les plus significatives pour le fingerprinting :

Propriétés d'identité principales

  • navigator.userAgent - La chaîne d'agent utilisateur. Contient le nom du navigateur, la version, le nom du système d'exploitation et la version du système d'exploitation. Malgré les efforts de dépréciation, elle reste la propriété la plus interrogée.
  • navigator.platform - Retourne une chaîne identifiant la plateforme : "Win32", "MacIntel", "Linux x86_64", "Linux armv81", etc.
  • navigator.vendor - Retourne le fournisseur du navigateur. "Google Inc." pour les navigateurs basés sur Chrome/Chromium, "" pour Firefox, "Apple Computer, Inc." pour Safari.

Propriétés matérielles

  • navigator.hardwareConcurrency - Retourne le nombre de cœurs logiques du CPU. Les valeurs courantes vont de 2 à 16 pour les appareils grand public. Les valeurs au-dessus de 16 ou en dessous de 4 réduisent significativement la population.
  • navigator.deviceMemory - Retourne la RAM approximative en Go. Les valeurs possibles sont 0,25, 0,5, 1, 2, 4 et 8 (plafonnées à 8). Cette API n'est disponible que dans les navigateurs basés sur Chromium.

Propriétés de locale et langue

  • navigator.language - Retourne la langue préférée (par ex. "en-US").
  • navigator.languages - Retourne un tableau de langues préférées par ordre (par ex. ["en-US", "en", "fr"]).

Propriétés de connexion et média

  • navigator.connection - L'API NetworkInformation, exposant effectiveType, downlink, rtt et saveData. Ces valeurs reflètent les conditions réseau mais sont suffisamment stables pour contribuer au fingerprinting.
  • navigator.mediaDevices - L'énumération des appareils média révèle le nombre et les types de caméras, microphones et sorties audio.

User Agent Client Hints

Les navigateurs Chromium modernes exposent également navigator.userAgentData, qui fournit un accès structuré à la marque du navigateur, la plateforme et le statut mobile. La méthode getHighEntropyValues() à haute entropie retourne des informations détaillées sur la version de la plateforme, l'architecture, le bitness et le modèle de l'appareil.

Pourquoi ces valeurs varient

Les valeurs des propriétés du navigator dépendent de :

  • Système d'exploitation. Les chaînes de plateforme, les langues par défaut et les API de mémoire disponibles diffèrent selon le système d'exploitation.
  • Matériel. Le nombre de cœurs CPU et la taille de la mémoire dépendent du matériel.
  • Version du navigateur. Les chaînes d'agent utilisateur changent à chaque version. Les marques et versions des Client Hints évoluent.
  • Configuration utilisateur. Les préférences de langue et les paramètres de locale sont contrôlés par l'utilisateur.

La distribution de ces valeurs est inégale. Quelques configurations (Windows 10 à 8 cœurs avec 8 Go de RAM, langue en-US) sont très courantes. Tout le reste est progressivement plus rare et plus identifiant.

Approches de protection courantes et leurs limites

L'usurpation de l'agent utilisateur est l'approche la plus ancienne et la plus courante. Les extensions ou paramètres du navigateur changent navigator.userAgent en une chaîne différente. Le problème : la plupart des outils d'usurpation ne changent que la chaîne UA sans ajuster les autres propriétés corrélées. Prétendre être sur macOS via l'agent utilisateur alors que navigator.platform dit "Win32" est une incohérence évidente.

Les VPN n'ont aucun effet sur les propriétés du navigator. Ces valeurs sont déterminées par le navigateur et le système d'exploitation, pas par le réseau.

Le mode navigation privée ne change pas les propriétés du navigator. Votre empreinte est identique en navigation normale et en navigation privée.

Les extensions de navigateur qui modifient les propriétés du navigator opèrent en JavaScript et peuvent elles-mêmes être identifiées par fingerprinting. La présence de getters modifiés sur les propriétés du navigator est détectable par l'inspection de la chaîne de prototypes et l'analyse de timing.

La randomisation des propriétés du navigator crée des combinaisons irréalistes. Un appareil avec 3 cœurs CPU, 3 Go de mémoire et une chaîne de plateforme "Win64" ne correspond à aucun matériel réel. Ces combinaisons sont plus uniques et identifiables que des valeurs honnêtes.

Le défi fondamental est la cohérence. Les propriétés du navigator doivent former un ensemble cohérent qui correspond à une configuration réelle d'appareil. La plateforme doit correspondre à l'agent utilisateur. Le nombre de cœurs doit être réaliste pour le matériel rapporté. La mémoire doit s'aligner avec la plateforme. Les langues doivent être plausibles pour la locale rapportée.

L'approche de BotBrowser au niveau du moteur

BotBrowser configure toutes les propriétés du navigator via son système de profils au niveau du moteur. Lorsqu'un profil est chargé, chaque propriété de l'objet navigator retourne des valeurs dérivées de l'appareil profilé.

Couverture complète des propriétés

Les profils de BotBrowser définissent des valeurs pour toutes les propriétés du navigator pertinentes pour le fingerprinting :

  • userAgent, appVersion, platform, vendor et appCodeName sont tous cohérents avec le navigateur et le système d'exploitation profilés.
  • hardwareConcurrency correspond à la configuration CPU de l'appareil profilé.
  • deviceMemory correspond au niveau de RAM de l'appareil profilé.
  • language et languages correspondent à la locale profilée.
  • userAgentData (marques, plateforme, flag mobile, fullVersionList) est généré pour correspondre à la marque et la version du navigateur profilé.

Cohérence interne

L'avantage critique de l'approche de BotBrowser est que toutes les propriétés sont dérivées d'un seul profil cohérent. Il n'y a aucun scénario où platform dit "MacIntel" alors que userAgent contient "Windows NT 10.0". Le profil définit l'identité de l'appareil, et toutes les propriétés du navigator le reflètent.

Cela s'étend aux User Agent Client Hints. Lorsqu'un site appelle navigator.userAgentData.getHighEntropyValues(), les valeurs retournées pour platform, platformVersion, architecture, bitness, model et fullVersionList correspondent toutes au profil. Les en-têtes HTTP Sec-CH-UA-* envoyés avec les requêtes correspondent aux valeurs JavaScript.

Contrôle des informations réseau

Avec le flag --bot-network-info-override, BotBrowser contrôle également les valeurs de navigator.connection (rtt, downlink, effectiveType, saveData) et les en-têtes Client Hints correspondants. Cela garantit que les propriétés du navigator liées au réseau s'alignent avec le profil.

Cohérence dans les Workers

Les propriétés du navigator sont également disponibles dans les Web Workers et les Service Workers. BotBrowser garantit que les mêmes valeurs sont retournées dans tous les contextes d'exécution, y compris les workers dédiés, les workers partagés et les service workers. Il n'y a aucune faille où un worker retournerait vos vraies valeurs matérielles alors que le thread principal retourne les valeurs du profil.

Configuration et utilisation

Chargement de profil de base

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Toutes les propriétés du navigator sont configurées automatiquement depuis le profil.

Substitution de langue et locale

# Détection automatique depuis l'IP (par défaut)
chrome --bot-profile="/path/to/profile.enc" \
       --bot-config-languages=auto \
       --bot-config-locale=auto

# Substitution manuelle
chrome --bot-profile="/path/to/profile.enc" \
       --bot-config-languages="fr-FR,fr,en" \
       --bot-config-locale="fr-FR"

Substitution des informations réseau

chrome --bot-profile="/path/to/profile.enc" \
       --bot-network-info-override

Intégration Playwright

const { chromium } = require('playwright');

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-config-languages=auto',
    '--bot-config-locale=auto',
    '--bot-config-timezone=auto'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

// Vérifier les propriétés du navigator
const platform = await page.evaluate(() => navigator.platform);
const cores = await page.evaluate(() => navigator.hardwareConcurrency);
console.log(`Platform: ${platform}, Cores: ${cores}`);

Intégration Puppeteer

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({
  executablePath: '/path/to/botbrowser/chrome',
  defaultViewport: null,
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-network-info-override'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

Vérification

Vérification de la cohérence des propriétés. Interrogez toutes les propriétés du navigator et vérifiez qu'elles forment un ensemble cohérent. La plateforme devrait correspondre au système d'exploitation de l'agent utilisateur. Le nombre de cœurs devrait être réaliste pour la plateforme. La mémoire devrait être plausible.

Vérification des Client Hints. Utilisez navigator.userAgentData.getHighEntropyValues(['platform', 'platformVersion', 'architecture', 'bitness', 'model', 'fullVersionList']) et confirmez que les valeurs correspondent au profil. Vérifiez que les en-têtes de requête HTTP Sec-CH-UA-* correspondent aux valeurs JavaScript.

Cohérence des Workers. Exécutez les mêmes requêtes de propriétés du navigator dans un Web Worker et comparez les résultats avec le thread principal. Ils devraient être identiques.

Stabilité inter-sessions. Interrogez les propriétés du navigator sur plusieurs sessions avec le même profil. Toutes les valeurs devraient être identiques.

Bonnes pratiques

  • Chargez toujours un profil. Sans --bot-profile, les propriétés du navigator reflètent votre système réel. Le profil est ce qui fournit des valeurs contrôlées.
  • Utilisez la détection automatique pour les signaux de locale. --bot-config-timezone=auto, --bot-config-locale=auto et --bot-config-languages=auto dérivent la locale depuis votre IP de proxy, gardant les propriétés de langue du navigator cohérentes avec votre emplacement apparent.
  • Ne substituez pas manuellement les propriétés individuelles. Le profil garantit la cohérence interne. Substituer une propriété (comme hardwareConcurrency) sans ajuster les valeurs corrélées crée des incohérences.
  • Surveillez les changements de format de l'agent utilisateur. Les chaînes d'agent utilisateur du navigateur changent à chaque version. Utilisez des profils actuels depuis le dépôt de profils BotBrowser pour rester à jour.
  • Testez dans le thread principal et les workers. Vérifiez la cohérence du navigator dans tous les contextes d'exécution.

FAQ

Q : navigator.hardwareConcurrency aide-t-il vraiment à identifier les utilisateurs ? R : Oui. Bien que les valeurs courantes (4, 8) soient partagées par beaucoup d'utilisateurs, les valeurs peu courantes (1, 2, 6, 24, 64) sont hautement identifiantes. Combinées avec d'autres propriétés du navigator, même les valeurs courantes contribuent à l'empreinte globale.

Q : Que se passe-t-il avec navigator.deviceMemory sur Firefox ou Safari ? R : deviceMemory est une API exclusivement Chromium. Firefox et Safari ne l'exposent pas. Les profils BotBrowser pour Chrome/Edge/Brave incluent des valeurs deviceMemory. Si un profil cible un navigateur qui ne supporte pas cette API, elle n'est pas exposée.

Q : Les sites web peuvent-ils savoir si les propriétés du navigator ont été modifiées ? R : Les modifications mal implémentées (substitutions JavaScript) peuvent être détectées par l'inspection des prototypes et l'analyse de timing. Le contrôle au niveau du moteur de BotBrowser modifie les propriétés à la source, donc il n'y a pas d'artefacts visibles en JavaScript.

Q : BotBrowser gère-t-il les changements de réduction du User-Agent (UA-CH) ? R : Oui. BotBrowser génère des en-têtes User Agent Client Hints (Sec-CH-UA-*) appropriés et des valeurs navigator.userAgentData qui correspondent au profil. La chaîne d'agent utilisateur réduite et les hints à haute entropie sont tous deux cohérents.

Q : Comment BotBrowser gère-t-il navigator.webdriver ? R : BotBrowser contrôle la propriété navigator.webdriver via son système de profils, garantissant qu'elle retourne la valeur attendue pour le contexte de navigation.

Q : Les propriétés du navigator sont-elles affectées par le flag --bot-noise-seed ? R : Les propriétés du navigator sont des valeurs déterministes (nombre de cœurs, mémoire, plateforme) qui n'impliquent pas de bruit. Elles viennent directement du profil. La graine de bruit affecte les sorties de rendu (Canvas, WebGL, audio), pas les propriétés d'identité matérielle.

Résumé

Les propriétés du navigator forment la couche fondamentale du fingerprinting de navigateur. Elles sont universellement accessibles, ne nécessitent aucune permission et fournissent des informations identifiantes significatives lorsqu'elles sont combinées. BotBrowser contrôle toutes les propriétés du navigator au niveau du moteur via son système de profils, garantissant la cohérence interne entre l'agent utilisateur, la plateforme, le matériel, la locale et les API de Client Hints. Combiné avec la détection automatique du fuseau horaire, de la locale et des paramètres de langue, BotBrowser produit une identité de navigateur cohérente qui correspond à une configuration réelle d'appareil.

Pour les sujets connexes, voir What is Browser Fingerprinting, CPU Core Count Control, Screen and Window Protection, et Timezone, Locale, and Language.

#Navigator#fingerprinting#identité du navigateur#Privacy

Faites passer BotBrowser de la recherche à la production

Utilisez ces guides pour comprendre le modèle, puis passez à la validation multi-plateforme, aux contextes isolés et au déploiement navigateur prêt pour l'échelle.