volver al inicio Más artículos

Fuga de zona horaria: tu VPN cambia tu IP, no tu reloj

Cargando...

Enciendes la VPN, eliges un servidor en Ámsterdam y cargas una página. Tu dirección IP figura como holandesa en todos los sitios de comprobación de IP que pruebas. Y aun así, el proceso de pago añade un paso extra de verificación, el catálogo de streaming sigue siendo el equivocado, o un inicio de sesión dispara un correo de «nuevo dispositivo». Lo que te delató cabe en una línea de JavaScript: Intl.DateTimeFormat().resolvedOptions().timeZone.

Esa llamada devuelve la zona horaria que tiene configurada tu sistema operativo, y la VPN no tiene influencia alguna sobre ella. Tus paquetes ahora salen de Ámsterdam; tu navegador sigue reportando, tan campante, America/New_York. El widget de esta página ejecuta la misma comparación que haría un script antifraude: consulta la zona horaria que implica tu dirección IP, lee la que reporta tu navegador y comprueba si las dos coinciden.

La versión corta: un sitio web obtiene dos respuestas independientes a «¿dónde está este visitante?»: la zona horaria de la dirección IP y la zona horaria del sistema operativo. Una VPN solo cambia la primera. Compararlas cuesta una sola línea de código, y falsificar la segunda a medias es la única jugada que queda peor que no falsificarla en absoluto.

Dos respuestas a una misma pregunta

La primera respuesta viene de la red. Un sitio web ve la IP desde la que te conectas y la busca en una base de datos de geolocalización: ipinfo.io, MaxMind y sus competidores devuelven todos una zona horaria junto con la ubicación. Con la VPN activada, esa respuesta apunta al servidor de salida: conéctate a través de Ámsterdam y la base de datos dirá Europe/Amsterdam. Cómo se construyen esas bases de datos, y cuánto pueden equivocarse con tu dirección postal, es una historia que contamos en nuestro artículo sobre geolocalización de IP. Pero, a escala de zona horaria, casi nunca fallan.

La segunda respuesta viene de tu sistema operativo. JavaScript puede leer el desfase local respecto a UTC desde los años noventa mediante new Date().getTimezoneOffset(), y los navegadores modernos entregan el nombre completo de la zona IANA a través de la API Intl. Sin diálogo de permisos, sin gesto del usuario, sin rastro en ningún panel de privacidad. Se trata como un metadato corriente, la misma clase de cosa que el tamaño de tu pantalla.

Un visitante, dos respuestas
Lo que dicen tus paquetes
IP de salida de la VPN 198.51.100.7 base de datos geo Europe/Amsterdam
Lo que dice tu navegador
Ajustes de reloj del SO Intl.DateTimeFormat() America/New_York
Discrepancia
Europe/AmsterdamAmerica/New_York — detectado con una simple comparación de cadenas, antes de que hayas hecho clic en nada.
La respuesta de red sale de una consulta de geolocalización sobre la IP desde la que te conectas. La respuesta del navegador sale de tu sistema operativo. Una VPN solo cambia la primera.

Comparar las dos es gratis, así que lo hace todo el que tiene un motivo: la puntuación de fraude en pagos, el control de regiones del streaming, los filtros de fraude publicitario, los sistemas de seguridad de cuentas y las pilas anti-bot que ya ejecutan una docena de comprobaciones de consistencia más.

Por qué la VPN no puede arreglarlo

Una VPN cifra tu tráfico y sustituye la dirección IP que ven los servidores. Ese es todo su cometido. Tu zona horaria nunca viaja por el túnel porque, sencillamente, nunca viaja. Vive en los ajustes de tu sistema operativo, y el navegador la lee en local y se la reporta a cualquier script que pregunte.

El sitio no averigua la hora de tu reloj; averigua el identificador de la zona. America/New_York es una afirmación de ubicación, precisa hasta una franja vertical del planeta, y está a plena vista junto a navigator.language y la cabecera Accept-Language, que hacen el mismo tipo de afirmación sobre dónde vives.

Seamos justos: una discrepancia no demuestra nada por sí sola. La gente viaja con portátiles que todavía se creen en casa, y quien trabaja en remoto mantiene a propósito la zona horaria de su equipo de trabajo. Los sistemas de detección lo saben, y por eso la discrepancia alimenta una puntuación de riesgo en lugar de disparar un bloqueo. Pero las puntuaciones se acumulan: una discrepancia de zona horaria más una IP de centro de datos más una fuga de WebRTC ya no es ambigua, y cada señal hace que la siguiente cuente más.

