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

obscura/research/fingerprint-vectors-catalog

14 min di lettura

Panoramica

Questo documento cataloga tutti i vettori noti di fingerprint del browser scoperti attraverso l'analisi di FingerprintJS (27.7k stelle, 44 fonti), BrowserLeaks (15+ strumenti), EFF Cover Your Tracks, e altre ricerche. Ogni vettore è classificato per categoria, falsificabilità a livello di proxy, e contributo di entropia.

Legenda di Classificazione

Icona Significato
Falsificabile Completamente controllabile a livello di proxy (modifica header, DNS, TLS)
Parziale Può essere parzialmente modificato/iniettato via JS, ma non completamente controllato
Non falsificabile A livello hardware o avviene prima che il proxy possa intercettare
Rilevabile Il tentativo di spoofing può essere rilevato dal servizio di fingerprinting

Livello 1: Rete e Protocollo (13 vettori)

Questi sono i segnali di livello più basso, visibili prima di qualsiasi HTTP o JS.

1.1 Fingerprint Stack TCP/IP (JA4T)

Cosa è: Il fingerprinting TCP passivo legge i parametri del pacchetto SYN per identificare il SO.

Segnali:

  • TTL iniziale (64=Linux/macOS, 128=Windows)
  • Dimensione finestra (64240=Chrome/Linux, 65535=macOS)
  • MSS (Maximum Segment Size)
  • Opzioni TCP (MSS, SACK_PERM, TIMESTAMP, WINDOW_SCALE, ordine NOP)
  • Flag IP DF (Don't Fragment)
  • Supporto ECN

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

Verdetto: Parziale Lo stack TCP del container sostituisce quello del client. Verrà visto lo stack TCP di Obscura, non quello del client. Questo è inevitabile.

1.2 Fingerprint TLS (JA3/JA4)

Cosa è: I parametri del ClientHello TLS rivelano l'identità del browser.

Segnali:

  • Elenco suite di cifratura (ordine e selezione)
  • Elenco estensioni TLS (ordine e selezione)
  • Gruppi supportati (curve)
  • Formati punti EC
  • Protocolli ALPN
  • Versione TLS
  • Presenza SNI

Esempio JA3: 6734f37431670b3ab4292b8f60f29984 (Chrome 120 Win11)

Verdetto: Falsificabile tramite la libreria utls (Go) o implementazione TLS personalizzata (Rust).

Nota: Poiché Obscura termina TLS per il MITM, l'handshake TLS esterno verso il server può essere completamente controllato. Questo è un vettore critico: senza spoofing, il server vede lo stack TLS di Go/Chrome, rivelando istantaneamente un proxy.

1.3 Fingerprint HTTP/2 (formato Akamai)

Cosa è: Il preambolo della connessione HTTP/2 e i frame SETTINGS variano per browser.

Segnali:

  • Parametri frame SETTINGS (MAX_CONCURRENT_STREAMS, INITIAL_WINDOW_SIZE, MAX_FRAME_SIZE, ecc.)
  • Ordine frame SETTINGS
  • Comportamento frame PING
  • Temporizzazione WINDOW_UPDATE
  • Struttura frame PRIORITY
  • Ottetti magici (PRI * HTTP/2.0)

Verdetto: Parziale Falsificabile se Obscura implementa HTTP/2 personalizzato, ma complesso. Se usa net/http di Go, il server vede il fingerprint HTTP/2 di Go.

1.4 Fingerprint QUIC / HTTP/3

Cosa è: QUIC (HTTP/3) utilizza UDP ed è crittografato end-to-end: non può essere intercettato.

Segnali:

  • Parametri di trasporto QUIC
  • Lunghezza ID connessione
  • Negoziazione versione
  • Handshake TLS 1.3 su QUIC

Verdetto: Non falsificabile QUIC bypassa completamente il proxy. Obscura deve bloccare QUIC (UDP 443) per forzare HTTP/1.1 o HTTP/2 su TCP.

1.5 Fingerprint DNS

Cosa è: Pattern delle query DNS e scelta del resolver.

Segnali:

  • IP del resolver DNS (Cloudflare 1.1.1.1 vs Google 8.8.8.8 vs ISP)
  • DNS over HTTPS vs DNS over TLS vs DNS semplice
  • Opzioni EDNS0
  • Pattern di temporizzazione query DNS
  • Supporto DNSSEC

Verdetto: Falsificabile Obscura controlla completamente la risoluzione DNS.

1.6 WebRTC IP Leak

Cosa è: WebRTC può rivelare l'IP reale locale e pubblico anche dietro VPN/proxy.

Meccanismo:

const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] })
pc.createDataChannel('')
pc.createOffer().then(offer => pc.setLocalDescription(offer))
// I candidati ICE rivelano IP locali e pubblici

