
PowerShell-скрипт для оценки, который проверяет системы Windows на наличие CVE-2025-47981 (переполнение кучи SPNEGO NEGOEX) путем проверки версии ядра, ключа реестра PKU2U и открытых портов SPNEGO. Предоставляет шаги по устранению уязвимости и рекомендации по обнаружению.
Тип: Оценка уязвимости — Обнаружение / Проверка соответствия CVE: CVE-2025-47981 CVSS: 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) CWE: CWE-122 — Переполнение буфера в куче Псевдоним: "SPNEGO Nightmare" / "Windows Authentication Wormable RCE" Патч: KB5062560 | July 2025 Patch Tuesday
Скрипт PowerShell для оценки, который проверяет, уязвима ли система Windows к CVE-2025-47981 — переполнение буфера в куче в механизме SPNEGO Extended Negotiation (NEGOEX), которое позволяет выполнить RCE без аутентификации. Не выполняет эксплойт — только оценивает подверженность и состояние патча.
Разработано: HKK$ cat ./vulnerability_summary.txtCVE-2025-47981 — это переполнение буфера в куче в протоколе NEGOEX — внутреннем слое расширения механизма аутентификации SPNEGO в Windows. Уязвимость позволяет неаутентифицированным злоумышленникам выполнять произвольный удаленный код, потенциально получая полный контроль над системой.
Аналитики уже описали CVE как имеющую "несчастливые характеристики превращения в значительную проблему", с потенциалом wormable — способностью автоматически распространяться между уязвимыми системами без взаимодействия с пользователем.
Уязвимость затрагивает Windows 10 (начиная с версии 1607) и все Windows Server с 2008 R2 до Server 2025, включая варианты Server Core — более 33 различных конфигураций Windows и Server подтверждены как уязвимые на архитектурах x64, x86 и ARM64.
$ cat ./technical_background.txtSPNEGO (Simple and Protected GSSAPI Negotiation Mechanism) — это слой рукопожатия аутентификации, который Windows использует перед каждой аутентифицированной сессией. Приложениям часто требуется аутентификация без фиксации протокола — Windows может использовать Kerberos в одном окружении, NTLM в другом или расширенный механизм аутентификации в иной модели доверия. SPNEGO — это механизм согласования, который решает, какой протокол аутентификации использовать.
Клиент Сервер
│ │
│──── SPNEGO Negotiation ────────►│
│ MechTypeList: │
│ [Kerberos, NTLM, NEGOEX] │
│ │
│◄─── Selected Mechanism ─────────│
│ │
│──── Auth Exchange ─────────────►│ ← переполнение здесь в NEGOEX
NEGOEX — это механизм расширения внутри SPNEGO — позволяет согласовывать аутентификации PKU2U (peer-to-peer) и другие настраиваемые механизмы. Уязвимость находится в функции ntoskrnl!SpnegoHandleExtended, которая обрабатывает структуры SPNEGO_TOKEN увеличенного размера, отправляемые несколькими фрагментами, вызывая переполнение в куче ядра.
Риск повышен в системах, где групповая политика "Network security: Allow PKU2U authentication requests to this computer to use online identities" включена. Эта конфигурация, включенная по умолчанию во многих развертываниях Windows, расширяет поверхность атаки NEGOEX, позволяя одноранговую аутентификацию, которая активирует уязвимый путь кода NEGOEX на конечных точках, которые в противном случае не подвергали бы его воздействию.
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-47981 ASSESSMENT SCRIPT — FLOW │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 1: Windows Version │ │
│ │ Get-CimInstance Win32_OperatingSystem → .Version │ │
│ │ Контекст: определяет точную сборку для корреляции с патчем │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 2: ntoskrnl.exe Version │ │
│ │ Get-Item C:\Windows\System32\ntoskrnl.exe │ │
│ │ Сравнение: установлено < 10.0.14393.8246 → УЯЗВИМО │ │
│ │ Сравнение: установлено ≥ 10.0.14393.8246 → KB5062560 применен │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 3: PKU2U Registry Key │ │
│ │ HKLM:\SYSTEM\...\Lsa\pku2u\AllowOnlineID │ │
│ │ 1 → PKU2U включен → расширенная поверхность атаки │ │
│ │ 0 → PKU2U отключен → вектор PKU2U смягчен │ │
│ │ Не существует → конфигурация по умолчанию (оценить через GPO) │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 4: Открытые порты SPNEGO │ │
│ │ Get-NetTCPConnection → 135, 445, 5985, 3389, 80, 443, 25 │ │
│ │ Каждый открытый порт = вектор доставки эксплойта │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ Format-Table -AutoSize │
│ (читаемый вывод для отчета по пентесту) │
└─────────────────────────────────────────────────────────────────────────┘
$ cat ./design_decisions.mdntoskrnl.exe$kernelPath = [System.IO.Path]::Combine($env:SystemRoot, "System32\ntoskrnl.exe")
$requiredVersion = "10.0.14393.8246"
$installedVersion = (Get-Item $kernelPath).VersionInfo.FileVersion
if ([version]$installedVersion -lt [version]$requiredVersion) {
"Уязвим - Патч отсутствует ($missingKB)"
}
Почему ntoskrnl.exe, а не Get-HotFix?
Get-HotFix перечисляет установленные KB, но имеет известные ограничения:
DISM или Windows Update в тихом режимеПроверка версии ntoskrnl.exe напрямую более надежна — файл получает пропатченную версию только когда KB был фактически применен и система перезагружена. Система с KB, ожидающим перезагрузки, все еще будет иметь старую версию ядра в памяти.
Приведение [version]: PowerShell по умолчанию сравнивает строки лексикографически — "10.0.14393.8246" -lt "10.0.14393.800" было бы $false (неправильно). Приведение к [version] гарантирует корректное числовое сравнение по октетам.
[System.IO.Path]::Combine($env:SystemRoot, ...): использует SystemRoot вместо жестко заданного C:\Windows — переносимо для систем с Windows, установленной на других дисках.
10.0.14393.824610.0.14393.xxxx → Windows 10 version 1607 / Windows Server 2016
│
└─ 8246 = сборка с примененным KB5062560
Почему именно эта сборка?
Windows Server 2016 (базовая сборка 14393) — одна из наиболее критичных сред для патчинга — широко используется в DC, файловых серверах и внутренних корпоративных сервисах. Версия 8246 соответствует сборке ядра после применения KB5062560 (июль 2025).