La trampa de la falsificación a medias

El arreglo obvio es mentir también sobre la zona horaria, y hay un montón de extensiones que ofrecen exactamente eso. La mayoría sobrescribe Intl.DateTimeFormat para que resolvedOptions().timeZone devuelva lo que tú configures. El problema es que tu navegador anuncia su zona horaria en más de un sitio:

  • new Date().getTimezoneOffset() reporta cuántos minutos va tu reloj por detrás de UTC, desde una ruta de código completamente distinta.
  • Date.prototype.toString() escribe el nombre de la zona con todas sus letras: «GMT-0400 (Eastern Daylight Time)».
  • Formatear una fecha de cualquier día del año expone tus reglas de horario de verano, que forman parte de la identidad de la zona.

Un desfase fijo no es una zona horaria. Ámsterdam está en UTC+2 en julio pero en UTC+1 en enero, y cambia en fechas distintas a las de Nueva York: la UE mueve los relojes el último domingo de marzo; Estados Unidos, dos o tres semanas antes. Un script puede preguntar cuál era tu desfase el uno de enero y el uno de julio y comprobar si el par encaja con la zona que afirmas tener. Una falsificación que fija un único desfase para todo el año no encaja con ningún lugar que cambie de hora, y desde luego no con la Ámsterdam que dice ser.

Descuida cualquiera de estos frentes y el navegador empieza a discutir consigo mismo:

Zona horaria de la IP (consulta geo) desde la salida de la VPN
Europe/Amsterdam coherente
Lo que afirma Intl.DateTimeFormat() directo del SO
America/New_York incoherente
Desfase del reloj ahora mismo vía getTimezoneOffset()
UTC−4 incoherente
Discrepancia
La IP dice Ámsterdam, el navegador dice Nueva York. Parece una VPN o un proxy.
Desfases mostrados para julio. Parchear el nombre de la zona horaria sin corregir el desfase del reloj produce un navegador que discute consigo mismo, y esa contradicción es una señal más fuerte de lo que la VPN llegó a ser jamás.

Esta trampa tiene una segunda capa. Un Intl.DateTimeFormat sobrescrito deja de parecer nativo cuando un script inspecciona su código fuente. Es el mismo delator de funciones parcheadas que expone a los plugins de sigilo, el que recorrimos en el artículo sobre detección de bots. Una discrepancia limpia dice «probablemente una VPN». Una API parcheada dice «esta persona está manipulando activamente el navegador», y todo sistema de puntuación serio se lo cobra más caro.

Qué hacer en la práctica

  1. Prueba antes de confiar. El widget de esta página compara ahora mismo la zona horaria de tu navegador con la de tu IP, y el análisis completo del navegador lo ejecuta junto a las comprobaciones de WebRTC, plataforma y fingerprint. Ejecútalo con la VPN activada. Si el widget te marca, también lo hará cada script antifraude.
  2. Mueve tu reloj con tu VPN. El arreglo aburrido es el sólido: pon la zona horaria de tu sistema operativo en la ciudad de salida antes de conectarte. No hay nada que detectar, porque nada es falso: todas las API reportan la misma zona desde la misma fuente. La alternativa del mundillo de la privacidad es Tor Browser, que reporta UTC para todo el mundo; tu zona real queda oculta, al precio de parecer exactamente Tor Browser.
  3. Si gestionas varias identidades, deja de hacer esto a mano. Administrar cuentas en varias regiones significa que cada perfil necesita su propia IP, zona horaria, idioma y fingerprint, todos de acuerdo entre sí, en cada sesión. Esa contabilidad es la que automatizan los navegadores anti-detección: Incogniton deriva la zona horaria de cada perfil de su IP de proxy, de modo que las dos respuestas de este artículo, de entrada, nunca llegan a discrepar.

La comprobación de zona horaria es la verificación cruzada de geolocalización más barata que puede ejecutar un script, y exactamente por eso está en todas partes. Treinta segundos con el widget de arriba te dicen de qué lado estás.

Logotipo de Incogniton

Mejora tu privacidad

Flecha