Exclusiva: Grok Bot de SpaceXAI inserta un ID derivado de la cuenta en las solicitudes del navegador

El valor de 16 caracteres se deriva de la cuenta Cursor autenticada y llega a sitios web externos a través del encabezado User-Agent de Chrome.

By · Published

RUNTIMEWIRE INVESTIGATION — Exclusive

Original reporting by RuntimeWire, based on reverse engineering, data analysis, testing.

Why it matters

Grok Bot gives websites a persistent recognition key through routine HTTP metadata, where it can enter server and analytics logs without cookie-style controls.

Reporting record

Finding

Grok Bot’s cloud Chrome browser sent an unrelated website a 16-character pseudonymous identifier that the shipped client deterministically derives from the authenticated Cursor account’s JWT subject and appends to the User-Agent header.

How we verified

Methods: reverse engineering, data analysis, testing.

Inspection of Grok Bot for Windows 0.16.0 showed that the client hashes the authenticated Cursor account’s JWT sub claim with SHA-256, retains the first 16 hexadecimal characters and writes the result to /tmp/sand-ua-user. Shipped browser configuration describes the resulting suffix as GrokAgent/1.0 (u:<owner>) and applies it to Chrome launches and new tabs. A signed-in live test using Grok Bot’s graphical browser returned the same format from https://httpbingo.org/user-agent. A ChatGPT for Windows control returned a standard Chrome user agent without a product or account suffix. The full Grok Bot identifier has been redacted.

RuntimeWire verified the Windows package metadata, extracted app.asar and inspected the shipped source maps. We traced the browser identifier from the authenticated JWT subject through its SHA-256 derivation, 16-character truncation, local stamp file and Chrome user-agent configuration. We then instructed a signed-in Grok Bot to open Httpbingo’s user-agent endpoint through graphical Chrome, explicitly prohibiting terminal commands and other HTTP clients. The external server returned GrokAgent/1.0 and a 16-character u: value matching the implementation. RuntimeWire repeated the endpoint test through ChatGPT for Windows as a control and compared the returned headers. Only one Grok Bot account was tested.

Tested versions: Grok Bot for Windows 0.16.0, managed Chrome 151.0.0.0, ChatGPT for Windows control — app version not recorded.

Reproduction

RuntimeWire independently reproduced the core finding.

Sign in to Grok Bot for Windows 0.16.0. Instruct the agent to use its graphical Chrome browser to open https://httpbingo.org/user-agent. Prohibit terminal commands, curl, Python and other HTTP clients. Observe the returned User-Agent header. Confirm the suffix follows GrokAgent/1.0 (u:<16 hexadecimal characters>). Refresh or open the endpoint in another tab to check whether the value remains stable. Redact the complete identifier before publishing screenshots.

File hashes

  • sha256:955fb24e72ec85729cac2f921758a93a85089a0fc659e712125d6650b364d20e app(2).asar

Company response

RuntimeWire requested comment; the company had not responded by publication time.

Illustration of a fragmented code editor UI showing SpaceXAI's Grok Bot inserting an account-derived 16-character ID from a Cursor account into browser requests via Chrome user-agent header.

El Grok Bot de SpaceXAI identifica la cuenta detrás de su navegador en la nube mediante una etiqueta persistente incrustada en el encabezado user-agent de Chrome, encontró RuntimeWire.

En una prueba en vivo el 12 de agosto de 2026, un Grok Bot para Windows con sesión iniciada abrió el endpoint de user-agent de Httpbingo a través de su navegador gráfico en la nube. El servidor externo recibió este encabezado, con la etiqueta de la cuenta parcialmente redactada por RuntimeWire:

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36
GrokAgent/1.0 (u:7558........9b44)

El token GrokAgent/1.0 identifica el software que envía la petición. El valor que sigue a u: va más allá: distingue la cuenta autenticada de Cursor (@Cursor) que opera el navegador.

La etiqueta no contiene el nombre del cliente, la dirección de correo electrónico, el token de acceso ni el ID de cuenta en bruto de Cursor. Es un identificador seudónimo derivado de la cuenta que le da a un sitio web una forma independiente de cookies para reconocer tráfico posterior que lleve el mismo valor.

RuntimeWire probó una cuenta autenticada. La prueba establece que la función estaba activa para esa cuenta y que el identificador llegó a un servidor externo no relacionado. No establece cuán ampliamente Grok Bot ha habilitado el comportamiento.

El identificador proviene de la autenticación de la cuenta

La inspección del cliente Grok Bot para Windows 0.16.0 distribuido mostró que la aplicación genera el valor a partir del claim sub en el JSON Web Token de la cuenta de Cursor autenticada. La función operativa analiza el token, hace un hash del subject con SHA-256, convierte el resultado a hexadecimal y conserva los primeros 16 caracteres:

