Saltar al contenido principal
fr/blog/obscura/research/fingerprint-vectors-catalog/

obscura/research/fingerprint-vectors-catalog

16 min de lecture

Aperçu

Ce document catalogue tous les vecteurs d'empreinte navigateur connus, découverts via l'analyse de FingerprintJS (27.7k étoiles, 44 sources), BrowserLeaks (15+ outils), EFF Cover Your Tracks, et d'autres recherches. Chaque vecteur est classé par catégorie, capacité d'usurpation au niveau proxy, et contribution d'entropie.

Légende de Classification

Icône Signification
Usurpable Entièrement contrôlable au niveau proxy (modification d'en-tête, DNS, TLS)
Partiel Peut être partiellement modifié/injecté via JS, mais pas entièrement contrôlé
Non usurpable Au niveau matériel ou se produit avant que le proxy ne puisse intercepter
Détectable La tentative d'usurpation peut être détectée par le service d'empreinte

Couche 1 : Réseau & Protocole (13 vecteurs)

Ce sont les signaux de plus bas niveau, visibles avant tout HTTP ou JS.

1.1 Empreinte de Pile TCP/IP (JA4T)

Ce que c'est : L'empreinte TCP passive lit les paramètres du paquet SYN pour identifier l'OS.

Signaux :

  • TTL initial (64=Linux/macOS, 128=Windows)
  • Taille de fenêtre (64240=Chrome/Linux, 65535=macOS)
  • MSS (Taille Maximale de Segment)
  • Options TCP (MSS, SACK_PERM, TIMESTAMP, WINDOW_SCALE, ordre NOP)
  • Drapeau IP DF (Ne Pas Fragmenter)
  • Support ECN

Exemple JA4T : 64240_2-4-8-1-3_1452_10

Verdict : Partiel — La pile TCP du conteneur remplace celle du client. La pile TCP d'Obscura sera vue, pas celle du client. C'est inévitable.

1.2 Empreinte TLS (JA3/JA4)

Ce que c'est : Les paramètres ClientHello TLS révèlent l'identité du navigateur.

Signaux :

  • Liste de suites de chiffrement (ordre et sélection)
  • Liste d'extensions TLS (ordre et sélection)
  • Groupes supportés (courbes)
  • Formats de point EC
  • Protocoles ALPN
  • Version TLS
  • Présence SNI

Exemple JA3 : 6734f37431670b3ab4292b8f60f29984 (Chrome 120 Win11)

Verdict : Usurpable via la bibliothèque utls (Go) ou une implémentation TLS personnalisée (Rust).

Note : Puisqu'Obscura termine TLS pour le MITM, la poignée de main TLS externe vers le serveur peut être entièrement contrôlée. C'est un vecteur critique — sans usurpation, le serveur voit la pile TLS de Go/Chrome, révélant instantanément un proxy.

1.3 Empreinte HTTP/2 (format Akamai)

Ce que c'est : La préface de connexion HTTP/2 et les trames SETTINGS varient selon le navigateur.

Signaux :

  • Paramètres de trame SETTINGS (MAX_CONCURRENT_STREAMS, INITIAL_WINDOW_SIZE, MAX_FRAME_SIZE, etc.)
  • Ordre des trames SETTINGS
  • Comportement des trames PING
  • Synchronisation WINDOW_UPDATE
  • Structure des trames PRIORITY
  • Octets magiques (PRI * HTTP/2.0)

Verdict : Partiel — Usurpable si Obscura implémente HTTP/2 personnalisé, mais complexe. Si Go net/http est utilisé, le serveur voit l'empreinte HTTP/2 de Go.

1.4 Empreinte QUIC / HTTP/3

Ce que c'est : QUIC (HTTP/3) utilise UDP et est chiffré de bout en bout — ne peut pas être intercepté.

Signaux :

  • Paramètres de transport QUIC
  • Longueur de l'ID de connexion
  • Négociation de version
  • Poignée de main TLS 1.3 sur QUIC

Verdict : Non usurpable — QUIC contourne entièrement le proxy. Obscura doit bloquer QUIC (UDP 443) pour forcer HTTP/1.1 ou HTTP/2 sur TCP.

1.5 Empreinte DNS

Ce que c'est : Les motifs de requête DNS et le choix du résolveur.

Signaux :

  • IP du résolveur DNS (Cloudflare 1.1.1.1 vs Google 8.8.8.8 vs FAI)
  • DNS sur HTTPS vs DNS sur TLS vs DNS standard
  • Options EDNS0
  • Motifs temporels des requêtes DNS
  • Support DNSSEC

Verdict : Usurpable — Obscura contrôle entièrement la résolution DNS.

1.6 Fuite IP WebRTC

Ce que c'est : WebRTC peut révéler la véritable IP locale et publique même derrière un VPN/proxy.

Mécanisme :

const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] })
pc.createDataChannel('')
pc.createOffer().then(offer => pc.setLocalDescription(offer))
// Les candidats ICE révèlent les IP locales et publiques

