Categoria: Rete / Residui del Livello di Trasporto
1. Descrizione
Anche con spoofing TLS e HTTP, i segnali di rete residui persistono perché lo stack di rete di Obscura stesso è visibile al server di destinazione. Questi segnali non possono essere completamente normalizzati perché sono proprietà del SO del container e del percorso di rete.
2. Vettori
2.1 Fingerprint Stack TCP/IP
Pacchetto SYN ricevuto:
Window: 64240
TTL: 64
MSS: 1452
Opzioni: MSS, SACK_PERM, TIMESTAMP, NOP, WINDOW
Window Scale: 10
DF: True
Fingerprint SO del container:
| Base Container | Window | TTL | MSS | Opzioni | Simile a JA4T |
|---|---|---|---|---|---|
| Alpine Linux | 29200-65535 | 64 | 1460 | M,S,T,N,W | 29200_2-4-8-1-3_1460_7 |
| Debian/Ubuntu | 29200-65535 | 64 | 1460 | M,S,T,N,W | 29200_2-4-8-1-3_1460_7 |
| Distroless | 29200-65535 | 64 | 1460 | M,S,T,N,W | Dipende dal runtime Go/Rust |
Entropia: ~4-6 bit
Mitigazione: Nessuna a livello di proxy. Lo stack TCP del container è ereditato.
2.2 Tempo di Andata e Ritorno di Rete (RTT)
L'RTT è misurabile dal server:
Richiesta inviata: T1
Risposta ricevuta: T2
RTT = T2 - T1 // Incluso tempo di elaborazione proxy
- L'RTT reale varia per percorso di rete
- Il proxy aggiunge latenza coerente (rilevabile come tempo di elaborazione extra)
- La varianza dell'RTT nel tempo crea un pattern
Entropia: ~5-8 bit (firma percorso + latenza proxy)
Mitigazione: Non può essere eliminato, ma può essere parzialmente nascosto dietro VPN/Tor.
2.3 Clock Skew
// Calcolo lato server
const clientTimestamp = parseInt(getHeader('Date'))
const serverTime = Date.now()
const skew = serverTime - clientTimestamp
// La deriva dell'orologio hardware è coerente
Ogni orologio hardware deriva a un ritmo unico (parti per milione). Nel corso di minuti di interazione, la deriva diventa misurabile.
Entropia: ~4-8 bit
Mitigazione: Obscura può normalizzare gli header HTTP Date, ma le opzioni TCP timestamp nel pacchetto SYN rivelano anche informazioni sull'orologio.
2.4 HTTP/2 SETTINGS (Se Non Falsificato)
Se Obscura non implementa HTTP/2 SETTINGS personalizzato, i valori predefiniti della libreria rivelano il proxy:
| Libreria Proxy | Initial Window | Max Concurrent | Header Table Size |
|---|---|---|---|
| Go net/http | 6291456 | 250 | 4096 |
| Rust hyper | 65535 | 100 | 4096 |
| Node.js http2 | 65535 | 100 | 4096 |
| Envoy | 1048576 | 100 | 65536 |
Entropia: ~6-10 bit
Mitigazione: Valori frame SETTINGS personalizzati che corrispondono al profilo browser target.
2.5 MTU e Caratteristiche del Percorso
- Il path MTU influisce sul TCP MSS
- Il TTL rivela il conteggio hop approssimativo verso l'utente
- Il comportamento del router/ISP crea pattern unici (stile NAT)
Entropia: ~3-5 bit
Mitigazione: Instrada attraverso VPN/Tor per normalizzare.
2.6 HTTP/3 / QUIC (Se Non Bloccato)
Parametri di trasporto QUIC:
- Lunghezza e valore ID connessione
- Negoziazione versione
- Limiti iniziali di controllo del flusso
- Parametri handshake TLS 1.3 su QUIC
Entropia: ~8-12 bit
Mitigazione: Blocca UDP 443 per forzare il fallback TCP.
3. Punti di Forza dell'Attaccante
| Forza | Spiegazione |
|---|---|
| Sempre presente | I segnali di rete sono inevitabili in qualsiasi connessione TCP/IP |
| Nessun JS richiesto | Questi segnali sono osservabili a livello di trasporto |
| Difficile da falsificare | Lo stack TCP/IP è a livello OS, non a livello applicativo |
| Coerente | Il percorso di rete cambia raramente |
| Correlazione incrociata | Usato insieme ai segnali HTTP/TLS |
4. Debolezze dell'Attaccante
| Debolezza | Spiegazione |
|---|---|
| Bassa entropia individuale | TCP/IP da solo non può identificare un utente specifico |
| Ambiente container condiviso | Più utenti dietro lo stesso container appaiono identici |
| Utile solo in aggregato | Necessita di combinazione con altri segnali |
| VPN/Tor normalizza | Instradare attraverso VPN/Tor elimina i fingerprint di rete |
5. Rilevamento della Manipolazione
| Tecnica | Come Funziona |
|---|---|
| Mismatch TLS vs TCP | TLS Chrome + stack TCP Linux = proxy |
| RTT vs posizione dichiarata | Utente dichiara posizione USA ma RTT suggerisce altro continente |
| HTTP/2 vs dichiarazione browser | SETTINGS HTTP/2 di Go con User-Agent Chrome |
| Geolocalizzazione IP vs fuso orario profilo | Mismatch tra profilo e origine di rete reale |
6. Mitigazioni per Obscura
6.1 Cosa Può Fare Obscura
| Mitigazione | Efficacia | Rilevabilità | Implementazione |
|---|---|---|---|
| Spoofing TLS tramite utls | Alta | Bassa | Richiesto per Obscura |
| Spoofing HTTP/2 SETTINGS | Media | Bassa | Valori SETTINGS personalizzati |
| Instrada attraverso VPN/Tor upstream | Alta | Media | Configurabile dall'utente |
| Blocca UDP 443 (QUIC) | Alta | Bassa | Regola iptables |
| Normalizza header HTTP Date | Bassa | Bassa | Riscrittura header |
6.2 Cosa Non Può Fare Obscura
| Non Può | Perché |
|---|---|
| Cambiare lo stack TCP/IP del container | A livello OS, ereditato dall'immagine base del container |
| Eliminare l'RTT | Fisica della distanza di rete |
| Cambiare il clock skew | La deriva dell'orologio hardware è fisica |
| Rimuovere le informazioni sul conteggio hop | I decrementi TTL sono inevitabili |
6.3 Approccio Raccomandato
1. Spoofing fingerprint TLS tramite utls (critico: massima priorità)
2. Mirroring HTTP/2 SETTINGS (priorità media)
3. Blocca UDP 443 (previene bypass QUIC)
4. VPN/Tor upstream opzionale (normalizza tutti i segnali di rete)
5. Accetta residui TCP/IP (bassa entropia individuale)
7. Riferimenti di Ricerca
- FoxIO (2024). "JA4+ Suite: TLS, TCP, and QUIC Fingerprinting." FoxIO Blog.
- Zalewski, M. (2007). "p0f: Passive OS Fingerprinting." lcamtuf.coredump.cx/p0f.
- Beverly, R. (2004). "A Robust Classifier for Passive TCP/IP Fingerprinting." PAM 2004.
- Satori (2025). "Python rewrite of passive OS fingerprinting tool." GitHub: xnih/satori.