Categoría: Residuales de Red / Capa de Transporte
1. Descripción
Incluso con falsificación TLS y HTTP, las señales de red residuales persisten porque la propia pila de red de Obscura es visible para el servidor destino. Estas señales no pueden normalizarse completamente porque son propiedades del SO del contenedor y la ruta de red.
2. Vectores
2.1 Fingerprint de Pila TCP/IP
Paquete SYN recibido:
Window: 64240
TTL: 64
MSS: 1452
Opciones: MSS, SACK_PERM, TIMESTAMP, NOP, WINDOW
Window Scale: 10
DF: True
Fingerprints del SO del contenedor:
| Base del Contenedor | Window | TTL | MSS | Opciones | Similar 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 | Depende del runtime Go/Rust |
Entropía: ~4-6 bits
Mitigación: Ninguna a nivel de proxy. La pila TCP del contenedor se hereda.
2.2 Tiempo de Ida y Vuelta de Red (RTT)
El RTT es medible por el servidor:
Petición enviada: T1
Respuesta recibida: T2
RTT = T2 - T1 // Incluyendo tiempo de procesamiento del proxy
- El RTT real varía según la ruta de red
- El proxy añade latencia consistente (detectable como tiempo extra de procesamiento)
- La varianza del RTT a lo largo del tiempo crea un patrón
Entropía: ~5-8 bits (firma de ruta + latencia del proxy)
Mitigación: No puede eliminarse, pero puede ocultarse parcialmente detrás de VPN/Tor.
2.3 Clock Skew
// Cálculo del lado del servidor
const clientTimestamp = parseInt(getHeader('Date'))
const serverTime = Date.now()
const skew = serverTime - clientTimestamp
// La deriva del reloj hardware es consistente
Cada reloj hardware deriva a una tasa única (partes-por-millón). Con minutos de interacción, la deriva se vuelve medible.
Entropía: ~4-8 bits
Mitigación: Obscura puede normalizar los headers HTTP Date, pero las opciones de timestamp TCP en el paquete SYN también revelan información del reloj.
2.4 SETTINGS HTTP/2 (Si No Se Falsifican)
Si Obscura no implementa SETTINGS HTTP/2 personalizados, los valores por defecto de la librería revelan el proxy:
| Librería 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 |
Entropía: ~6-10 bits
Mitigación: Valores de trama SETTINGS personalizados que coincidan con el perfil de navegador objetivo.
2.5 Características de MTU y Ruta
- El MTU de la ruta afecta el TCP MSS
- El TTL revela el número aproximado de saltos hasta el usuario
- El comportamiento del router/ISP crea patrones únicos (estilo NAT)
Entropía: ~3-5 bits
Mitigación: Enrutar mediante VPN/Tor para normalizar.
2.6 HTTP/3 / QUIC (Si No Está Bloqueado)
Parámetros de transporte QUIC:
- Longitud y valor del ID de conexión
- Negociación de versión
- Límites de control de flujo inicial
- Parámetros de handshake TLS 1.3 sobre QUIC
Entropía: ~8-12 bits
Mitigación: Bloquear UDP 443 para forzar caída a TCP.
3. Fortalezas del Atacante
| Fortaleza | Explicación |
|---|---|
| Siempre presente | Las señales de red son inevitables en cualquier conexión TCP/IP |
| Sin JS requerido | Estas señales son observables en la capa de transporte |
| Difícil de falsificar | La pila TCP/IP es a nivel de SO, no a nivel de aplicación |
| Consistente | La ruta de red cambia con poca frecuencia |
| Correlación cruzada | Se usa junto con señales HTTP/TLS |
4. Debilidades del Atacante
| Debilidad | Explicación |
|---|---|
| Baja entropía individual | TCP/IP solo no puede identificar a un usuario específico |
| Entorno de contenedor compartido | Múltiples usuarios detrás del mismo contenedor se ven idénticos |
| Solo útil en conjunto | Necesita combinación con otras señales |
| VPN/Tor normaliza | Enrutar mediante VPN/Tor elimina fingerprints de red |
5. Detección de Manipulación
| Técnica | Cómo Funciona |
|---|---|
| Desajuste TLS vs TCP | TLS Chrome + pila TCP Linux = proxy |
| RTT vs ubicación declarada | El usuario declara ubicación EEUU pero RTT sugiere otro continente |
| HTTP/2 vs declaración de navegador | SETTINGS HTTP/2 de Go con User-Agent Chrome |
| Geolocalización IP vs zona horaria del perfil | Desajuste entre el perfil y el origen de red real |
6. Mitigaciones para Obscura
6.1 Lo Que Obscura Puede Hacer
| Mitigación | Efectividad | Detectabilidad | Implementación |
|---|---|---|---|
| Falsificación TLS mediante utls | Alta | Baja | Requerido para Obscura |
| Falsificación de SETTINGS HTTP/2 | Media | Baja | Valores SETTINGS personalizados |
| Enrutar mediante VPN/Tor upstream | Alta | Media | Configurable por el usuario |
| Bloquear UDP 443 (QUIC) | Alta | Baja | Regla iptables |
| Normalizar headers HTTP Date | Baja | Baja | Reescritura de headers |
6.2 Lo Que Obscura No Puede Hacer
| No Puede | Por Qué |
|---|---|
| Cambiar la pila TCP/IP del contenedor | A nivel de SO, heredada de la imagen base del contenedor |
| Eliminar el RTT | Física de la distancia de red |
| Cambiar el clock skew | La deriva del reloj hardware es física |
| Eliminar información de número de saltos | Los decrementos de TTL son inevitables |
6.3 Enfoque Recomendado
1. Falsificación de fingerprint TLS mediante utls (crítico — máxima prioridad)
2. Reflejo de SETTINGS HTTP/2 (prioridad media)
3. Bloquear UDP 443 (prevenir evasión por QUIC)
4. VPN/Tor upstream opcional (normaliza todas las señales de red)
5. Aceptar residuales TCP/IP (baja entropía individual)
7. Referencias de Investigación
- 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.