
Анализ с обратным проектированием глобального идентификатора устройства Microsoft (GDID), раскрывающий его генерацию как назначенного сервером MSA Device PUID, хранение в реестре и передачу через Connected Devices Platform, с воспроизводимой криминалистической методологией.
Как «Глобальный идентификатор устройства» Microsoft, постоянный отпечаток Windows, упомянутый в жалобе Scattered Spider от июля 2026 года, на самом деле создается, хранится и передается.
[!NOTE] Перечисленное ниже верно, но не хватает некоторой информации. Независимо от того, выполнен ли вход с MSA, GDID у вас будет. Я не осознавал этого на момент публикации, но потом изучил. У CDP есть анонимный путь устройства, который используется, если не подключена MSA. Базовая система по-прежнему фактически верна, просто не хватает нескольких деталей.
Global Device Identifier g:6755467234350028.g:<десятичное>.wlidsvc (служба учетной записи Microsoft) подготавливает устройство через login.live.com и получает обратно device PUID -> сохраняет его в реестре -> Connected Devices Platform (cdp.dll / CDPSvc) считывает его и регистрирует в графе Device Directory Service (DDS) -> Delivery Optimization сообщает его как документированный UCDOStatus.GlobalDeviceId.[!NOTE] Маркировка достоверности. Каждое утверждение помечено, чтобы вы могли самостоятельно оценить его:
[COURT]факт из первоисточника,[OBSERVED]воспроизведено на моем тестовом компьютере,[STATIC]доказано с помощью бинарных файлов и публичных PDB Windows,[ASSESSED]сильный вывод на основе доказательств.
wlidsvc)1 июля 2026 года Министерство юстиции США обнародовало уголовную жалобу на Питера Стокса, предполагаемого члена Scattered Spider (также известного как Octo Tempest / UNC3944 / 0ktapus). В аффидевите описывается, как Microsoft помогла ФБР связать активность с устройством.
[!IMPORTANT]
[COURT]Из дополнительной жалобы (¶25, стр.34), дословно:«Учетная запись ngrok была настроена через Global Device Identifier g:6755467234350028 («GDID»). По словам представителя Microsoft, Global Device Identifier в экосистеме Windows — это постоянный идентификатор на уровне устройства, предназначенный для уникальной идентификации установки операционной системы Windows на устройстве... GDID — это глобально уникальный идентификатор, привязанный к установке Windows на устройстве. GDID остается неизменным при обновлениях операционной системы Windows на устройстве, но переустановка Windows... будет связана с новым уникальным GDID.»
В сноске добавляется, что один пользователь Microsoft может иметь несколько GDID. Затем в аффидевите коррелируется история IP-адресов и просмотров страниц GDID (например, empirehotelnyc.com, URL входа в Growtopia/Ubisoft) с учетными записями, в которые был выполнен вход подозреваемого.
Два момента здесь определяют остальное содержание этой документации:
g: плюс десятичное целое (g:6755467234350028). В шестнадцатеричном виде это 0x0018000FC8CB93CC, то есть 64-битное число.В кратком изложении в социальных сетях утверждалось, что GDID — это «128-битный идентификатор, созданный из серийных номеров при установке». Обе половины ложны:
| Утверждение (социальные сети) | Реальность (первоисточник) |
|---|---|
| «128-битный» | Значение в жалобе — g:6755467234350028, десятичное число, помещающееся в 64 бита (0x0018000FC8CB93CC). |
[!NOTE] После дополнительного реверс-инжиниринга CDP. Я предоставил некоторую дезинформацию. Использование локальной учетной записи не предотвращает появление GDID. У CDP есть анонимный путь устройства, который используется, если нет учетной записи Microsoft. Учтите это при чтении.
[STATIC] В публичной документации Azure Monitor от Microsoft определена колонка GlobalDeviceId в таблице UCDOStatus (Update Compliance / Delivery Optimization):
GlobalDeviceId(string): «Глобальный идентификатор устройства Microsoft. Это идентификатор, используемый Microsoft внутри компании.»
Он находится рядом с LastCensusSeenTime, ISP, City, Country, так что идентификатор устройства привязан к геоданным и IP. Это единственное место, где Microsoft называет это значение в публичной документации. Но Delivery Optimization только сообщает его. Важно, что оно НЕ является его владельцем. Прослеживая вверх по стеку, мы попадаем на Connected Devices Platform.
[STATIC] C:\Windows\System32\cdp.dll (Connected Devices Platform, службы CDPSvc + CDPUserSvc) содержит символ GlobalDeviceId и целую подсистему регистрации Device Directory Service:
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, кросс-устройственный граф идентификации Microsoft (бэкенд, лежащий в основе Phone Link, облачного буфера обмена, «Продолжить на ПК», Nearby Share). CDP — это клиент Windows, который регистрирует установку в этом графе, где она получает ключ g:<десятичное>.
[OBSERVED] Принудительная свежая регистрация (перезапуск CDPSvc с очисткой локального состояния) и захват собственных провайдеров ETW от CDP дали полное рукопожатие:
DdsClient::RegisterUserDeviceAsync() RegistrationReason: Startup Account Type: MSA
DDSClient: Registration response received. HTTP status code: 200
OnRegisterUserDeviceComplete
GetDeviceIdAndTicketActivity -> deviceid: 0018XXXXXXXXXXXX
Этот deviceid, записанный как g:<десятичное>, структурно соответствует значению из жалобы:
Оба — 64-битные значения в одном классе старшего слова 0x0018 (пространство device PUID, см. §6). Префикс g: — это просто то же целое число в десятичном виде.
[STATIC] С помощью публичного PDB (cdp.pdb) путь идентификатора устройства в cdp.dll — это просто запрос и ожидание стека идентификации. CDP никогда не вычисляет идентификатор сам:
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"| AОбратный вызов, который его получает, делает очевидным, что это строка, и просто сохраняется:
; OnGetStableDeviceIdCompleted
mov rbp, r9 ; r9 = device-id STRING, переданный провайдером идентификации
lea rcx, [rsi+0xD8] ; поле-член CDP
mov rdx, rbp
call assign@basic_string ; сохранить, без вычислений, без серийных номеров
call Set@CdpWaitableFlag ; разблокировать ожидающего
Суть: GDID чеканится ниже CDP, в стеке идентификации Windows, и передается CDP как непрозрачная строка. Это указывает на службу учетной записи Microsoft.
wlidsvc)[STATIC] C:\Windows\System32\wlidsvc.dll, служба Microsoft Account / Passport (Windows Live ID), является единственным бинарным файлом идентификации, содержащим буквально GlobalDeviceId, и содержит весь механизм подготовки устройства:
CDeviceIdentityBase::CreateNewDeviceIdentity / Provision / BindDeviceToHardware / GetDeviceCert
DeviceAssociateRequest (Passport PPCRL SOAP -> login.live.com)
<ps:DevicePUID> ... </ps:DevicePUID>
DeviceIdStore::LogToRegistry
BCryptGenRandom / CCryptRandom::GenRandom (device KEY, не идентификатор)
Идентификатор — это Device PUID (Passport Unique ID), 64-битный MSA-идентификатор. BCryptGenRandom используется для создания ключа аутентификации устройства, который BindDeviceToHardware привязывает к машине, а не PUID.
[STATIC] Клиент извлекает PUID из SOAP-ответа сервера, используя XPath в тело ответа:
/S:Envelope/S:Body/ps:DeviceUpdatePropertiesResponse/HWPUIDFlipped
CAssociateDeviceRequest::ParseResponseBody и связанные методы ParseResponse читают узлы XML ответа в BSTR. Таким образом, поток выглядит так: клиент подготавливает устройство -> login.live.com назначает и возвращает device PUID -> клиент сохраняет его. Именно поэтому при переустановке создается новый GDID (новая подготовка, новый PUID, назначенный сервером), и почему это не хэш оборудования.
[OBSERVED] Хранилище идентификации учетной записи Microsoft хранит значение прямо в реестре, в вашем собственном пользовательском кусте:
HKCU\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties
LID = 0018XXXXXXXXXXXX
HKCU\SOFTWARE\Microsoft\IdentityCRL\Immersive\production\Token\{...}
DeviceId = 0018XXXXXXXXXXXX
Байт в байт то же значение, которое CDP зарегистрировал в DDS в реальном времени. Ваш PUID пользователя — другое число, хранящееся в другом месте как puid = 0003... (например, 00034002XXXXXXXX). Также есть ключ кэша HKLM, названный по PUID (HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache\<PUID>_<userSID>), но он доступен только SYSTEM, поэтому вы читаете значение из HKCU.
[!NOTE] Префикс говорит вам, что это. PUID пользователей — это класс
0003, device PUID — это класс0018. GDID из суда (0018000FC8CB93CC) находится в пространстве0018device PUID, так же как и мой.
[OBSERVED] Кэш токенов MSA (HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache\...) содержит токены устройства, ограниченные именно теми конечными точками, которые использует CDP:
scope=service::dds.microsoft.com::MBI_SSL_TOKEN_BROKER
scope=service::activity.windows.com::MBI_SSL_SA_TOKEN_BROKER
Таким образом, служба учетной записи Microsoft выдает учетные данные устройства, которые аутентифицируют регистрацию DDS и загрузки активности, несущие GDID.
flowchart TD
subgraph MSA["Уровень идентификации MSA: wlidsvc.dll"]
A1["Подготовка устройства через login.live.com<br/>(Passport PPCRL SOAP)"] --> A2["Сервер назначает Device PUID<br/><ps:DevicePUID> / HWPUIDFlipped"]
A2 --> A3["Сохранение DeviceId / LID = PUID<br/>HKLM\...\IdentityStore"]
A3 --> A4["Выдача токенов устройства для<br/>dds.microsoft.com и activity.windows.com"]
end
subgraph CDP["Клиент графа устройств: cdp.dll / CDPSvc"]
B1["GetStableDeviceId -> получение строки PUID"] --> B2["RegisterUserDeviceAsync -> DDS<br/>OBSERVED: HTTP 200"]
end
subgraph SRV["Сервер: Device Directory Service"]
C1["Ключи g:PUID к учетной записи MSA,<br/>активность и история IP"]
end
subgraph REP["Отчетность"]
D1["Delivery Optimization -><br/>UCDOStatus.GlobalDeviceId"]
end
A4 --> B1
B2 --> C1
C1 --> D1Все, на что жалуется жалоба в отношении «GDID»: постоянный для каждой установки, переживает обновления, новый при переустановке, привязан к учетной записи Microsoft, отслеживается по IP и посещениям страниц — все это вытекает из того, что это назначенный сервером MSA Device PUID, который CDP регистрирует в графе устройств.
[OBSERVED] На машине, выполнившей вход в учетную запись Microsoft, одно чтение реестра из вашего собственного пользовательского куста, без прав администратора:
(Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties').LID
Это даст вам ваш device PUID в виде 16 шестнадцатеричных цифр (например, 0018XXXXXXXXXXXX). Чтобы увидеть его в форме g:<десятичное>, как он отображается на стороне сервера:
$hex = (Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties').LID
"g:$([Convert]::ToUInt64($hex,16))"
Если ExtendedProperties\LID пуст на вашем компьютере, то же самое значение находится в HKCU\SOFTWARE\Microsoft\IdentityCRL\Immersive\production\Token\{...}\DeviceId.
[!WARNING] Не публикуйте собственное значение. Ваш device PUID, ваш MSA CID (
0003...) и ваш SID пользователя — все это деанонимизирует вас. Отредактируйте их в любой публичной документации. Единственное значение, которое безопасно цитировать, — это значение из суда, так как оно уже общедоступно.
GDID существует, потому что ваше устройство зарегистрировано в графе устройств учетной записи Microsoft, а Connected Devices Platform поддерживает его синхронизацию. Чтобы его ограничить:
CDPSvc, CDPUserSvc) и выключите Activity History (Настройки, Конфиденциальность, Журнал действий), чтобы остановить синхронизацию графа и загрузки активности.%LOCALAPPDATA%\ConnectedDevicesPlatform только очищает локальное состояние CDP. PUID вернется из хранилища идентификации, так что это само по себе не поможет.Все это было получено на стандартной Windows 11 (сборка 26200).
Microsoft.Windows.CDP.*) через logman с принудительной свежей регистрацией CDPSvc, декодировано с помощью tracerpt.IdentityStore и IdentityCRL в HKLM\SOFTWARE\Microsoft.ETW и статический анализ — это то, что реально сработало. Прокси только потратит ваше время.
Вычислено с помощью хэша имени пространства имен EventSource (SHA1 пространства имен плюс UTF-16BE имя провайдера в верхнем регистре). Проверьте это по известному значению 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 в твиттере сообщил, что GDID также отправляется независимо от того, выполнен ли вход с учетной запись MS на вашем устройстве. Я не уверен, насколько это правда, но стоит принять к сведению.
Анализ из первых рук. Исправления приветствуются. Также спасибо claude за помощь в написании этой документации и диаграмм :3
| «создан из серийных номеров при установке» |
| В жалобе сказано, что переустановка создает новый GDID. Значение, полученное из фиксированных серийных номеров, после переустановки было бы тем же самым, а не изменилось бы. |
| значение | hex (64 bit) | префикс класса |
|---|
| Моя машина (отредактировано) | g:XXXXXXXXXXXXXXXX | 0x0018XXXXXXXXXXXX | 0018 |
| Судовой экспонат | g:6755467234350028 | 0x0018000FC8CB93CC | 0018 |
| Бинарный файл | Роль | Примечательные символы |
|---|
wlidsvc.dll | Служба Microsoft Account / Passport, чеканит Device PUID | CDeviceIdentityBase::CreateNewDeviceIdentity, CAssociateDeviceRequest::ParseResponseBody, DeviceIdStore::LogToRegistry |
cdp.dll | Connected Devices Platform, регистрирует PUID в DDS | DdsRegistrationClient, GetStableDeviceIdFromProvider (0x0A3140), OnGetStableDeviceIdCompleted (0x06CEA0) |
dosvc.dll / DO | Сообщает идентификатор как UCDOStatus.GlobalDeviceId | н/д |
Реестр: HKLM\SOFTWARE\Microsoft\IdentityStore (DeviceId и LID), HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache (области действия токенов).