Saltar al contenido principal
es/blog/obscura/research/js-api-fingerprinting/

obscura/research/js-api-fingerprinting

3 min de lectura

Resumen

Las APIs JavaScript del navegador exponen una amplia gama de información del sistema y del navegador. Estas señales pueden interceptarse y modificarse mediante inyección JS a nivel de proxy.

Vectores de API

Navigator API

Propiedad Información Filtrada Falsificable mediante JS
navigator.userAgent Cadena navegador/SO
navigator.platform Plataforma del SO
navigator.language Idioma principal
navigator.languages Preferencias de idioma
navigator.hardwareConcurrency Número de núcleos CPU
navigator.deviceMemory RAM en GB
navigator.maxTouchPoints Soporte táctil
navigator.webdriver Detección de automatización
navigator.plugins Plugins instalados Limitado
navigator.mimeTypes Soporte MIME Limitado
navigator.cookieEnabled Estado de cookies
navigator.doNotTrack Preferencia de privacidad
navigator.pdfViewerEnabled Soporte PDF

Screen API

Propiedad Información Filtrada Falsificable mediante JS
screen.width Resolución de pantalla
screen.height Resolución de pantalla
screen.availWidth Ancho disponible
screen.availTop Posición de ventana
screen.colorDepth Profundidad de color
screen.pixelDepth Profundidad de píxel
screen.orientation Orientación

Otras APIs

API Información Filtrada Falsificable mediante JS
Intl.DateTimeFormat().resolvedOptions().timeZone Zona horaria
performance.now() Precisión de temporizador Sí (reducida)
Date.now() Clock skew
navigator.connection Tipo de red/RTT
navigator.getBattery() Nivel de batería
navigator.mediaDevices Conteo de cámara/mic

Estrategia de Falsificación

Mediante JS Inyectado

// Anular propiedades de navigator mediante Object.defineProperty
Object.defineProperty(navigator, 'userAgent', {
  get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'
})

Object.defineProperty(navigator, 'platform', {
  get: () => 'Win32'
})

Object.defineProperty(navigator, 'hardwareConcurrency', {
  get: () => 8
})

Desafíos

  1. Temporización: El script inyectado debe ejecutarse antes que los scripts propios de la página. Requiere inyección al principio de <head>.


  2. Frameworks: Algunos frameworks (Next.js, Angular) usan SSR o scripts inline que se ejecutan antes del JS inyectado.



  3. Service Workers: Los SW pueden interceptar y modificar respuestas antes de la inyección.


  4. Detección: Un sitio puede detectar anulaciones verificando Object.getOwnPropertyDescriptor() o comparando múltiples señales en busca de inconsistencias.

Conclusiones

  • ~25 señales de API JS son falsificables mediante inyección JS del proxy
  • Requiere inyección cuidadosa en la etapa de análisis HTML
  • La temporización es crítica (inyectar antes de cualquier script de página)
  • No puede anular todas las APIs (algunas tienen respaldo C++ en el navegador)
  • Debe mantener consistencia entre señales (ej., plataforma Win32 + User-Agent Windows)