Categoría: Motor del Navegador / Plataforma Web
1. Descripción
Cada motor de navegador (Blink/Chrome, Gecko/Firefox, WebKit/Safari) implementa un subconjunto diferente de APIs web y características CSS. Además, cada uno tiene rarezas de renderizado únicas, configuraciones por defecto y patrones de comportamiento. Estas son inherentes al navegador — ningún proxy puede cambiarlas porque están compiladas en el binario del navegador.
2. Vectores
2.1 Soporte de Características de API Web
El navegador expone ~100+ pruebas de características que los scripts de fingerprinting enumeran:
Características de alto valor para identificación:
| API | Chrome | Firefox | Safari | Notas |
|---|---|---|---|---|
| WebGL 2 | Todos modernos | |||
| WebGPU | (flag) | Solo Chrome | ||
| WebUSB | Solo Chrome | |||
| Web Bluetooth | Solo Chrome | |||
| Web NFC | Android | Solo Chrome | ||
| Web Serial | Solo Chrome | |||
| Web Share | Varía según plataforma | |||
| Battery API | Solo Firefox | |||
| Speech Synthesis | Varía según voz | |||
| GamePad API | Parcial | Safari limitado | ||
| MathML | Solo Firefox/Safari | |||
| Web Workers | Todos, pero Shared Workers varía | |||
| Service Workers | Todos modernos | |||
| CSS Container Queries | Safari tardío en adoptar | |||
| CSS Subgrid | Safari tardío en adoptar |
Entropía: ~10-15 bits (pero altamente correlacionado — se reduce a familia de navegador + versión)
2.2 Soporte de Características CSS
Cientos de propiedades y valores CSS varían según el navegador:
/* Prueba mediante @supports */
@supports (backdrop-filter: blur(1px)) { /* Chrome + Safari */ }
@supports (-webkit-backdrop-filter: blur(1px)) { /* Safari legacy */ }
@supports (accent-color: red) { /* Chrome 93+, Firefox 92+, Safari 15.4+ */ }
@supports (container-type: inline-size) { /* Chrome 105+, Firefox 110+, Safari 16+ */ }
Entropía: ~8-12 bits (identifica motor de navegador + versión principal)
2.3 Rarezas de Implementación del Navegador
Cada navegador tiene un comportamiento de renderizado único:
| Rareza | Ejemplo | Navegador |
|---|---|---|
| Ancho de scrollbar | 12px vs 15px vs 0px (superpuesto) | Dependiente del SO* |
| Estilo de elementos de formulario | Padding de botones, border radius | Específico del motor |
| Renderizado Unicode | Versión de soporte de emojis | Dependiente de SO+navegador |
Comportamiento de <details> |
Animación de abrir/cerrar | Específico del motor |
Análisis de Date() |
Formatos de fecha no estándar | Específico del motor |
Orden de JSON.stringify() |
Orden de enumeración de propiedades | Específico del motor (fijo en ES6) |
Resolución de performance.now() |
5μs vs 100μs vs 1ms | Chrome vs Firefox vs Safari |
*El ancho de scrollbar revela el SO: Windows=12-17px, macOS=variable (fino/superpuesto), Linux=varía
2.4 Métricas de Renderizado de Fuentes
Incluso con las mismas fuentes instaladas, diferentes combinaciones de SO/navegador renderizan el texto de manera diferente:
const span = document.createElement('span')
span.textContent = 'mmmmmmmmmmlli'
document.body.appendChild(span)
const width = span.getBoundingClientRect().width
// La anchura varía según el motor de renderizado de fuentes del SO (FreeType, CoreText, DirectWrite)
Entropía: ~4-6 bits
2.5 Configuración por Defecto del Navegador
Los navegadores vienen con diferentes valores por defecto:
| Configuración | Chrome | Firefox | Safari |
|---|---|---|---|
| Fuente por defecto | Times New Roman | Times New Roman | Times |
| Tamaño de fuente por defecto | 16px | 16px | 16px |
| Tamaño mínimo de fuente | 0px | 0px | 12px (varía) |
| Idioma por defecto | Locale del SO | Locale del SO | Locale del SO |
| Carga automática de imágenes | On | On | On |
| JavaScript | On | On | On |
| Cookies | Permitidas | Permitidas | Permitidas (bloqueadas en privado) |
2.6 Específico de Chrome: Reducción de User-Agent
Chrome reduce progresivamente la información del User-Agent. La nueva API navigator.userAgentData proporciona datos estructurados:
- Lista de marcas (ej.,
"Google Chrome";v="120") - Plataforma (ej.,
"Windows","macOS") - Flag de móvil
- Arquitectura, bitness, modelo, platformVersion (pueden omitirse)
Notable: Safari no implementa userAgentData, y Firefox solo recientemente comenzó. Esto es en sí mismo una señal.
3. Fortalezas del Atacante
| Fortaleza | Explicación |
|---|---|
| No puede cambiarse | Las características del navegador están compiladas en el navegador |
| Sin permiso requerido | Las pruebas de características se ejecutan silenciosamente |
| Enumeración rápida | 100+ características probadas en <10ms |
| Estable entre versiones | Las características rara vez cambian dentro de una versión del navegador |
| Vector binario (sí/no) | Puede combinarse fácilmente en un hash único |
4. Debilidades del Atacante
| Debilidad | Explicación | Explotable? |
|---|---|---|
| Baja entropía individual | Identificación básica del navegador; no usuario individual | No |
| Bloqueable por DNS | Los scripts de detección de características deben cargarse del servidor | Sí |
| Correlacionado | Todos los usuarios de Chrome 120 se ven iguales | No |
| Cambia con actualizaciones | Las actualizaciones del navegador cambian los conjuntos de características | Ocasional |
| El modo privado afecta | Privado/incógnito modifica algunas características | Parcial |
5. Detección de Manipulación
| Técnica | Cómo Funciona |
|---|---|
| Inconsistencia de características | Declarar características de Chrome pero devolver conjunto de características de Firefox |
| Características esperadas faltantes | Chrome sin WebUSB es sospechoso |
| Anomalías de temporización | ¿La enumeración de características tarda demasiado? |
| Vector de características demasiado limpio | Los navegadores reales tienen algunas características raras faltantes |
6. Mitigaciones para Obscura
6.1 Lo Que Obscura Puede Hacer
| Mitigación | Efectividad | Detectabilidad | Implementación |
|---|---|---|---|
| Bloqueo DNS de dominios de fingerprinting | Alta (previene enumeración) | Baja | Gestión de listas de bloqueo |
| Inyectar JS de anulación de características | Baja (demasiadas características) | Alta | Anular APIs individuales |
| Aceptar — las características del navegador son de baja entropía | Pasivo | Ninguna | Documentar riesgo residual |
6.2 Lo Que Obscura No Puede Hacer
| No Puede | Por Qué |
|---|---|
| Añadir características que el navegador no tiene | No puede hacer que Firefox soporte WebUSB |
| Eliminar características que el navegador tiene | No puede deshabilitar características desde el proxy (el usuario puede mediante flags) |
| Cambiar el renderizado CSS | El renderizado está en el motor del navegador |
| Cambiar las métricas de fuentes | El renderizado de fuentes está en el SO/navegador |
6.3 Enfoque Recomendado
1. Bloqueo DNS de dominios de fingerprinting (previene enumeración de características — mejor defensa)
2. Consistencia de perfil (al menos hacer que el navegador declarado coincida con las características reales)
3. Aceptar riesgo residual (el vector de características principalmente identifica versión del navegador, no usuario)
7. Referencias de Investigación
- Eckersley, P. (2010). "How Unique Is Your Web Browser?" PETS 2010.
- Mulazzani, M. et al. (2013). "Fast and Reliable Browser Fingerprinting." ACSAC 2013.
- Laperdrix, P. et al. (2020). "Browser Fingerprinting: A Survey." ACM TOIT.
- Modernizr (2026). "Feature detection library." github.com/modernizr/modernizr.
- BrowserLeaks (2026). "Features Detection." browserleaks.com/features.