Verdict : Partiel — Peut être bloqué via injection JS (surcharge RTCPeerConnection), mais le blocage est détectable.

1.7 Géolocalisation IP

Ce que c'est : L'adresse IP révèle le pays, la ville, le FAI, l'ASN, la latitude/longitude.

Verdict : Usurpable — Utiliser un VPN/Tor en amont d'Obscura, ou router via un nœud de sortie.

1.8 API Network Information

Ce que c'est : navigator.connection expose le type de réseau.

navigator.connection.effectiveType  // "4g", "3g", "2g", "slow-2g"
navigator.connection.downlink       // Estimation Mbps
navigator.connection.rtt            // Temps aller-retour (ms)
navigator.connection.saveData       // Mode d'économie de données

Verdict : Usurpable via injection JS.

1.9 Attaques Temporelles (Latence Réseau)

Ce que c'est : Mesurer les temps de chargement des ressources révèle les caractéristiques du réseau.

Mécanisme : Utiliser performance.now() avant/après le chargement de ressources pour mesurer la latence.

Verdict : Partiel — La précision de performance.now() peut être réduite, mais le timing grossier fonctionne toujours.

1.10 Détection Proxy/VPN

Ce que c'est : Les serveurs détectent les proxys via :

  • En-têtes HTTP (Via, X-Forwarded-For, X-Real-IP)
  • Incohérence d'empreinte TLS (UA Chrome + TLS Go)
  • Incohérence du résolveur DNS
  • IP dans les plages connues de proxy/VPN
  • Décalage fuseau horaire vs géolocalisation IP

Verdict : Partiel — Nécessite un profil cohérent à toutes les couches.

1.11 Détection de Filtrage de Contenu

Ce que c'est : Détection des bloqueurs de publicité, outils de confidentialité via :

  • Motifs de ressources bloquées (détection EasyList)
  • Test de sélecteurs CSS
  • Chronométrage des ressources bloquées
  • Présence/absence d'éléments DOM

Verdict : Détectable — Si Obscura bloque des domaines, cela peut être détecté en testant des domaines de suivi connus.

1.12 Comportement de Cache HTTP/HTTPS

Ce que c'est : Suivi temporel du cache / ETag à travers les sites.

Verdict : Partiel — Peut vider/désactiver les en-têtes de cache via le proxy.

1.13 Comportement OCSP/CRL

Ce que c'est : Motifs de vérification de révocation de certificat.

Verdict : Non usurpable — Difficile à contrôler au niveau proxy sans casser TLS.


Couche 2 : HTTP & En-têtes (12 vecteurs)

2.1 User-Agent

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...

Verdict : Usurpable

2.2 Client Hints (Sec-CH-UA)

Sec-CH-UA: "Google Chrome";v="120", "Chromium";v="120", "Not?A_Brand";v="99"
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Platform-Version: "15.0.0"
Sec-CH-UA-Model: ""  (bureau) / "Pixel 7" (mobile)
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Arch: "x86"
Sec-CH-UA-Bitness: "64"
Sec-CH-UA-Full-Version-List: "..."
Sec-CH-UA-WoW64: ?0

Verdict : Usurpable

2.3 En-têtes Accept

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br

Verdict : Usurpable

2.4 Content-Type / Content-Encoding

Verdict : Usurpable

2.5 Do Not Track / Global Privacy Control

DNT: 1
Sec-GPC: 1

Verdict : Usurpable

2.6 Upgrade-Insecure-Requests

Upgrade-Insecure-Requests: 1

Verdict : Usurpable

2.7 Referer / Origin

Verdict : Partiel — Peut être supprimé/modifié, mais casse certains sites.

2.8 Comportement des Cookies

Signaux : cookies activés/désactivés, blocage des cookies tiers, préférences d'expiration des cookies.

