
Análisis de ingeniería inversa del Identificador Global de Dispositivo (GDID) de Microsoft, revelando su generación como un MSA Device PUID asignado por el servidor, almacenamiento en el registro y transmisión a través de la Plataforma de Dispositivos Conectados, con metodología forense reproducible.
Cómo se genera, almacena y transmite realmente el "Identificador Global de Dispositivo" de Microsoft, la huella persistente de Windows mencionada en la denuncia de julio de 2026 contra Scattered Spider.
[!NOTE] Lo que se enumera a continuación es cierto, pero falta información. Independientemente de si se ha iniciado sesión con una MSA, TENDRÁS un GDID. No me di cuenta de esto al momento de publicar, pero lo investigué. CDP tiene una ruta de dispositivo anónima que se utiliza si no se ha conectado una MSA. El sistema subyacente sigue siendo factualmente correcto, solo faltan algunas cosas.
Global Device Identifier g:6755467234350028.g:<decimal>.wlidsvc (servicio de cuenta Microsoft) aprovisiona el dispositivo con login.live.com y recibe un PUID de dispositivo -> lo almacena en el registro -> la Plataforma de Dispositivos Conectados (cdp.dll / CDPSvc) lo lee y lo registra en el gráfico del Servicio de Directorio de Dispositivos (DDS) -> Delivery Optimization lo reporta como el documentado UCDOStatus.GlobalDeviceId.[!NOTE] Etiquetado de confianza. Cada afirmación está etiquetada para que puedas evaluarlas por tu cuenta:
[COURT]hecho de fuente primaria,[OBSERVED]reproducido en vivo en mi máquina de prueba,[STATIC]probado a partir de binarios y PDB públicos de Windows,[ASSESSED]inferencia sólida a partir de la evidencia.
wlidsvc)El 1 de julio de 2026, el DOJ desveló una denuncia penal contra Peter Stokes, un presunto miembro de Scattered Spider (también conocido como Octo Tempest / UNC3944 / 0ktapus). La declaración describe cómo Microsoft ayudó al FBI a atribuir actividad a un dispositivo.
[!IMPORTANT]
[COURT]De la denuncia sustitutoria (¶25, p.34), textualmente:"la cuenta de ngrok se configuró a través del Identificador Global de Dispositivo g:6755467234350028 ('el GDID'). Según un representante de Microsoft, un Identificador Global de Dispositivo en el ecosistema de Windows es un identificador persistente a nivel de dispositivo diseñado para identificar de forma única una instalación de un sistema operativo Windows en un dispositivo... Un GDID es un identificador único global vinculado a la instalación de Windows en un dispositivo. Un GDID permanece constante a través de las actualizaciones del sistema operativo Windows en un dispositivo, pero una reinstalación de Windows... estará vinculada a un nuevo GDID único."
Una nota al pie añade que un usuario de Microsoft puede tener múltiples GDID. La declaración luego correlaciona el historial de IP y navegación del GDID (p. ej., empirehotelnyc.com, una URL de inicio de sesión de Growtopia/Ubisoft) con las cuentas en las que el sospechoso había iniciado sesión.
Dos cosas aquí sustentan el resto de este análisis:
g: más un entero decimal (g:6755467234350028). En hexadecimal es 0x0018000FC8CB93CC, por lo que es un número de 64 bits.El resumen de redes sociales afirmaba que el GDID es "un identificador de 128 bits generado a partir de números de serie en la instalación." Ambas mitades son falsas:
| Afirmación (redes sociales) | Realidad (fuente primaria) |
|---|---|
| "128 bits" | El valor en la denuncia es g:6755467234350028, un decimal que cabe en 64 bits (0x0018000FC8CB93CC). |
| "generado a partir de números de serie en la instalación" |
[!NOTE] Después de más ingeniería inversa de CDP. Proporcioné información errónea. Usar una cuenta local no impide un GDID. CDP tiene una ruta de dispositivo anónima que se toma si no hay cuenta Microsoft. Ten esto en cuenta al leer.
[STATIC] Los documentos públicos de Azure Monitor de Microsoft definen una columna GlobalDeviceId en la tabla UCDOStatus (Update Compliance / Delivery Optimization):
GlobalDeviceId(string): "Identificador global de dispositivo de Microsoft. Este es un identificador utilizado internamente por Microsoft."
Se encuentra justo al lado de LastCensusSeenTime, ISP, City, Country, por lo que un ID de dispositivo alineado con geo e IP. Este es el único lugar donde Microsoft nombra el valor en documentos públicos. Pero Delivery Optimization solo lo reporta. Es importante destacar que NO es su propietario. Síguelo aguas arriba y llegarás a la Plataforma de Dispositivos Conectados.
[STATIC] C:\Windows\System32\cdp.dll (la Plataforma de Dispositivos Conectados, servicios CDPSvc + CDPUserSvc) contiene el símbolo GlobalDeviceId y un subsistema completo de registro del Servicio de Directorio de Dispositivos:
ddsregistrationclient.cpp ddsregistrationmanager.cpp ddsregistrationinfo.cpp
DdsRegistrationClient RegisterUserDevicesObserver DdsRegistrationInfoProviderForCDP
endpoints: dds.microsoft.com fd.dds.microsoft.com aad.cs.dds.microsoft.com cdpcs.access.microsoft.com
device-id format string: "g:%s"
DDS = Device Directory Service (Servicio de Directorio de Dispositivos), el gráfico de identidad entre dispositivos de Microsoft (el backend detrás de Phone Link, portapapeles en la nube, "Continuar en PC", Compartir cerca). CDP es el cliente de Windows que registra la instalación en ese gráfico, donde se etiqueta como g:<decimal>.
[OBSERVED] Forzar un registro nuevo (reiniciar CDPSvc con su estado local limpiado) y capturar los propios proveedores ETW de CDP produjo todo el intercambio:
DdsClient::RegisterUserDeviceAsync() RegistrationReason: Startup Account Type: MSA
DDSClient: Registration response received. HTTP status code: 200
OnRegisterUserDeviceComplete
GetDeviceIdAndTicketActivity -> deviceid: 0018XXXXXXXXXXXX
Ese deviceid, escrito como g:<decimal>, coincide estructuralmente con el valor de la denuncia:
Ambos son valores de 64 bits en la misma clase de palabra alta 0x0018 (el espacio de nombres de PUID de dispositivo, ver §6). El prefijo g: es solo ese entero en decimal.
[STATIC] Con el PDB público (cdp.pdb), la ruta del ID de dispositivo en cdp.dll es solo una solicitud y espera contra la pila de identidad. CDP nunca calcula el ID por sí mismo:
flowchart TD
A["GetStableDeviceIdFromProvider<br/>0x0A3140"] --> B["provider.GetStableDeviceIdAsync<br/>(vtable +0x48)"]
B --> C["OneCoreAccountProvider::<br/>GetStableDeviceIdAsync 0x0C8370"]
C --> D["IWebAccountBackedAccountProvider<br/>(MSA / AAD identity COM)"]
D --> E["OnGetStableDeviceIdCompleted<br/>(const char* deviceId) 0x06CEA0"]
E -->|"assign() string, signal flag"| ALa devolución de llamada que lo recibe lo hace obvio. El ID aparece como una cadena y simplemente se almacena:
; OnGetStableDeviceIdCompleted
mov rbp, r9 ; r9 = cadena device-id proporcionada por el proveedor de identidad
lea rcx, [rsi+0xD8] ; campo miembro de CDP
mov rdx, rbp
call assign@basic_string ; almacenarlo, sin cálculo, sin seriales
call Set@CdpWaitableFlag ; desbloquear el esperador
En resumen: el GDID se acuña por debajo de CDP, en la pila de identidad de Windows, y se entrega a CDP como una cadena opaca. Eso apunta al servicio de cuenta Microsoft.
wlidsvc)[STATIC] C:\Windows\System32\wlidsvc.dll, el servicio de cuenta Microsoft / Passport (Windows Live ID), es el único binario de identidad que contiene el literal GlobalDeviceId, y contiene toda la maquinaria de aprovisionamiento de dispositivos:
CDeviceIdentityBase::CreateNewDeviceIdentity / Provision / BindDeviceToHardware / GetDeviceCert
DeviceAssociateRequest (Passport PPCRL SOAP -> login.live.com)
<ps:DevicePUID> ... </ps:DevicePUID>
DeviceIdStore::LogToRegistry
BCryptGenRandom / CCryptRandom::GenRandom (clave del dispositivo, no el ID)
El identificador es un Device PUID (Passport Unique ID), un identificador MSA de 64 bits. El BCryptGenRandom que hay genera la clave de autenticación del dispositivo que BindDeviceToHardware vincula a la máquina, no el PUID.
[STATIC] El cliente extrae el PUID de la respuesta SOAP del servidor, con un XPath en el cuerpo de la respuesta:
/S:Envelope/S:Body/ps:DeviceUpdatePropertiesResponse/HWPUIDFlipped
CAssociateDeviceRequest::ParseResponseBody y los métodos relacionados ParseResponse leen nodos XML de respuesta en BSTR. Por lo tanto, el flujo es: el cliente aprovisiona el dispositivo -> login.live.com asigna y devuelve el PUID del dispositivo -> el cliente lo almacena. Eso es exactamente por qué una reinstalación produce un nuevo GDID (nuevo aprovisionamiento, nuevo PUID asignado por el servidor), y por qué no es un hash de hardware.
[OBSERVED] El almacén de identidad de la cuenta Microsoft mantiene el valor justo en el registro, en tu propio hive de usuario:
HKCU\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties
LID = 0018XXXXXXXXXXXX
HKCU\SOFTWARE\Microsoft\IdentityCRL\Immersive\production\Token\{...}
DeviceId = 0018XXXXXXXXXXXX
Byte por byte el mismo valor que CDP registró en DDS en vivo. El PUID de tu cuenta de usuario es un número diferente almacenado en otro lugar como puid = 0003... (p. ej., 00034002XXXXXXXX). También hay una clave de caché HKLM nombrada después del PUID (HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache\<PUID>_<userSID>), pero esa es solo para SYSTEM, por lo que lees el valor de HKCU.
[!NOTE] El prefijo te dice qué es. Los PUID de usuario son de clase
0003, los PUID de dispositivo son de clase0018. El GDID del tribunal (0018000FC8CB93CC) está en el espacio de PUID de dispositivo0018, al igual que el mío.
[OBSERVED] La caché de tokens MSA (HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache\...) tiene tokens de dispositivo con alcance exactamente a los puntos finales que CDP utiliza:
scope=service::dds.microsoft.com::MBI_SSL_TOKEN_BROKER
scope=service::activity.windows.com::MBI_SSL_SA_TOKEN_BROKER
Por lo tanto, el servicio de cuenta Microsoft distribuye las credenciales del dispositivo que autentican el registro DDS y las subidas de actividad que transportan el GDID.
flowchart TD
subgraph MSA["Capa de identidad MSA: wlidsvc.dll"]
A1["Provision device with login.live.com<br/>(Passport PPCRL SOAP)"] --> A2["Server assigns Device PUID<br/><ps:DevicePUID> / HWPUIDFlipped"]
A2 --> A3["Store DeviceId / LID = PUID<br/>HKLM\...\IdentityStore"]
A3 --> A4["Issue device tokens for<br/>dds.microsoft.com and activity.windows.com"]
end
subgraph CDP["Cliente de gráfico de dispositivos: cdp.dll / CDPSvc"]
B1["GetStableDeviceId -> receives PUID string"] --> B2["RegisterUserDeviceAsync -> DDS<br/>OBSERVED: HTTP 200"]
end
subgraph SRV["Servidor: Device Directory Service"]
C1["Keys g:PUID to the MSA account,<br/>activity and IP history"]
end
subgraph REP["Reportes"]
D1["Delivery Optimization -><br/>UCDOStatus.GlobalDeviceId"]
end
A4 --> B1
B2 --> C1
C1 --> D1Todo lo que la denuncia atribuye a "el GDID" (persistente por instalación, sobrevive a actualizaciones, nuevo en reinstalación, vinculado a una cuenta Microsoft, rastreable a través de IPs y navegación) se desprende de que esto sea un Device PUID de MSA asignado por el servidor que CDP registra en el gráfico de dispositivos.
[OBSERVED] En una máquina con sesión iniciada en una cuenta Microsoft, una lectura del registro desde tu propio hive de usuario, sin necesidad de administrador:
(Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties').LID
Eso te da tu PUID de dispositivo como 16 dígitos hexadecimales (p. ej., 0018XXXXXXXXXXXX). Para verlo en la forma g:<decimal> tal como aparece del lado del servidor:
$hex = (Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties').LID
"g:$([Convert]::ToUInt64($hex,16))"
Si ExtendedProperties\LID está vacío en tu equipo, el mismo valor se encuentra en HKCU\SOFTWARE\Microsoft\IdentityCRL\Immersive\production\Token\{...}\DeviceId.
[!WARNING] No publiques tu propio valor. Tu PUID de dispositivo, tu CID de MSA (
0003...) y tu SID de usuario te desanonimizan. Redacta en cualquier análisis público. El único valor seguro de citar es el del tribunal, porque ya es público.
El GDID existe porque tu dispositivo está registrado en el gráfico de dispositivos de la cuenta Microsoft y la Plataforma de Dispositivos Conectados lo mantiene sincronizado. Para reducirlo:
CDPSvc, CDPUserSvc) y desactiva el Historial de actividad (Configuración, Privacidad, Historial de actividad) para detener la sincronización del gráfico y las subidas de actividad.%LOCALAPPDATA%\ConnectedDevicesPlatform solo borra el estado local de CDP. El PUID vuelve inmediatamente desde el almacén de identidad, por lo que solo eso no bastará.Todo esto se obtuvo de una máquina Windows 11 estándar (compilación 26200).
Microsoft.Windows.CDP.*) mediante logman mientras se forzaba un registro nuevo de CDPSvc, decodificados con tracerpt.IdentityStore y IdentityCRL bajo HKLM\SOFTWARE\Microsoft.ETW y el análisis estático es lo que realmente funcionó. Un proxy solo te hará perder el tiempo.
Calculados con el hash del nombre del EventSource (SHA1 del espacio de nombres más el nombre del proveedor en mayúsculas UTF-16BE). Verifícalo contra el valor conocido System.Runtime 49592c0f-5a05-516d-aa4b-a64e02026c89:
Microsoft.Windows.CDP.Core {7762de0c-b0a6-571a-68d3-c018bf009496}
Microsoft.Windows.CDP.Core.Error {a1ea5efc-402e-5285-3898-22a5acce1b76}
Microsoft.Windows.CDP.CDS {dfa6e32a-095f-5f57-d025-0887d33507a1}
Microsoft.Windows.CDP.Aggr {bc1826c8-369c-5b0b-4cd1-3c6ae5bfe2e7}
Microsoft.Windows.CDP.AFS {5fe36556-c4cd-509a-8c3e-2a547ea568ae}
Microsoft.Windows.CDP.OnecoreAccountProvider {4ee5bf9a-3e8f-540b-8bfb-12457a2854b6}
Microsoft.Windows.CDP {9f4cc6dc-1bab-5772-0c71-a89954718d66}
[!NOTE] NullZeroX en twitter me ha dicho que el GDID también se envía independientemente de si se ha iniciado sesión con una cuenta de Microsoft en el dispositivo. No estoy seguro de qué tan cierto sea, pero vale la pena tenerlo en cuenta.
Análisis de primera mano. Se aceptan correcciones. También gracias a claude por ayudar con este análisis y los diagramas :3
| La denuncia dice que una reinstalación produce un nuevo GDID. Un valor derivado de seriales fijos volvería igual después de una reinstalación, no cambiaría. |
| valor | hex (64 bits) | prefijo de clase |
|---|
| Mi máquina (redactado) | g:XXXXXXXXXXXXXXXX | 0x0018XXXXXXXXXXXX | 0018 |
| Exhibición judicial | g:6755467234350028 | 0x0018000FC8CB93CC | 0018 |
| Binario | Rol | Símbolos notables |
|---|
wlidsvc.dll | Servicio de cuenta Microsoft / Passport, acuña el Device PUID | CDeviceIdentityBase::CreateNewDeviceIdentity, CAssociateDeviceRequest::ParseResponseBody, DeviceIdStore::LogToRegistry |
cdp.dll | Plataforma de Dispositivos Conectados, registra el PUID en DDS | DdsRegistrationClient, GetStableDeviceIdFromProvider (0x0A3140), OnGetStableDeviceIdCompleted (0x06CEA0) |
dosvc.dll / DO | Reporta el ID como UCDOStatus.GlobalDeviceId | n/a |
Registro: HKLM\SOFTWARE\Microsoft\IdentityStore (DeviceId y LID), HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache (alcances de tokens).