Huella digital

Fingerprinting del Navigator: fugas del navegador

Cómo navigator.platform, hardwareConcurrency y deviceMemory exponen tu identidad, y cómo asegurar propiedades del navigator consistentes.

Documentación

Prefieres la documentación del producto mantenida?

Este artículo tiene una página equivalente en el centro de documentación. Usa los docs para el flujo canónico, las flags actuales y la referencia duradera.

Introducción

El objeto navigator en JavaScript es una de las fuentes más accesibles de información del dispositivo disponible para cualquier sitio web. Propiedades como navigator.platform, navigator.hardwareConcurrency, navigator.deviceMemory, navigator.userAgent y navigator.languages revelan detalles sobre tu sistema operativo, CPU, RAM y configuración del navegador. Individualmente, cada propiedad proporciona un poder de identificación limitado. Combinadas, forman una huella digital compuesta que reduce significativamente la población de usuarios. A diferencia de las API experimentales que pueden requerir permisos, las propiedades del navigator están disponibles universalmente, ampliamente soportadas y son consultadas por prácticamente todos los scripts de rastreo en la web. Este artículo explica cómo las propiedades del navigator contribuyen al fingerprinting y cómo BotBrowser proporciona valores consistentes basados en perfiles para cada propiedad.

Impacto en la privacidad

Las propiedades del navigator son la capa fundamental del fingerprinting del navegador. Cada script de rastreo comienza con el navigator, porque los datos son gratuitos, no requieren permisos y están disponibles inmediatamente.

Un estudio de 2020 de la Universidad de Iowa analizó más de 100,000 huellas digitales de navegadores y descubrió que la combinación de navigator.userAgent, navigator.platform, navigator.hardwareConcurrency, navigator.deviceMemory y navigator.languages proporcionaba un promedio de 12.8 bits de información identificativa. Para contexto, 12.8 bits pueden distinguir aproximadamente 7,000 configuraciones únicas. Añadiendo la resolución de pantalla y la zona horaria, la combinación típicamente identifica de forma única a más del 90% de los usuarios.

El Grupo de Interés de Privacidad del W3C ha documentado extensamente las implicaciones de privacidad de las propiedades del navigator. Su documento de orientación sobre fingerprinting lista hardwareConcurrency, deviceMemory y languages como superficies de "alta entropía" que contribuyen significativamente al rastreo entre sitios. A pesar de esto, estas propiedades permanecen disponibles sin restricciones en todos los navegadores principales porque demasiadas aplicaciones web legítimas dependen de ellas.

Los entornos empresariales y de desarrollo enfrentan un riesgo adicional. Valores no estándar como hardwareConcurrency de 64 núcleos (pruebas en servidores), deviceMemory de 0.25 GB (dispositivos embebidos) o combinaciones de idiomas inusuales destacan inmediatamente en cualquier población.

Contexto técnico

El objeto navigator contiene docenas de propiedades. Estas son las más significativas para el fingerprinting:

Propiedades de identidad principales

  • navigator.userAgent - La cadena de agente de usuario. Contiene nombre del navegador, versión, nombre del SO y versión del SO. A pesar de los esfuerzos de deprecación, sigue siendo la propiedad más consultada.
  • navigator.platform - Devuelve una cadena que identifica la plataforma: "Win32", "MacIntel", "Linux x86_64", "Linux armv81", etc.
  • navigator.vendor - Devuelve el proveedor del navegador. "Google Inc." para navegadores basados en Chrome/Chromium, "" para Firefox, "Apple Computer, Inc." para Safari.

Propiedades de hardware

  • navigator.hardwareConcurrency - Devuelve el número de núcleos lógicos de CPU. Los valores comunes van de 2 a 16 para dispositivos de consumo. Valores superiores a 16 o inferiores a 4 reducen significativamente la población.
  • navigator.deviceMemory - Devuelve la RAM aproximada en GB. Los valores posibles son 0.25, 0.5, 1, 2, 4 y 8 (máximo 8). Esta API solo está disponible en navegadores basados en Chromium.

Propiedades de locale e idioma

  • navigator.language - Devuelve el idioma preferido (ej., "en-US").
  • navigator.languages - Devuelve un array de idiomas preferidos en orden (ej., ["en-US", "en", "fr"]).

Propiedades de conexión y medios

  • navigator.connection - La API NetworkInformation, que expone effectiveType, downlink, rtt y saveData. Estos valores reflejan las condiciones de red pero son lo suficientemente estables para contribuir al fingerprinting.
  • navigator.mediaDevices - La enumeración de dispositivos de medios revela el número y tipos de cámaras, micrófonos y salidas de audio.

User Agent Client Hints

Los navegadores Chromium modernos también exponen navigator.userAgentData, que proporciona acceso estructurado a la marca del navegador, plataforma y estado móvil. El método de alta entropía getHighEntropyValues() devuelve información detallada sobre versión de plataforma, arquitectura, bits y modelo del dispositivo.

Por qué estos valores varían