Verdict : Partiel — Peut définir des cookies sur le proxy, mais les paramètres de cookies du navigateur fuient via JS.

2.9 En-têtes de Cache

ETag, If-None-Match, Cache-Control, Pragma

Verdict : Usurpable au proxy.

2.10 En-têtes de Connexion

Connection, Keep-Alive, Upgrade

Verdict : Usurpable

2.11 En-têtes Proxy

Via, X-Forwarded-For, X-Real-IP, Forwarded

Verdict : Usurpable — Supprimer tous les en-têtes proxy.

2.12 Priorité / Priorité de Chargement

Sec-Purpose, Sec-Fetch-*, Priority

Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

Verdict : Usurpable


Couche 3 : API JavaScript / DOM (44 vecteurs de FingerprintJS)

Ce sont tous les signaux collectés par la bibliothèque open-source de FingerprintJS. Chacun est un fichier source .ts.

# Fichier Source Signal Collecté Usurpable via Injection JS
1 userAgentData navigator.userAgentData (marques, plateforme, mobile, architecture, bitness, modèle, platformVersion, wow64, fullVersionList, formFactors) Oui
2 fonts Polices système installées (via CSS @font-face + mesure) Partiel — peut limiter mais pas falsifier
3 domBlockers Détection des bloqueurs de pub/contenu via ressources de test Partiel
4 fontPreferences Préférences de rendu des polices (espacement des lettres, métriques) Partiel
5 audio Hachage de la sortie AudioContext oscillator + DynamicsCompressor Partiel — peut injecter du bruit
6 screenFrame Dimensions du cadre d'écran (availTop, availLeft) Oui
7 canvas Hachage du rendu Canvas 2D (texte + formes) Partiel — injection de bruit
8 osCpu navigator.oscpu (Firefox) Oui
9 languages navigator.languages, navigator.language Oui
10 colorDepth screen.colorDepth Oui
11 deviceMemory navigator.deviceMemory Oui
12 screenResolution screen.width, screen.height Oui
13 hardwareConcurrency navigator.hardwareConcurrency Oui
14 timezone Intl.DateTimeFormat().resolvedOptions().timeZone Oui
15 sessionStorage Si sessionStorage est disponible Oui (surcharge)
16 localStorage Si localStorage est disponible Oui (surcharge)
17 indexedDB Si indexedDB est disponible Oui (surcharge)
18 openDatabase Si window.openDatabase existe Oui (surcharge)
19 cpuClass navigator.cpuClass (IE legacy) Oui
20 platform navigator.platform Oui
21 plugins navigator.plugins (liste des plugins installés) Partiel
22 touchSupport navigator.maxTouchPoints, support des événements tactiles Oui
23 vendor navigator.vendor Oui
24 vendorFlavors navigator.vendorSub, navigator.productSub Oui
25 cookiesEnabled navigator.cookieEnabled Oui
26 colorGamut Support de la gamme de couleurs (sRGB, P3, Rec2020) via requête média Oui
27 invertedColors Paramètre de couleurs inversées de l'OS Oui
28 forcedColors Mode de couleurs forcées de l'OS Oui
29 monochrome Profondeur de couleur monochrome via requête média Oui
30 contrast Préférence de contraste via requête média Oui
31 reducedMotion Requête média prefers-reduced-motion Oui
32 reducedTransparency Requête média prefers-reduced-transparency Oui
33 hdr Support HDR via window.matchMedia Oui
34 math Empreinte mathématique en virgule flottante (différences de précision) Non usurpable — comportement FPU matériel
35 pdfViewerEnabled navigator.pdfViewerEnabled Oui
36 architecture navigator.userAgentData.architecture (x86, arm) Oui
37 applePay Disponibilité d'Apple Pay Oui (surcharge)
38 privateClickMeasurement Support de l'API Private Click Measurement Oui (surcharge)
39 audioBaseLatency Latence de base AudioContext (dépendante du matériel) Non usurpable — audio matériel
40 dateTimeLocale Locale résolue Intl.DateTimeFormat Oui
41 webGlBasics Rendu WebGL, fournisseur, version, précision du shader Partiel — peut bloquer debug_info
42 webGlExtensions Liste des extensions WebGL supportées Partiel — peut bloquer le listage
43 vendor (navigator) navigator.vendor (ex., "Google Inc.") Oui
44 mimeTypes Gestionnaires MIME enregistrés navigator.mimeTypes Partiel

Résumé des vecteurs FingerprintJS :

