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,availLeftscreen.colorDepth,screen.pixelDepthwindow.devicePixelRatiowindow.outerWidth,window.outerHeightwindow.innerWidth,window.innerHeightscreen.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().levelnavigator.getBattery().chargingnavigator.getBattery().chargingTimenavigator.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 finperformance.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.