Los valores de las propiedades del navigator dependen de:

  • Sistema operativo. Las cadenas de plataforma, idiomas predeterminados y API de memoria disponibles difieren según el SO.
  • Hardware. El conteo de núcleos de CPU y el tamaño de memoria dependen del hardware.
  • Versión del navegador. Las cadenas de user agent cambian con cada versión. Las marcas y versiones de Client Hints evolucionan.
  • Configuración del usuario. Las preferencias de idioma y configuración regional son controladas por el usuario.

La distribución de estos valores es desigual. Unas pocas configuraciones (Windows 10 con 8 núcleos y 8 GB de RAM, idioma en-US) son muy comunes. Todo lo demás es progresivamente más raro y más identificable.

Enfoques de protección comunes y sus limitaciones

La suplantación del user agent es el enfoque más antiguo y común. Las extensiones o configuraciones del navegador cambian navigator.userAgent a una cadena diferente. El problema: la mayoría de las herramientas de suplantación solo cambian la cadena de UA sin ajustar otras propiedades correlacionadas. Afirmar ser macOS a través del user agent mientras navigator.platform dice "Win32" es una inconsistencia obvia.

Las VPN no tienen efecto en las propiedades del navigator. Estos valores son determinados por el navegador y el sistema operativo, no por la red.

El modo incógnito/privado no cambia las propiedades del navigator. Tu huella digital es idéntica en la navegación normal y privada.

Las extensiones de navegador que modifican las propiedades del navigator operan en JavaScript y pueden ser detectadas por sí mismas. La presencia de getters modificados en las propiedades del navigator es detectable a través de la inspección de la cadena de prototipos y análisis de temporización.

La aleatorización de propiedades del navigator crea combinaciones irreales. Un dispositivo con 3 núcleos de CPU, 3 GB de memoria y una cadena de plataforma "Win64" no corresponde a ningún hardware real. Estas combinaciones son más únicas e identificables que los valores honestos.

El desafío fundamental es la consistencia. Las propiedades del navigator deben formar un conjunto coherente que coincida con una configuración real de dispositivo. La plataforma debe coincidir con el user agent. El conteo de núcleos debe ser realista para el hardware reportado. La memoria debe alinearse con la plataforma. Los idiomas deben ser plausibles para el locale reportado.

Enfoque a nivel del motor de BotBrowser

BotBrowser configura todas las propiedades del navigator a través de su sistema de perfiles a nivel del motor. Cuando se carga un perfil, cada propiedad del objeto navigator devuelve valores derivados del dispositivo perfilado.

Cobertura completa de propiedades

Los perfiles de BotBrowser definen valores para todas las propiedades del navigator relevantes para el fingerprinting:

  • userAgent, appVersion, platform, vendor y appCodeName son todos consistentes con el navegador y SO perfilados.
  • hardwareConcurrency coincide con la configuración de CPU del dispositivo perfilado.
  • deviceMemory coincide con el nivel de RAM del dispositivo perfilado.
  • language y languages coinciden con el locale perfilado.
  • userAgentData (marcas, plataforma, flag móvil, fullVersionList) se genera para coincidir con la marca y versión del navegador perfilado.

Consistencia interna

La ventaja crítica del enfoque de BotBrowser es que todas las propiedades se derivan de un único perfil coherente. No hay escenario donde platform diga "MacIntel" mientras userAgent contiene "Windows NT 10.0". El perfil define la identidad del dispositivo y todas las propiedades del navigator la reflejan.

Esto se extiende a User Agent Client Hints. Cuando un sitio llama a navigator.userAgentData.getHighEntropyValues(), la plataforma, platformVersion, arquitectura, bits, modelo y fullVersionList devueltos coinciden con el perfil. Los encabezados HTTP Sec-CH-UA-* enviados con las solicitudes coinciden con los valores de JavaScript.

Control de información de red

Con el flag --bot-network-info-override, BotBrowser también controla los valores de navigator.connection (rtt, downlink, effectiveType, saveData) y los encabezados Client Hints correspondientes. Esto asegura que las propiedades del navigator relacionadas con la red se alineen con el perfil.

Consistencia en Workers

Las propiedades del navigator también están disponibles en Web Workers y Service Workers. BotBrowser asegura que los mismos valores se devuelvan en todos los contextos de ejecución, incluyendo workers dedicados, compartidos y service workers. No hay brecha donde un worker devuelva tus valores reales de hardware mientras el hilo principal devuelve valores del perfil.

Configuración y uso

Carga básica de perfil

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Todas las propiedades del navigator se configuran automáticamente desde el perfil.

Anulación de idioma y locale

# Auto-detección desde IP (predeterminado)
chrome --bot-profile="/path/to/profile.enc" \
       --bot-config-languages=auto \
       --bot-config-locale=auto

# Anulación manual
chrome --bot-profile="/path/to/profile.enc" \
       --bot-config-languages="fr-FR,fr,en" \
       --bot-config-locale="fr-FR"

Anulación de información de red

chrome --bot-profile="/path/to/profile.enc" \
       --bot-network-info-override

Integración con Playwright

const { chromium } = require('playwright');

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-config-languages=auto',
    '--bot-config-locale=auto',
    '--bot-config-timezone=auto'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