Usurpabilité Compte
Entièrement usurpable via injection JS 29
Partiellement usurpable 13
Non usurpable 2

Couche 4 : Fonctionnalités & Capacités du Navigateur (25+ vecteurs)

De BrowserLeaks "Features Detection", les éléments suivants sont utilisés pour l'empreinte :

4.1 Support des Fonctionnalités Web (vecteur binaire oui/non)

Chaque fonctionnalité supportée/non supportée ajoute ~1 bit d'entropie :

  • Canvas, Canvas Text
  • SVG (inline, comme img, clip-path, SMIL, filtres, foreignObject)
  • WebGL, WebGL2
  • WebGPU
  • Web Audio API, Speech Recognition, Speech Synthesis
  • WebRTC, MediaStream Recording
  • WebSocket, WebSocket Binary
  • Service Workers, Service Worker Cache
  • Web Bluetooth, Web USB, Web NFC, Web Serial
  • Web Authentication (WebAuthn)
  • Web Cryptography API
  • Web Assembly (Wasm)
  • WebVR / WebXR
  • Web Animations
  • ResizeObserver, IntersectionObserver, MutationObserver
  • Fullscreen API, Pointer Lock API, Geolocation API
  • Battery API, Network Information API, Vibration API
  • PushManager, Notification API, Page Visibility API
  • History API, postMessage
  • Web Workers, Shared Workers
  • Fetch API, Beacon API, Server Sent Events
  • Filesystem API, File API, Blob API
  • GamePad API, Device Orientation, Device Motion
  • Fonctionnalités CSS (grid, flexbox, transforms 3D, backdrop-filter, etc.)

Total : ~100+ tests de fonctionnalités, mais la plupart sont hautement corrélés (Chrome supporte X, Firefox non). Entropie effective : ~10-15 bits.

Verdict : Partiel — Peut injecter des surcharges de détection de fonctionnalités, mais très complexe à maintenir.

4.2 Empreinte par Requêtes Média CSS

Ce que c'est : Forcer les dimensions d'écran via les requêtes CSS @media.

@media (width: 1920px) { ... }
@media (height: 1080px) { ... }
@media (device-width: 1920px) { ... }
@media (resolution: 1.5dppx) { ... }

Verdict : Partiel — La détection basée sur CSS s'exécute avant l'injection JS.

4.3 Empreinte ClientRects

Ce que c'est : Element.getClientRects() retourne différentes valeurs pour les éléments invisibles selon le navigateur/OS.

Verdict : Non usurpable depuis le proxy — la disposition DOM est spécifique au navigateur.


Couche 5 : Système & Matériel (15 vecteurs)

5.1 Empreinte GPU

Sources :

  • WEBGL_debug_renderer_info.UNMASKED_RENDERER_WEBGL (modèle GPU exact)
  • WebGPU adapterInfo (fournisseur, architecture, périphérique, pilote, backend)
  • Différences de rendu Canvas
  • Précision des shaders WebGL
  • Support des extensions WebGL

Entropie : Très élevée — le modèle exact du GPU est hautement identifiable.

Verdict : Partiel — Peut bloquer UNMASKED_RENDERER_INFO et les infos d'adaptateur WebGPU, mais les empreintes basées sur le rendu persistent.

5.2 Empreinte CPU

