Saltar al contenido principal
fr/blog/obscura/research/js-api-fingerprinting/

obscura/research/js-api-fingerprinting

3 min de lecture

Aperçu

Les API JavaScript du navigateur exposent un large éventail d'informations sur le système et le navigateur. Ces signaux peuvent être interceptés et modifiés via injection JS au niveau proxy.

Vecteurs d'API

API Navigator

Propriété Info Fuite Usurpable via JS
navigator.userAgent Chaîne Navigateur/OS Oui
navigator.platform Plateforme OS Oui
navigator.language Langue principale Oui
navigator.languages Préférences linguistiques Oui
navigator.hardwareConcurrency Nombre de cœurs CPU Oui
navigator.deviceMemory RAM en Go Oui
navigator.maxTouchPoints Support tactile Oui
navigator.webdriver Détection d'automatisation Oui
navigator.plugins Plugins installés Limitée
navigator.mimeTypes Support MIME Limitée
navigator.cookieEnabled Statut des cookies Oui
navigator.doNotTrack Préférence de confidentialité Oui
navigator.pdfViewerEnabled Support PDF Oui

API Screen

Propriété Info Fuite Usurpable via JS
screen.width Résolution d'écran Oui
screen.height Résolution d'écran Oui
screen.availWidth Largeur disponible Oui
screen.availTop Position de la fenêtre Oui
screen.colorDepth Profondeur de couleur Oui
screen.pixelDepth Profondeur de pixel Oui
screen.orientation Orientation Oui

Autres API

API Info Fuite Usurpable via JS
Intl.DateTimeFormat().resolvedOptions().timeZone Fuseau horaire Oui
performance.now() Précision du temporisateur Oui (réduite)
Date.now() Dérive d'horloge Oui
navigator.connection Type de réseau/RTT Oui
navigator.getBattery() Niveau de batterie Oui
navigator.mediaDevices Nombre de caméras/micros Oui

Stratégie d'Usurpation

Via JS Injecté

// Surcharger les propriétés navigator via Object.defineProperty
Object.defineProperty(navigator, 'userAgent', {
  get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'
})

Object.defineProperty(navigator, 'platform', {
  get: () => 'Win32'
})

Object.defineProperty(navigator, 'hardwareConcurrency', {
  get: () => 8
})

Défis

  1. Temporalité : Le script injecté doit s'exécuter avant les scripts de la page. Nécessite une injection au tout début de <head>.


  2. Frameworks : Certains frameworks (Next.js, Angular) utilisent le SSR ou des scripts inline qui s'exécutent avant le JS injecté.



  3. Service Workers : Les SW peuvent intercepter et modifier les réponses avant l'injection.


  4. Détection : Un site peut détecter les surcharges en vérifiant Object.getOwnPropertyDescriptor() ou en comparant plusieurs signaux pour des incohérences.

Conclusions

  • ~25 signaux d'API JS sont usurpables via injection JS au proxy
  • Nécessite une injection soigneuse au stade de l'analyse HTML
  • La temporalité est critique (injecter avant tout script de la page)
  • Ne peut pas surcharger toutes les API (certaines sont implémentées en C++ dans le navigateur)
  • Doit maintenir une cohérence inter-signaux (ex., plateforme Win32 + User-Agent Windows)