// Verificar propiedades del navigator
const platform = await page.evaluate(() => navigator.platform);
const cores = await page.evaluate(() => navigator.hardwareConcurrency);
console.log(`Platform: ${platform}, Cores: ${cores}`);

Integración con Puppeteer

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({
  executablePath: '/path/to/botbrowser/chrome',
  defaultViewport: null,
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-network-info-override'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

Verificación

Verificación de consistencia de propiedades. Consulta todas las propiedades del navigator y verifica que formen un conjunto coherente. La plataforma debe coincidir con el SO del user agent. El conteo de núcleos debe ser realista para la plataforma. La memoria debe ser plausible.

Verificación de Client Hints. Usa navigator.userAgentData.getHighEntropyValues(['platform', 'platformVersion', 'architecture', 'bitness', 'model', 'fullVersionList']) y confirma que los valores coincidan con el perfil. Verifica que los encabezados HTTP Sec-CH-UA-* coincidan con los valores de JavaScript.

Consistencia en workers. Ejecuta las mismas consultas de propiedades del navigator en un Web Worker y compara los resultados con el hilo principal. Deben ser idénticos.

Estabilidad entre sesiones. Consulta las propiedades del navigator en múltiples sesiones con el mismo perfil. Todos los valores deben ser idénticos.

Mejores prácticas

  • Siempre carga un perfil. Sin --bot-profile, las propiedades del navigator reflejan tu sistema real. El perfil es lo que proporciona valores controlados.
  • Usa auto-detección para señales de locale. --bot-config-timezone=auto, --bot-config-locale=auto y --bot-config-languages=auto derivan el locale desde la IP de tu proxy, manteniendo las propiedades de idioma del navigator consistentes con tu ubicación aparente.
  • No anules manualmente propiedades individuales. El perfil asegura la consistencia interna. Anular una propiedad (como hardwareConcurrency) sin ajustar valores correlacionados crea inconsistencias.
  • Monitorea los cambios de formato del user agent. Las cadenas de user agent del navegador cambian con cada versión. Usa perfiles actuales del repositorio de perfiles de BotBrowser para mantenerte al día.
  • Prueba tanto en el hilo principal como en workers. Verifica la consistencia del navigator en todos los contextos de ejecución.

FAQ

P: ¿navigator.hardwareConcurrency realmente ayuda a identificar usuarios? R: Sí. Aunque los valores comunes (4, 8) son compartidos por muchos usuarios, los valores poco comunes (1, 2, 6, 24, 64) son altamente identificables. Combinados con otras propiedades del navigator, incluso los valores comunes contribuyen a la huella digital general.

P: ¿Qué pasa con navigator.deviceMemory en Firefox o Safari? R: deviceMemory es una API exclusiva de Chromium. Firefox y Safari no la exponen. Los perfiles de BotBrowser para Chrome/Edge/Brave incluyen valores de deviceMemory. Si un perfil apunta a un navegador que no soporta esta API, no se expone.

P: ¿Los sitios web pueden detectar si las propiedades del navigator han sido modificadas? R: Las modificaciones mal implementadas (anulaciones de JavaScript) pueden detectarse a través de la inspección de prototipos y análisis de temporización. El control a nivel del motor de BotBrowser modifica las propiedades en la fuente, por lo que no hay artefactos visibles en JavaScript.

P: ¿BotBrowser maneja los cambios de reducción de User-Agent (UA-CH)? R: Sí. BotBrowser genera encabezados User Agent Client Hints (Sec-CH-UA-*) apropiados y valores de navigator.userAgentData que coinciden con el perfil. La cadena de user agent reducida y los hints de alta entropía son ambos consistentes.

P: ¿Cómo maneja BotBrowser navigator.webdriver? R: BotBrowser controla la propiedad navigator.webdriver a través de su sistema de perfiles, asegurando que devuelva el valor esperado para el contexto de navegación.

P: ¿Las propiedades del navigator se ven afectadas por el flag --bot-noise-seed? R: Las propiedades del navigator son valores determinísticos (conteo de núcleos, memoria, plataforma) que no involucran ruido. Provienen directamente del perfil. El noise seed afecta las salidas de renderizado (canvas, WebGL, audio), no las propiedades de identidad de hardware.

Resumen

Las propiedades del navigator forman la capa fundamental del fingerprinting del navegador. Son universalmente accesibles, no requieren permisos y proporcionan información identificativa significativa cuando se combinan. BotBrowser controla todas las propiedades del navigator a nivel del motor a través de su sistema de perfiles, asegurando consistencia interna en el user agent, plataforma, hardware, locale y API de client hints. Combinado con la auto-detección para zona horaria, locale y configuración de idioma, BotBrowser produce una identidad de navegador coherente que coincide con una configuración real de dispositivo.

Para temas relacionados, consulta Qué es el fingerprinting del navegador, Control de conteo de núcleos de CPU, Protección de pantalla y ventana y Zona horaria, locale e idioma.

#Navigator#fingerprinting#identidad del navegador#Privacy

Lleva BotBrowser de la investigación a producción

Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.