Sources :

  • navigator.hardwareConcurrency (nombre de cœurs)
  • Précision mathématique FPU (différences d'opérations en virgule flottante)
  • Résolution de performance.now()
  • Détection de fonctionnalités CPU basée sur Wasm (SIMD, AES-NI, etc.)

Verdict : Non usurpable pour la précision mathématique et la détection CPU Wasm.

5.3 Empreinte Mémoire

Source : navigator.deviceMemory (RAM en Go, seulement dans Chrome)

Verdict : Usurpable

5.4 Empreinte de Stockage

Sources :

  • Disponibilité de LocalStorage, SessionStorage, IndexedDB, Cache API
  • API de gestion de quota de stockage
  • Disponibilité de WebSQL

Verdict : Usurpable

5.5 Empreinte de Polices

Sources :

  • Polices système installées (via énumération basée sur mesure CSS @font-face)
  • Métriques de rendu des polices (espacement des lettres, hauteur, largeur avec des polices spécifiques)
  • Support de plage de glyphes Unicode

Entropie : Très élevée — la liste de polices peut avoir >1000 polices.

Verdict : Partiel — Peut limiter l'énumération des polices en surchargeant les fonctions de mesure, mais les différences de rendu des polices persistent.

5.6 Empreinte d'Écran

Sources :

  • screen.width, screen.height, availWidth, availHeight, availTop, availLeft
  • screen.colorDepth, screen.pixelDepth
  • window.devicePixelRatio
  • window.outerWidth, window.outerHeight
  • window.innerWidth, window.innerHeight
  • screen.orientation
  • Détection multi-moniteur via l'API ScreenDetailed

Verdict : Usurpable via injection JS.

5.7 Empreinte de Méthode de Saisie

Sources :

  • navigator.maxTouchPoints
  • Support des événements tactiles
  • Support des événements de pointeur
  • Disposition du clavier / méthode de saisie

Verdict : Usurpable pour le support tactile. Non usurpable pour la disposition du clavier.

5.8 Empreinte Matérielle Audio

Sources :

  • Taux d'échantillonnage AudioContext
  • Latence de base AudioContext
  • Sortie DynamicsCompressorNode (dépendante du matériel)
  • Nombre de canaux audio
  • Support d'annulation d'écho, de suppression de bruit

Verdict : Non usurpable — traitement audio matériel.

5.9 API Battery

Sources :

  • navigator.getBattery().level
  • navigator.getBattery().charging
  • navigator.getBattery().chargingTime
  • navigator.getBattery().dischargingTime

Verdict : Usurpable via injection JS.

5.10 Périphériques Média

Sources :

  • navigator.mediaDevices.enumerateDevices()
  • Nombre et type de caméras, microphones, haut-parleurs

Verdict : Usurpable via injection JS (retourner une liste de périphériques vide ou générique).


Couche 6 : Comportemental & Session (8 vecteurs)

6.1 Comportement Souris / Tactile

Ce que c'est : Motifs de mouvement de souris, chronométrage des clics, gestes tactiles.

Verdict : Non usurpable — biométrie comportementale, aucun contrôle proxy.

6.2 Dynamique de Frappe

Ce que c'est : Vitesse de frappe, durée de pression des touches, intervalles entre touches.

Verdict : Non usurpable

6.3 Comportement de Défilement

Ce que c'est : Vitesse de défilement, motifs d'accélération.

Verdict : Non usurpable

6.4 Durée de Session / Chronométrage de Page

Ce que c'est : Temps passé sur les pages, motifs de navigation.

Verdict : Non usurpable

6.5 Chronométrage de Performance

Signaux :

  • performance.now() timing fin
  • performance.timeOrigin
  • API Navigation timing (performance.getEntriesByType('navigation'))

Verdict : Partiel — La précision de performance.now() peut être réduite.

6.6 Détection Multi-Fenêtre / Multi-Onglet

Ce que c'est : Communication inter-onglets via BroadcastChannel, SharedWorker, localStorage.

Verdict : Partiel via injection JS.

6.7 Persistance Service Worker

Ce que c'est : Détection si un SW est enregistré, état du cache.

Verdict : Partiel — peut être surchargé, mais la portée du SW est complexe.

6.8 Fuseau Horaire / Dérive d'Horloge

Ce que c'est : Fuseau horaire système + dérive d'horloge précise par rapport au temps serveur.

Verdict : Usurpable pour le fuseau horaire. Partiel pour la dérive d'horloge.


Résumé du Nombre de Vecteurs

Couche Catégorie Nombre Usurpable par Proxy Partiel Non usurpable
1 Réseau & Protocole 13 3 6 4
2 HTTP & En-têtes 12 11 1 0
3 API JavaScript / DOM 44 29 13 2
4 Fonctionnalités Navigateur ~100+ 0 ~10 ~90+
5 Système & Matériel 15 6 4 5
6 Comportemental & Session 8 1 4 3
Total (vecteurs distincts uniques) ~60+ ~50 ~38 ~100+

Implications pour Obscura

  • ~50 vecteurs sont entièrement contrôlables au niveau proxy/injection JS
  • ~38 vecteurs peuvent être partiellement atténués mais pas parfaitement
  • ~100+ vecteurs sont hors du contrôle d'Obscura (matériel, comportemental, drapeaux de fonctionnalités)

Protection réaliste : Un déploiement bien configuré d'Obscura peut contrôler ~55% de la surface d'empreinte, mais les ~45% restants fuient encore des informations. Combiné avec le blocage DNS des domaines d'empreinte connus, la protection effective est significative mais pas absolue.