Panoramica
Segnali visibili a livello TCP/IP e di trasporto, prima di qualsiasi esecuzione HTTP o JS.
1. Fingerprint Stack TCP/IP (JA4T / Satori / p0f)
Meccanismo
Il fingerprinting OS passivo legge il pacchetto TCP SYN per identificare il sistema operativo. Ogni stack TCP/IP del SO ha una combinazione unica di:
- TTL iniziale: 64 (Linux/macOS), 128 (Windows), 255 (Alcuni UNIX)
- Dimensione finestra: 64240 (Chrome/Linux), 65535 (macOS), 8192 (sistemi vecchi)
- MSS (Maximum Segment Size): Derivato da MTU
- Opzioni TCP: Ordine e selezione di MSS, SACK_PERM, TIMESTAMP, NOP, WINDOW_SCALE
- Flag IP: Comportamento DF (Don't Fragment)
Formati
JA4T: 64240_2-4-8-1-3_1452_10
| Componente | Significato | Esempio |
|---|---|---|
| 64240 | Dimensione finestra TCP | Default Windows |
| 2-4-8-1-3 | Ordine opzioni TCP (MSS, SACK, TIMESTAMP, NOP, WINDOW) | Ordine Chrome/Linux |
| 1452 | MSS | Derivato da MTU |
| 10 | Conteggio shift Window Scale | 2^10 = moltiplicatore 1024 |
Fingerprint Satori: 64240:64:1:60:M1452,S,T,N,W10:.
Rilevamento OS
| OS | Window | TTL | MSS | Opzioni |
|---|---|---|---|---|
| Linux | 29200-65535 | 64 | 1460 | M,S,T,N,W(7-8) |
| Windows 10/11 | 64240 | 128 | 1460 | M,S,T,N,W(10) |
| macOS | 65535 | 64 | 1460 | M,S,T,N,W(6-7) |
| Android | 29200-65535 | 64 | 1460 | M,S,T,N,W(7-8) |
Impatto su Obscura
Client Container Obscura (termine TCP) Internet
Stack TCP client Stack TCP container
(visibile a Obscura) (visibile alla destinazione)
Il server di destinazione vede lo stack TCP di Obscura, non quello del client. Questo è inevitabile perché il container termina la connessione TCP del client.
Mitigazione: Nessuna a livello TCP. Tuttavia, la maggior parte dei servizi di fingerprinting si concentra su fingerprint a livello applicativo (TLS, HTTP) piuttosto che a livello TCP. Il fingerprint TCP da solo raramente identifica un utente.
2. Fingerprint TLS (JA3 / JA4)
Vedi tls-fingerprinting.md per i dettagli completi.
Punti chiave per il livello di rete:
- L'handshake TLS è il segnale più importante a livello di rete
- Completamente controllabile tramite
utls(Go) o Rust TLS personalizzato - Critico per Obscura: deve essere falsificato o il proxy viene rivelato
3. Fingerprint HTTP/2
Meccanismo
Il preambolo della connessione HTTP/2 e i frame iniziali variano per implementazione.
Segnali:
- Parametri frame SETTINGS (l'ordine è importante):
SETTINGS_HEADER_TABLE_SIZESETTINGS_ENABLE_PUSHSETTINGS_MAX_CONCURRENT_STREAMSSETTINGS_INITIAL_WINDOW_SIZESETTINGS_MAX_FRAME_SIZESETTINGS_MAX_HEADER_LIST_SIZE
- Frame iniziale WINDOW_UPDATE
- Comportamento PING
- Struttura frame PRIORITY
Esempi per Browser
| Browser | Initial Window | Max Concurrent | Header Table Size |
|---|---|---|---|
| Chrome | 6291456 | 1000 | 65536 |
| Firefox | 131072 | 100 | 65536 |
| Safari | 1048576 | 100 | 65536 |
Impatto su Obscura
Se si utilizza net/http di Go per HTTP/2, il server vede il fingerprint HTTP/2 di Go. È necessario implementare HTTP/2 personalizzato o utilizzare una libreria che permetta l'override dei SETTINGS.
4. Fingerprint QUIC / HTTP/3
Problema
HTTP/3 funziona su QUIC (UDP). Le connessioni QUIC sono crittografate end-to-end, incluso il livello di trasporto:
Client QUIC (UDP 443) Server
Criptato Criptato
(non ispezionabile) (non ispezionabile)
I parametri di trasporto QUIC, gli ID di connessione e le informazioni sulla versione sono visibili nell'handshake iniziale, ma il proxy non può modificarli.
Strategia
Blocca UDP 443 per forzare il fallback a HTTP/2 o HTTP/1.1 su TCP:
iptables -A FORWARD -p udp --dport 443 -j DROP
Questo impedisce alle connessioni QUIC di bypassare il proxy.
Compromesso: Latenza leggermente più alta (TCP vs QUIC), niente 0-RTT, niente migrazione connessione.
5. Fingerprint Basati su Temporizzazione
5.1 Performance Timing
performance.now() // Timestamp ad alta risoluzione in ms (precisione sub-millisecondo)
performance.timeOrigin
performance.getEntriesByType('navigation')
Mitigazione: Arrotonda performance.now() alla risoluzione di 100ms tramite iniezione JS:
const originalNow = performance.now.bind(performance)
performance.now = () => Math.round(originalNow() / 100) * 100
5.2 Clock Skew
I server possono misurare lo skew dell'orologio confrontando i valori di Date.now() tra richieste.
Mitigazione: Arrotonda la risoluzione di Date.now().
5.3 Temporizzazione di Rete tramite Caricamento Risorse
I siti misurano la latenza cronometrando quanto tempo impiegano le risorse a caricarsi:
const start = performance.now()
fetch('/image.png').then(() => {
const rtt = performance.now() - start
})
Mitigazione: Non può essere completamente prevenuto: il proxy aggiunge la propria latenza ma la temporizzazione relativa perde comunque informazioni.
6. WebRTC IP Leak
Meccanismo
WebRTC bypassa il proxy utilizzando server STUN/TURN per scoprire l'IP reale.
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
})
pc.createDataChannel('test')
pc.createOffer().then(d => pc.setLocalDescription(d))
pc.onicecandidate = e => {
if (e.candidate) {
// e.candidate.candidate contiene l'indirizzo IP
console.log(e.candidate.candidate)
}
}
Mitigazione tramite Iniezione JS
// Blocca WebRC completamente
Object.defineProperty(window, 'RTCPeerConnection', { value: undefined })
Object.defineProperty(window, 'RTCDataChannel', { value: undefined })
Object.defineProperty(window, 'RTCSessionDescription', { value: undefined })
Effetto
| Impostazione | WebRTC Leak | Rilevamento |
|---|---|---|
| WebRTC disponibile | IP perde | Non rilevato |
| WebRTC bloccato | Nessuna perdita | Rilevabile (assenza funzionalità) |
7. Fingerprint DNS
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
- Sottorete client EDNS0 (rivela posizione di rete approssimativa)
- Supporto DNSSEC
Mitigazione
Obscura controlla completamente il DNS. Usa un upstream coerente e orientato alla privacy (Quad9 9.9.9.9 o Cloudflare 1.1.1.1) e rimuovi la sottorete client EDNS0.
Conclusioni per Obscura
| Vettore | Controllabile | Priorità | Note |
|---|---|---|---|
| Fingerprint TCP/IP | No (ereditato dal container) | Bassa | Bassa entropia, raramente usato da solo |
| Fingerprint TLS | Sì (tramite utls) | Critica | Deve essere falsificato o il proxy viene rivelato |
| Fingerprint HTTP/2 | Parziale | Media | Richiede implementazione HTTP/2 personalizzata |
| QUIC/HTTP/3 | Blocca o eredita | Media | Blocca UDP 443 |
| Attacchi di temporizzazione | Parziale | Bassa | Arrotonda performance.now() |
| WebRTC IP leak | Sì (blocca tramite JS) | Alta | Critico per utenti VPN |
| Fingerprint DNS | Sì | Alta | Obscura controlla il DNS |