Verdetto: Parziale Può essere bloccato tramite iniezione JS (override RTCPeerConnection), ma il blocco è rilevabile.

1.7 Geolocalizzazione IP

Cosa è: L'indirizzo IP rivela paese, città, ISP, ASN, latitudine/longitudine.

Verdetto: Falsificabile Usa una VPN/Tor a monte di Obscura, o instrada attraverso un nodo di uscita.

1.8 Network Information API

Cosa è: navigator.connection espone il tipo di rete.

navigator.connection.effectiveType  // "4g", "3g", "2g", "slow-2g"
navigator.connection.downlink       // Stima Mbps
navigator.connection.rtt            // Tempo di andata e ritorno (ms)
navigator.connection.saveData       // Modalità risparmio dati

Verdetto: Falsificabile tramite iniezione JS.

1.9 Attacchi di Temporizzazione (Latenza di Rete)

Cosa è: Misurare i tempi di caricamento delle risorse rivela caratteristiche di rete.

Meccanismo: Usa performance.now() prima/dopo il caricamento delle risorse per misurare la latenza.

Verdetto: Parziale La precisione di performance.now() può essere ridotta, ma la temporizzazione approssimativa funziona ancora.

1.10 Rilevamento Proxy/VPN

Cosa è: I server rilevano proxy tramite:

  • Header HTTP (Via, X-Forwarded-For, X-Real-IP)
  • Mismatch fingerprint TLS (Chrome UA + Go TLS)
  • Incoerenza resolver DNS
  • IP in intervalli noti di proxy/VPN
  • Mismatch fuso orario vs geolocalizzazione IP

Verdetto: Parziale Richiede un profilo coerente su tutti i livelli.

1.11 Rilevamento Blocco Contenuti

Cosa è: Rilevamento di ad blocker, strumenti privacy tramite:

  • Pattern di risorse bloccate (rilevamento EasyList)
  • Test selettori CSS
  • Temporizzazione delle risorse bloccate
  • Presenza/assenza elementi DOM

Verdetto: Rilevabile Se Obscura blocca domini, può essere rilevato testando domini di tracciamento noti.

1.12 Comportamento Cache HTTP/HTTPS

Cosa è: Temporizzazione cache / tracciamento ETag tra siti.

Verdetto: Parziale Può cancellare/disabilitare header cache tramite proxy.

1.13 Comportamento OCSP/CRL

Cosa è: Pattern di verifica revoca certificati.

Verdetto: Non falsificabile Difficile da controllare a livello di proxy senza rompere TLS.


Livello 2: HTTP e Header (12 vettori)

2.1 User-Agent

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

Verdetto: Falsificabile

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: ""  (desktop) / "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

Verdetto: Falsificabile

2.3 Accept Headers

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

Verdetto: Falsificabile

2.4 Content-Type / Content-Encoding

Verdetto: Falsificabile

2.5 Do Not Track / Global Privacy Control

DNT: 1
Sec-GPC: 1

Verdetto: Falsificabile

2.6 Upgrade-Insecure-Requests

Upgrade-Insecure-Requests: 1

Verdetto: Falsificabile

2.7 Referer / Origin

