Saltar al contenido principal
es/blog/obscura/research/fingerprint-vectors-catalog/

obscura/research/fingerprint-vectors-catalog

15 min de lectura

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)
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)
7 canvas Hash de renderizado Canvas 2D (texto + formas) Parcial — inyección de ruido
8 osCpu navigator.oscpu (Firefox)
9 languages navigator.languages, navigator.language
10 colorDepth screen.colorDepth
11 deviceMemory navigator.deviceMemory
12 screenResolution screen.width, screen.height
13 hardwareConcurrency navigator.hardwareConcurrency
14 timezone Intl.DateTimeFormat().resolvedOptions().timeZone
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)
20 platform navigator.platform
21 plugins navigator.plugins (lista de plugins instalados) Parcial
22 touchSupport navigator.maxTouchPoints, soporte de eventos táctiles
23 vendor navigator.vendor
24 vendorFlavors navigator.vendorSub, navigator.productSub
25 cookiesEnabled navigator.cookieEnabled
26 colorGamut Soporte de gama de colores (sRGB, P3, Rec2020) mediante media query
27 invertedColors Configuración de colores invertidos del SO
28 forcedColors Modo de colores forzados del SO
29 monochrome Profundidad de color monocromo mediante media query
30 contrast Preferencia de contraste mediante media query
31 reducedMotion Media query prefers-reduced-motion
32 reducedTransparency Media query prefers-reduced-transparency
33 hdr Soporte HDR mediante window.matchMedia
34 math Fingerprint de matemáticas de punto flotante (diferencias de precisión) No falsificable — comportamiento FPU hardware
35 pdfViewerEnabled navigator.pdfViewerEnabled
36 architecture navigator.userAgentData.architecture (x86, arm)
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
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.")
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, availLeft
  • screen.colorDepth, screen.pixelDepth
  • window.devicePixelRatio
  • window.outerWidth, window.outerHeight
  • window.innerWidth, window.innerHeight
  • screen.orientation
  • Detección multi-monitor mediante ScreenDetailed API

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().level
  • navigator.getBattery().charging
  • navigator.getBattery().chargingTime
  • navigator.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 fino
  • performance.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.