const sub = parseJwtPayload(accessToken)?.sub;
if (sub == null || sub.length === 0) return null;
return createHash("sha256")
  .update(sub, "utf8")
  .digest("hex")
  .slice(0, 16);

Los 16 caracteres hexadecimales resultantes representan un valor de 64 bits. El mismo subject del JWT produce la misma etiqueta, incluso después de que se renueva un token de acceso, siempre que Cursor deje el claim sub de la cuenta sin cambios.

Grok Bot escribe el hash en /tmp/sand-ua-user durante el arranque autenticado y después de la renovación del token. El archivo temporal contiene el hash truncado, en lugar del token de acceso o el subject en bruto.

Código en otra parte de la aplicación distribuida describe un sufijo de user-agent GrokAgent consumido por el navegador Chrome de la computadora en la nube. El sufijo se aplica mediante un argumento de lanzamiento de Chrome y una anulación del Chrome DevTools Protocol para nuevas pestañas. Esa implementación coloca la etiqueta en los metadatos estándar del navegador visibles para orígenes externos.

Un interruptor remoto controla la marca

El cliente incluye una bandera de experimento llamada sand_browser_ua_token_kill_switch. Su valor predeterminado incluido es false, lo que deja habilitado el user agent marcado. El comentario adjunto en el código fuente indica que fallas de configuración y errores al leer la bandera también regresan al comportamiento marcado.

Cuando se habilita de forma remota, el kill switch crea /tmp/sand-ua-token-disabled, impidiendo que el token se aplique a nuevos lanzamientos de Chrome y a las anulaciones de nuevas pestañas. El control está implementado como un interruptor de experimento remoto, en lugar de una configuración de privacidad expuesta en la interfaz de escritorio de Grok Bot inspeccionada.

El código y la transmisión en vivo establecen lo que Grok Bot envía. No establecen por qué Cursor o SpaceXAI eligieron un valor a nivel de cuenta. Los usos operativos potenciales incluyen prevención de abuso, atribución de límites de tasa, detección de fraude y depuración de fallas vinculadas a una computadora en la nube particular. Esas funciones también podrían implementarse con identificadores restringidos a servicios controlados por la empresa en lugar de un campo del navegador recibido por sitios web no relacionados.

Cursor dice que sus agentes en la nube controlan sus propias computadoras, incluido un navegador e interfaz gráfica usados para probar y demostrar trabajos. Cursor y SpaceXAI también han descrito públicamente una asociación para el entrenamiento de modelos, y Cursor dice que Grok 4.5 fue entrenado conjuntamente con SpaceXAI. El paquete de Grok Bot para Windows lista SpaceXAI como su autor mientras usa la autenticación e infraestructura de Cursor.

El problema de privacidad es el reconocimiento repetido

Los marcadores de producto en el User-Agent son habituales para crawlers, herramientas de automatización y navegadores especializados. Permiten que los sitios web identifiquen el software para compatibilidad, gestión de tráfico o bloqueo. Un sufijo derivado de la cuenta cambia la granularidad de identificar la aplicación a distinguir una cuenta de cliente de otra.

Grok no solo dice a todos que es Grok en el encabezado, sino que además inserta un identificador de usuario en el encabezado, dando a cualquier sitio web la capacidad de rastrear a los Grok Bots a través de sesiones

El identificador no puede autenticar al usuario y RuntimeWire no ha mostrado que un sitio web pueda invertirlo para recuperar el subject subyacente de la cuenta de Cursor. Su importancia para la privacidad proviene de su estabilidad. Un sitio web que registre el encabezado puede reconocer visitas posteriores que lleven la misma etiqueta incluso si las cookies del navegador se borran o no están disponibles.

La correlación entre sitios requeriría que el identificador fuera observado por un servicio compartido o combinado a través de registros separados. RuntimeWire no probó ese escenario.

La guía sobre User-Agent del estándar HTTP aconseja a los remitentes evitar detalles innecesariamente finos porque aumentan el riesgo de identificar usuarios mediante fingerprinting. Chromium emprendió la reducción del user-agent para disminuir la información suministrada pasivamente a los sitios web, congelando varios detalles del navegador y la plataforma que podrían contribuir al rastreo.

RuntimeWire ejecutó la misma prueba de endpoint usando el navegador integrado controlado por agente de ChatGPT para Windows. Este devolvió un user agent estándar de Chrome en Windows sin un marcador de producto ChatGPT ni un sufijo a nivel de cuenta. La documentación de OpenAI indica que ese navegador se ejecuta dentro de la aplicación de escritorio, mientras que el navegador probado de Grok Bot se ejecutó en una computadora en la nube Linux gestionada, por lo que la comparación no es un punto de referencia equivalente en la industria. Sí muestra que la operación de un navegador controlado por un agente no requiere inherentemente colocar una etiqueta persistente del cliente en el campo user-agent.

Reader comments

Conversation for this story loads after sign-in.