Resumen
Este documento cataloga todos los vectores conocidos de fingerprint de navegador descubiertos mediante el análisis de FingerprintJS (27.7k estrellas, 44 fuentes), BrowserLeaks (15+ herramientas), EFF Cover Your Tracks y otras investigaciones. Cada vector está clasificado por categoría, capacidad de falsificación a nivel de proxy y contribución de entropía.
Leyenda de Clasificación
| Icono | Significado |
|---|---|
| Falsificable | Totalmente controlable a nivel de proxy (modificación de headers, DNS, TLS) |
| Parcial | Puede modificarse/inyectarse parcialmente mediante JS, pero no controlarse completamente |
| No falsificable | A nivel de hardware u ocurre antes de que el proxy pueda interceptar |
| Detectable | El intento de falsificación puede ser detectado por el servicio de fingerprinting |
Capa 1: Red y Protocolo (13 vectores)
Estas son las señales de más bajo nivel, visibles antes de cualquier HTTP o JS.
1.1 Fingerprint de Pila TCP/IP (JA4T)
Qué es: El fingerprinting TCP pasivo lee parámetros del paquete SYN para identificar el SO.
Señales:
- TTL inicial (64=Linux/macOS, 128=Windows)
- Tamaño de ventana (64240=Chrome/Linux, 65535=macOS)
- MSS (Maximum Segment Size)
- Opciones TCP (MSS, SACK_PERM, TIMESTAMP, WINDOW_SCALE, orden NOP)
- Flag IP DF (Don't Fragment)
- Soporte ECN
Ejemplo JA4T: 64240_2-4-8-1-3_1452_10
Veredicto: Parcial — La propia pila TCP del contenedor reemplaza la del cliente. Se verá la pila TCP de Obscura, no la del cliente. Esto es inevitable.
1.2 Fingerprint TLS (JA3/JA4)
Qué es: Los parámetros de TLS ClientHello revelan la identidad del navegador.
Señales:
- Lista de suites de cifrado (orden y selección)
- Lista de extensiones TLS (orden y selección)
- Grupos soportados (curvas)
- Formatos de punto EC
- Protocolos ALPN
- Versión TLS
- Presencia de SNI
Ejemplo JA3: 6734f37431670b3ab4292b8f60f29984 (Chrome 120 Win11)
Veredicto: Falsificable mediante la librería utls (Go) o implementación TLS personalizada (Rust).
Nota: Dado que Obscura termina TLS para MITM, el handshake TLS externo hacia el servidor puede controlarse completamente. Este es un vector crítico — sin falsificación, el servidor ve la pila TLS de Go/Chrome, revelando instantáneamente un proxy.
1.3 Fingerprint HTTP/2 (formato Akamai)
Qué es: El prefacio de conexión HTTP/2 y las tramas SETTINGS varían según el navegador.
Señales:
- Parámetros de la trama SETTINGS (MAX_CONCURRENT_STREAMS, INITIAL_WINDOW_SIZE, MAX_FRAME_SIZE, etc.)
- Orden de SETTINGS
- Comportamiento de PING
- Tiempo de WINDOW_UPDATE
- Estructura de trama PRIORITY
- Octetos mágicos (PRI * HTTP/2.0)
Veredicto: Parcial — Falsificable si Obscura implementa HTTP/2 personalizado, pero complejo. Si se usa net/http de Go, el servidor verá el fingerprint HTTP/2 de Go.
1.4 Fingerprint QUIC / HTTP/3
Qué es: QUIC (HTTP/3) usa UDP y está cifrado de extremo a extremo — no puede ser interceptado.
Señales:
- Parámetros de transporte QUIC
- Longitud del ID de conexión
- Negociación de versión
- Handshake TLS 1.3 sobre QUIC
Veredicto: No falsificable — QUIC evita el proxy por completo. Obscura debe bloquear QUIC (UDP 443) para forzar HTTP/1.1 o HTTP/2 sobre TCP.
1.5 Fingerprint DNS
Qué es: Patrones de consulta DNS y elección del resolver.
Señales:
- IP del resolver DNS (Cloudflare 1.1.1.1 vs Google 8.8.8.8 vs ISP)
- DNS sobre HTTPS vs DNS sobre TLS vs DNS plano
- Opciones EDNS0
- Patrones de temporización de consultas DNS
- Soporte DNSSEC
Veredicto: Falsificable — Obscura controla la resolución DNS completamente.
1.6 Fuga de IP por WebRTC
Qué es: WebRTC puede revelar la IP local y pública real incluso detrás de VPN/proxy.
Mecanismo:
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] })
pc.createDataChannel('')
pc.createOffer().then(offer => pc.setLocalDescription(offer))
// Los candidatos ICE revelan IPs locales y públicas
Veredicto: Parcial — Puede bloquearse mediante inyección JS (anulación de RTCPeerConnection), pero el bloqueo es detectable.
1.7 Geolocalización IP
Qué es: La dirección IP revela país, ciudad, ISP, ASN, latitud/longitud.
Veredicto: Falsificable — Usa una VPN/Tor como upstream desde Obscura, o enruta a través de un nodo de salida.
1.8 API Network Information
Qué es: navigator.connection expone el tipo de red.
navigator.connection.effectiveType // "4g", "3g", "2g", "slow-2g"
navigator.connection.downlink // Estimación de Mbps
navigator.connection.rtt // Tiempo de ida y vuelta (ms)
navigator.connection.saveData // Modo ahorro de datos
Veredicto: Falsificable mediante inyección JS.
1.9 Ataques de Temporización (Latencia de Red)
Qué es: Medir tiempos de carga de recursos revela características de la red.
Mecanismo: Usar performance.now() antes/después de cargar recursos para medir latencia.
Veredicto: Parcial — La precisión de performance.now() puede reducirse, pero la temporización gruesa sigue funcionando.
1.10 Detección de Proxy/VPN
Qué es: Los servidores detectan proxies mediante:
- Headers HTTP (
Via,X-Forwarded-For,X-Real-IP) - Discrepancia de fingerprint TLS (User-Agent Chrome + TLS Go)
- Inconsistencia del resolver DNS
- IP en rangos conocidos de proxy/VPN
- Discrepancia entre zona horaria y geolocalización IP
Veredicto: Parcial — Requiere un perfil consistente en todas las capas.
1.11 Detección de Filtros de Contenido
Qué es: Detectar bloqueadores de anuncios y herramientas de privacidad mediante:
- Patrones de recursos bloqueados (detección EasyList)
- Pruebas de selectores CSS
- Temporización de recursos bloqueados
- Presencia/ausencia de elementos DOM
Veredicto: Detectable — Si Obscura bloquea dominios, puede ser detectado probando dominios de rastreo conocidos.
1.12 Comportamiento de Caché HTTP/HTTPS
Qué es: Temporización de caché / rastreo ETag entre sitios.
Veredicto: Parcial — Puede limpiar/deshabilitar headers de caché mediante el proxy.
1.13 Comportamiento OCSP/CRL
Qué es: Patrones de verificación de revocación de certificados.
Veredicto: No falsificable — Difícil de controlar a nivel de proxy sin romper TLS.
Capa 2: HTTP y Headers (12 vectores)
2.1 User-Agent
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
Veredicto: Falsificable
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: "" (escritorio) / "Pixel 7" (móvil)
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
Veredicto: Falsificable
2.3 Headers Accept
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
Veredicto: Falsificable
2.4 Content-Type / Content-Encoding
Veredicto: Falsificable
2.5 Do Not Track / Global Privacy Control
DNT: 1
Sec-GPC: 1
Veredicto: Falsificable
2.6 Upgrade-Insecure-Requests
Upgrade-Insecure-Requests: 1
Veredicto: Falsificable
2.7 Referer / Origin
Veredicto: Parcial — Puede eliminar/modificar, pero rompe algunos sitios.
2.8 Comportamiento de Cookies
Señales: cookies habilitadas/deshabilitadas, bloqueo de cookies de terceros, preferencias de expiración de cookies.
Veredicto: Parcial — Puede establecer cookies en el proxy, pero la configuración de cookies del propio navegador se filtra mediante JS.
2.9 Headers de Caché
ETag, If-None-Match, Cache-Control, Pragma
Veredicto: Falsificable en el proxy.
2.10 Headers de Conexión
Connection, Keep-Alive, Upgrade
Veredicto: Falsificable
2.11 Headers de Proxy
Via, X-Forwarded-For, X-Real-IP, Forwarded
Veredicto: Falsificable — Eliminar todos los headers de proxy.
2.12 Prioridad / Prioridad de Carga
Sec-Purpose, Sec-Fetch-*, Priority
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Veredicto: Falsificable
Capa 3: APIs JavaScript / DOM (44 vectores de FingerprintJS)
Estas son todas las señales recopiladas por la librería de código abierto de FingerprintJS. Cada una es un archivo fuente .ts.
| # | Archivo Fuente | Señal Recopilada | Falsificable mediante Inyección JS |
|---|---|---|---|
| 1 | userAgentData |
navigator.userAgentData (brands, platform, mobile, architecture, bitness, model, platformVersion, wow64, fullVersionList, formFactors) |
Sí |
| 2 | fonts |
Fuentes del sistema instaladas (vía CSS @font-face + medición) |
Parcial — puede limitar pero no falsear |
| 3 | domBlockers |
Detección de bloqueadores de anuncios/contenido mediante recursos de prueba | Parcial |
| 4 | fontPreferences |
Preferencias de renderizado de fuentes (espaciado entre letras, métricas de fuente) | Parcial |
| 5 | audio |
Hash de salida de oscilador AudioContext + DynamicsCompressor | Parcial — puede inyectar ruido |
| 6 | screenFrame |
Dimensiones del marco de pantalla (availTop, availLeft) | Sí |
| 7 | canvas |
Hash de renderizado Canvas 2D (texto + formas) | Parcial — inyección de ruido |
| 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 |
Si sessionStorage está disponible |
Sí (anulación) |
| 16 | localStorage |
Si localStorage está disponible |
Sí (anulación) |
| 17 | indexedDB |
Si indexedDB está disponible |
Sí (anulación) |
| 18 | openDatabase |
Si existe window.openDatabase |
Sí (anulación) |
| 19 | cpuClass |
navigator.cpuClass (IE heredado) |
Sí |
| 20 | platform |
navigator.platform |
Sí |
| 21 | plugins |
navigator.plugins (lista de plugins instalados) |
Parcial |
| 22 | touchSupport |
navigator.maxTouchPoints, soporte de eventos táctiles |
Sí |
| 23 | vendor |
navigator.vendor |
Sí |
| 24 | vendorFlavors |
navigator.vendorSub, navigator.productSub |
Sí |
| 25 | cookiesEnabled |
navigator.cookieEnabled |
Sí |
| 26 | colorGamut |
Soporte de gama de colores (sRGB, P3, Rec2020) mediante media query | Sí |
| 27 | invertedColors |
Configuración de colores invertidos del SO | Sí |
| 28 | forcedColors |
Modo de colores forzados del SO | Sí |
| 29 | monochrome |
Profundidad de color monocromo mediante media query | Sí |
| 30 | contrast |
Preferencia de contraste mediante media query | Sí |
| 31 | reducedMotion |
Media query prefers-reduced-motion |
Sí |
| 32 | reducedTransparency |
Media query prefers-reduced-transparency |
Sí |
| 33 | hdr |
Soporte HDR mediante window.matchMedia |
Sí |
| 34 | math |
Fingerprint de matemáticas de punto flotante (diferencias de precisión) | No falsificable — comportamiento FPU hardware |
| 35 | pdfViewerEnabled |
navigator.pdfViewerEnabled |
Sí |
| 36 | architecture |
navigator.userAgentData.architecture (x86, arm) |
Sí |
| 37 | applePay |
Disponibilidad de Apple Pay | Sí (anulación) |
| 38 | privateClickMeasurement |
Soporte de Private Click Measurement API | Sí (anulación) |
| 39 | audioBaseLatency |
Latencia base de AudioContext (dependiente del hardware) | No falsificable — audio hardware |
| 40 | dateTimeLocale |
Configuración regional resuelta de Intl.DateTimeFormat |
Sí |
| 41 | webGlBasics |
Renderizador WebGL, vendor, versión, precisión de shader | Parcial — puede bloquear debug_info |
| 42 | webGlExtensions |
Lista de extensiones WebGL soportadas | Parcial — puede bloquear listado |
| 43 | vendor (navigator) |
navigator.vendor (ej., "Google Inc.") |
Sí |
| 44 | mimeTypes |
Manejadores MIME registrados en navigator.mimeTypes |
Parcial |
Resumen de vectores de FingerprintJS:
| Capacidad de falsificación | Conteo |
|---|---|
| Totalmente falsificable mediante inyección JS | 29 |
| Parcialmente falsificable | 13 |
| No falsificable | 2 |
Capa 4: Características y Capacidades del Navegador (25+ vectores)
De "Features Detection" de BrowserLeaks, lo siguiente se usa para fingerprinting:
4.1 Soporte de Funcionalidades Web (vector binario sí/no)
Cada funcionalidad soportada/no soportada añade ~1 bit de entropía:
- Canvas, Canvas Text
- SVG (inline, como img, clip-path, SMIL, filtros, 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
- Características CSS (grid, flexbox, transforms 3D, backdrop-filter, etc.)
Total: ~100+ pruebas de características, pero la mayoría están altamente correlacionadas (Chrome soporta X, Firefox no). Entropía efectiva: ~10-15 bits.
Veredicto: Parcial — Puede inyectar anulaciones de detección de características, pero muy complejo de mantener.
4.2 Fingerprinting mediante Media Queries CSS
Qué es: Fuerza bruta de dimensiones de pantalla mediante @media queries CSS.
@media (width: 1920px) { ... }
@media (height: 1080px) { ... }
@media (device-width: 1920px) { ... }
@media (resolution: 1.5dppx) { ... }
Veredicto: Parcial — La detección basada en CSS se ejecuta antes de la inyección JS.
4.3 Fingerprinting de ClientRects
Qué es: Element.getClientRects() devuelve diferentes valores para elementos invisibles según el navegador/SO.
Veredicto: No falsificable desde el proxy — El diseño DOM es específico del navegador.
Capa 5: Sistema y Hardware (15 vectores)
5.1 Fingerprint de GPU
Fuentes:
WEBGL_debug_renderer_info.UNMASKED_RENDERER_WEBGL(modelo exacto de GPU)- WebGPU
adapterInfo(vendor, architecture, device, driver, backend) - Diferencias de renderizado Canvas
- Precisión de shader WebGL
- Soporte de extensiones WebGL
Entropía: Muy alta — el modelo exacto de GPU es altamente identificador.
Veredicto: Parcial — Puede bloquear UNMASKED_RENDERER_INFO e información de WebGPU adapter, pero los fingerprints basados en renderizado permanecen.
5.2 Fingerprint de CPU
Fuentes:
navigator.hardwareConcurrency(número de núcleos)- Precisión matemática FPU (diferencias en operaciones de punto flotante)
- Resolución de
performance.now() - Detección de características CPU basada en Wasm (SIMD, AES-NI, etc.)
Veredicto: No falsificable para precisión matemática y detección CPU mediante Wasm.
5.3 Fingerprint de Memoria
Fuente: navigator.deviceMemory (RAM en GB, solo en Chrome)
Veredicto: Falsificable
5.4 Fingerprint de Almacenamiento
Fuentes:
- LocalStorage, SessionStorage, IndexedDB, Cache API availability
- Quota storage management API
- Disponibilidad de WebSQL
Veredicto: Falsificable
5.5 Fingerprinting de Fuentes
Fuentes:
- Fuentes del sistema instaladas (enumeración mediante medición basada en CSS
@font-face) - Métricas de renderizado de fuentes (espaciado, altura, anchura con fuentes específicas)
- Soporte de rangos de glifos Unicode
Entropía: Muy alta — la lista de fuentes puede tener >1000 fuentes.
Veredicto: Parcial — Puede limitar la enumeración de fuentes anulando funciones de medición, pero las diferencias de renderizado de fuentes persisten.
5.6 Fingerprint de Pantalla
Fuentes:
screen.width,screen.height,availWidth,availHeight,availTop,availLeftscreen.colorDepth,screen.pixelDepthwindow.devicePixelRatiowindow.outerWidth,window.outerHeightwindow.innerWidth,window.innerHeightscreen.orientation- Detección multi-monitor mediante
ScreenDetailedAPI
Veredicto: Falsificable mediante inyección JS.
5.7 Fingerprint de Método de Entrada
Fuentes:
navigator.maxTouchPoints- Soporte de eventos táctiles
- Soporte de Pointer events
- Diseño de teclado / método de entrada
Veredicto: Falsificable para soporte táctil. No falsificable para diseño de teclado.
5.8 Fingerprint de Hardware de Audio
Fuentes:
- Frecuencia de muestreo de AudioContext
- Latencia base de AudioContext
- Salida de DynamicsCompressorNode (dependiente del hardware)
- Número de canales de audio
- Soporte de cancelación de eco, supresión de ruido
Veredicto: No falsificable — procesamiento de audio hardware.
5.9 Battery API
Fuentes:
navigator.getBattery().levelnavigator.getBattery().chargingnavigator.getBattery().chargingTimenavigator.getBattery().dischargingTime
Veredicto: Falsificable mediante inyección JS.
5.10 Media Devices
Fuentes:
navigator.mediaDevices.enumerateDevices()- Número y tipo de cámaras, micrófonos, altavoces
Veredicto: Falsificable mediante inyección JS (devuelve lista de dispositivos vacía o genérica).
Capa 6: Comportamiento y Sesión (8 vectores)
6.1 Comportamiento del Ratón / Táctil
Qué es: Patrones de movimiento del ratón, tiempo de clic, gestos táctiles.
Veredicto: No falsificable — biometría del comportamiento, sin control del proxy.
6.2 Dinámica de Teclado
Qué es: Velocidad de escritura, duración de presión de tecla, intervalos entre teclas.
Veredicto: No falsificable
6.3 Comportamiento de Desplazamiento
Qué es: Velocidad de desplazamiento, patrones de aceleración.
Veredicto: No falsificable
6.4 Duración de Sesión / Tiempo en Página
Qué es: Tiempo pasado en páginas, patrones de navegación.
Veredicto: No falsificable
6.5 Rendimiento de Temporización
Señales:
performance.now()temporización de grano finoperformance.timeOrigin- Navigation timing API (
performance.getEntriesByType('navigation'))
Veredicto: Parcial — La precisión de performance.now() puede reducirse.
6.6 Detección Multi-Ventana / Multi-Pestaña
Qué es: Comunicación entre pestañas mediante BroadcastChannel, SharedWorker, localStorage.
Veredicto: Parcial mediante inyección JS.
6.7 Persistencia de Service Worker
Qué es: Detectar si un SW está registrado, estado de caché.
Veredicto: Parcial — puede anularse, pero el ámbito de SW es complejo.
6.8 Zona Horaria / Clock Skew
Qué es: Zona horaria del sistema + desviación de reloj precisa desde la hora del servidor.
Veredicto: Falsificable para zona horaria. Parcial para clock skew.
Resumen de Conteo de Vectores
| Capa | Categoría | Conteo | Falsificable por Proxy | Parcial | No falsificable |
|---|---|---|---|---|---|
| 1 | Red y Protocolo | 13 | 3 | 6 | 4 |
| 2 | HTTP y Headers | 12 | 11 | 1 | 0 |
| 3 | APIs JavaScript / DOM | 44 | 29 | 13 | 2 |
| 4 | Características del Navegador | ~100+ | 0 | ~10 | ~90+ |
| 5 | Sistema y Hardware | 15 | 6 | 4 | 5 |
| 6 | Comportamiento y Sesión | 8 | 1 | 4 | 3 |
| Total (vectores distintos únicos) | ~60+ | ~50 | ~38 | ~100+ |
Implicaciones para Obscura
- ~50 vectores son totalmente controlables a nivel de proxy/inyección JS
- ~38 vectores pueden mitigarse parcialmente pero no perfectamente
- ~100+ vectores están fuera del control de Obscura (hardware, comportamiento, flags de características)
Protección realista: Un despliegue bien configurado de Obscura puede controlar ~55% de la superficie de fingerprinting, pero el ~45% restante aún filtra información. Combinado con bloqueo DNS de dominios de fingerprinting conocidos, la protección efectiva es significativa pero no absoluta.