Verdetto: Parziale Può essere rimosso/modificato, ma rompe alcuni siti.

2.8 Comportamento Cookie

Segnali: cookie abilitati/disabilitati, blocco cookie di terze parti, preferenze scadenza cookie.

Verdetto: Parziale Può impostare cookie sul proxy, ma le impostazioni cookie del browser filtrano tramite JS.

2.9 Cache Headers

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

Verdetto: Falsificabile a livello di proxy.

2.10 Connection Headers

Connection, Keep-Alive, Upgrade

Verdetto: Falsificabile

2.11 Proxy Headers

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

Verdetto: Falsificabile Rimuovi tutti gli header proxy.

2.12 Priorità / Priorità di Caricamento

Sec-Purpose, Sec-Fetch-*, Priority

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

Verdetto: Falsificabile


Livello 3: API JavaScript / DOM (44 vettori da FingerprintJS)

Questi sono tutti i segnali raccolti dalla libreria open-source di FingerprintJS. Ogni voce è un file sorgente .ts.

# File Sorgente Segnale Raccolto Falsificabile tramite Iniezione JS
1 userAgentData navigator.userAgentData (brands, platform, mobile, architecture, bitness, model, platformVersion, wow64, fullVersionList, formFactors)
2 fonts Font di sistema installati (tramite CSS @font-face + misurazione) Parziale: può limitare ma non falsificare
3 domBlockers Rilevamento blocco annunci/contenuti tramite risorse di test Parziale
4 fontPreferences Preferenze rendering font (spaziatura lettere, metriche font) Parziale
5 audio Hash output oscillatore AudioContext + DynamicsCompressor Parziale: può iniettare rumore
6 screenFrame Dimensioni frame schermo (availTop, availLeft)
7 canvas Hash rendering Canvas 2D (testo + forme) Parziale: iniezione rumore
8 osCpu navigator.oscpu (Firefox)
9 languages navigator.languages, navigator.language
10 colorDepth screen.colorDepth
11 deviceMemory navigator.deviceMemory
12 screenResolution screen.width, screen.height
13 hardwareConcurrency navigator.hardwareConcurrency
14 timezone Intl.DateTimeFormat().resolvedOptions().timeZone
15 sessionStorage Se sessionStorage è disponibile Sì (override)
16 localStorage Se localStorage è disponibile Sì (override)
17 indexedDB Se indexedDB è disponibile Sì (override)
18 openDatabase Se window.openDatabase esiste Sì (override)
19 cpuClass navigator.cpuClass (legacy IE)
20 platform navigator.platform
21 plugins navigator.plugins (elenco plugin installati) Parziale
22 touchSupport navigator.maxTouchPoints, supporto eventi touch
23 vendor navigator.vendor
24 vendorFlavors navigator.vendorSub, navigator.productSub
25 cookiesEnabled navigator.cookieEnabled
26 colorGamut Supporto gamut colore (sRGB, P3, Rec2020) tramite media query
27 invertedColors Impostazione OS colori invertiti
28 forcedColors Modalità OS colori forzati
29 monochrome Profondità colore monocromatico tramite media query
30 contrast Preferenza contrasto tramite media query
31 reducedMotion Media query prefers-reduced-motion
32 reducedTransparency Media query prefers-reduced-transparency
33 hdr Supporto HDR tramite window.matchMedia
34 math Fingerprint matematica in virgola mobile (differenze di precisione) Non falsificabile: comportamento hardware FPU
35 pdfViewerEnabled navigator.pdfViewerEnabled
36 architecture navigator.userAgentData.architecture (x86, arm)
37 applePay Disponibilità Apple Pay Sì (override)
38 privateClickMeasurement Supporto API Private Click Measurement Sì (override)
39 audioBaseLatency Latenza base AudioContext (dipendente dall'hardware) Non falsificabile: hardware audio
40 dateTimeLocale Locale risolto Intl.DateTimeFormat
41 webGlBasics Renderer WebGL, vendor, versione, precisione shader Parziale: può bloccare debug_info
42 webGlExtensions Elenco estensioni WebGL supportate Parziale: può bloccare l'elenco
43 vendor (navigator) navigator.vendor (es. "Google Inc.")
44 mimeTypes Gestori MIME registrati navigator.mimeTypes Parziale

Riepilogo vettori FingerprintJS:

Falsificabilità Conteggio
Completamente falsificabile tramite iniezione JS 29
Parzialmente falsificabile 13
Non falsificabile 2

Livello 4: Funzionalità e Capacità del Browser (25+ vettori)

Da BrowserLeaks "Features Detection", i seguenti sono usati per il fingerprinting:

4.1 Supporto Funzionalità Web (vettore binario sì/no)

Ogni funzionalità supportata/non supportata aggiunge ~1 bit di entropia:

  • Canvas, Canvas Text
  • SVG (inline, as img, clip-path, SMIL, filters, 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
  • Funzionalità CSS (grid, flexbox, transforms 3D, backdrop-filter, ecc.)

Totale: ~100+ test di funzionalità, ma la maggior parte sono altamente correlati (Chrome supporta X, Firefox no). Entropia effettiva: ~10-15 bit.

Verdetto: Parziale Può iniettare override di rilevamento funzionalità, ma molto complesso da mantenere.

4.2 Fingerprinting tramite Media Query CSS

Cosa è: Ricerca forzata delle dimensioni dello schermo tramite query CSS @media.

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

Verdetto: Parziale Il rilevamento basato su CSS viene eseguito prima dell'iniezione JS.

4.3 Fingerprinting ClientRects

Cosa è: Element.getClientRects() restituisce valori diversi per elementi invisibili tra browser/SO.

Verdetto: Non falsificabile dal proxy. Il layout DOM è specifico del browser.


Livello 5: Sistema e Hardware (15 vettori)

5.1 Fingerprint GPU

Fonti:

  • WEBGL_debug_renderer_info.UNMASKED_RENDERER_WEBGL (modello GPU esatto)
  • WebGPU adapterInfo (vendor, architecture, device, driver, backend)
  • Differenze rendering Canvas
  • Precisione shader WebGL
  • Supporto estensioni WebGL

Entropia: Molto alta: il modello esatto della GPU è altamente identificativo.

Verdetto: Parziale Può bloccare UNMASKED_RENDERER_INFO e le informazioni adapter WebGPU, ma i fingerprint basati sul rendering rimangono.

5.2 Fingerprint CPU

Fonti:

  • navigator.hardwareConcurrency (numero di core)
  • Precisione matematica FPU (differenze nelle operazioni in virgola mobile)
  • Risoluzione performance.now()
  • Rilevamento funzionalità CPU basato su Wasm (SIMD, AES-NI, ecc.)

Verdetto: Non falsificabile per precisione matematica e rilevamento CPU Wasm.

5.3 Fingerprint Memoria

Fonte: navigator.deviceMemory (RAM in GB, solo in Chrome)

Verdetto: Falsificabile

5.4 Fingerprint Archiviazione

Fonti:

  • Disponibilità LocalStorage, SessionStorage, IndexedDB, Cache API
  • API gestione archiviazione quota
  • Disponibilità WebSQL

Verdetto: Falsificabile

5.5 Fingerprinting Font

Fonti:

  • Font di sistema installati (tramite enumerazione basata su misurazione CSS @font-face)
  • Metriche rendering font (spaziatura lettere, altezza, larghezza con font specifici)
  • Supporto intervallo glifi Unicode

Entropia: Molto alta: l'elenco dei font può avere >1000 font.

Verdetto: Parziale Può limitare l'enumerazione dei font sovrascrivendo le funzioni di misurazione, ma le differenze di rendering dei font persistono.

5.6 Fingerprint Schermo

Fonti:

  • screen.width, screen.height, availWidth, availHeight, availTop, availLeft
  • screen.colorDepth, screen.pixelDepth
  • window.devicePixelRatio
  • window.outerWidth, window.outerHeight
  • window.innerWidth, window.innerHeight
  • screen.orientation
  • Rilevamento multi-monitor tramite API ScreenDetailed

Verdetto: Falsificabile tramite iniezione JS.

5.7 Fingerprint Metodo di Input

Fonti:

  • navigator.maxTouchPoints
  • Supporto eventi touch
  • Supporto eventi pointer
  • Layout tastiera / metodo di input

Verdetto: Falsificabile per supporto touch. Non falsificabile per layout tastiera.

5.8 Fingerprint Hardware Audio

Fonti:

  • Frequenza di campionamento AudioContext
  • Latenza base AudioContext
  • Output DynamicsCompressorNode (dipendente dall'hardware)
  • Conteggio canali audio
  • Supporto cancellazione eco, soppressione rumore

Verdetto: Non falsificabile: elaborazione audio hardware.

5.9 Battery API

Fonti:

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

Verdetto: Falsificabile tramite iniezione JS.

5.10 Media Devices

Fonti:

  • navigator.mediaDevices.enumerateDevices()
  • Numero e tipo di fotocamere, microfoni, altoparlanti

Verdetto: Falsificabile tramite iniezione JS (restituisci elenco dispositivi vuoto o generico).


Livello 6: Comportamentale e Sessione (8 vettori)

6.1 Comportamento Mouse / Touch

Cosa è: Pattern di movimento del mouse, temporizzazione click, gesture touch.

Verdetto: Non falsificabile: biometria comportamentale, nessun controllo del proxy.

6.2 Dinamiche di Battitura

Cosa è: Velocità di digitazione, durata pressione tasti, intervalli tra tasti.

Verdetto: Non falsificabile

6.3 Comportamento Scroll

Cosa è: Velocità di scroll, pattern di accelerazione.

Verdetto: Non falsificabile

6.4 Durata Sessione / Temporizzazione Pagina

Cosa è: Tempo trascorso sulle pagine, pattern di navigazione.

Verdetto: Non falsificabile

6.5 Performance Timing

Segnali:

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

Verdetto: Parziale La precisione di performance.now() può essere ridotta.

6.6 Rilevamento Multi-Finestra / Multi-Scheda

Cosa è: Comunicazione cross-scheda tramite BroadcastChannel, SharedWorker, localStorage.

Verdetto: Parziale tramite iniezione JS.

6.7 Persistenza Service Worker

Cosa è: Rilevamento se un SW è registrato, stato cache.

Verdetto: Parziale: può sovrascrivere, ma lo scope SW è complesso.

6.8 Fuso Orario / Clock Skew

Cosa è: Fuso orario di sistema + skew preciso dell'orologio dall'ora del server.

Verdetto: Falsificabile per il fuso orario. Parziale per lo skew dell'orologio.


Riepilogo per Conteggio Vettori

Livello Categoria Conteggio Falsificabile dal Proxy Parziale Non Falsificabile
1 Rete e Protocollo 13 3 6 4
2 HTTP e Header 12 11 1 0
3 API JavaScript / DOM 44 29 13 2
4 Funzionalità Browser ~100+ 0 ~10 ~90+
5 Sistema e Hardware 15 6 4 5
6 Comportamentale e Sessione 8 1 4 3
Totale (vettori distinti unici) ~60+ ~50 ~38 ~100+

Implicazioni per Obscura

  • ~50 vettori sono completamente controllabili a livello di proxy/iniezione JS
  • ~38 vettori possono essere parzialmente mitigati ma non perfettamente
  • ~100+ vettori sono fuori dal controllo di Obscura (hardware, comportamentali, flag di funzionalità)

Protezione realistica: Un'implementazione ben configurata di Obscura può controllare ~55% della superficie di fingerprinting, ma il restante ~45% perde comunque informazioni. Combinato con il blocco DNS dei domini di fingerprinting noti, la protezione effettiva è significativa ma non assoluta.