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) |
Sì |
| 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) | Sì |
| 7 | canvas |
Hash rendering Canvas 2D (testo + forme) | Parziale: iniezione rumore |
| 8 | osCpu |
navigator.oscpu (Firefox) |
Sì |
| 9 | languages |
navigator.languages, navigator.language |
Sì |
| 10 | colorDepth |
screen.colorDepth |
Sì |
| 11 | deviceMemory |
navigator.deviceMemory |
Sì |
| 12 | screenResolution |
screen.width, screen.height |
Sì |
| 13 | hardwareConcurrency |
navigator.hardwareConcurrency |
Sì |
| 14 | timezone |
Intl.DateTimeFormat().resolvedOptions().timeZone |
Sì |
| 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) |
Sì |
| 20 | platform |
navigator.platform |
Sì |
| 21 | plugins |
navigator.plugins (elenco plugin installati) |
Parziale |
| 22 | touchSupport |
navigator.maxTouchPoints, supporto eventi touch |
Sì |
| 23 | vendor |
navigator.vendor |
Sì |
| 24 | vendorFlavors |
navigator.vendorSub, navigator.productSub |
Sì |
| 25 | cookiesEnabled |
navigator.cookieEnabled |
Sì |
| 26 | colorGamut |
Supporto gamut colore (sRGB, P3, Rec2020) tramite media query | Sì |
| 27 | invertedColors |
Impostazione OS colori invertiti | Sì |
| 28 | forcedColors |
Modalità OS colori forzati | Sì |
| 29 | monochrome |
Profondità colore monocromatico tramite media query | Sì |
| 30 | contrast |
Preferenza contrasto tramite media query | Sì |
| 31 | reducedMotion |
Media query prefers-reduced-motion |
Sì |
| 32 | reducedTransparency |
Media query prefers-reduced-transparency |
Sì |
| 33 | hdr |
Supporto HDR tramite window.matchMedia |
Sì |
| 34 | math |
Fingerprint matematica in virgola mobile (differenze di precisione) | Non falsificabile: comportamento hardware FPU |
| 35 | pdfViewerEnabled |
navigator.pdfViewerEnabled |
Sì |
| 36 | architecture |
navigator.userAgentData.architecture (x86, arm) |
Sì |
| 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 |
Sì |
| 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.") |
Sì |
| 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,availLeftscreen.colorDepth,screen.pixelDepthwindow.devicePixelRatiowindow.outerWidth,window.outerHeightwindow.innerWidth,window.innerHeightscreen.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().levelnavigator.getBattery().chargingnavigator.getBattery().chargingTimenavigator.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.