
Windows CLFS LPE exploit PoC для исследований в области безопасности
CVE-2025-60709 — это уязвимость локального повышения привилегий (LPE) в драйвере CLFS.sys (Common Log File System) Windows. Она позволяет атакующему с локальным выполнением кода повысить привилегии от стандартного пользователя до NT AUTHORITY\SYSTEM через переполнение буфера при разборе контейнеров CLFS, получая примитив произвольной записи в память ядра.
Этот репозиторий содержит две реализации:
| Поле | Деталь |
|---|---|
| CVE ID | CVE-2025-60709 |
| Тип | Локальное повышение привилегий (LPE) |
| Компонент | CLFS.sys (драйвер Common Log File System) |
| Целевая ОС | Windows 11 24H2 (сборка 26100.3485+) |
| Архитектура | Только x64 |
| Вектор | Переполнение буфера при разборе контейнера CLFS |
| Воздействие | Повышение до NT AUTHORITY\SYSTEM |
| Предварительные условия | Локальное выполнение кода (стандартный пользователь) |
CVE-2025-60709/
├── CVE-2025-60709.c (5.3 КБ, 157 строк) — Оригинальный эксплойт на C
├── CVE-2025-60709.go (9.2 КБ, 285 строк) — Порт на Go (демо, обучающая)
└── README.txt (4.2 КБ, 132 строки) — Оригинальная документация
┌─────────────────────────────────────────────────────────────┐
│ CVE-2025-60709 LPE │
└─────────────────────────────────────────────────────────────┘
[1] ОБХОД ЗАЩИТЫ
├─ KillETW() → Патчит EtwEventWrite в ntdll с помощью RET (0xC3)
└─ KillAMSI() → Патчит AmsiScanBuffer в amsi.dll с помощью RET (0xC3)
[2] HEAP GROOMING (подготовка памяти)
└─ GroomLookaside()
├─ Создаёт 4096 файлов: C:\Windows\Temp\groom_00000.blf
├─ Вызывает CreateLogFile() + AddLogContainer() для каждого
└─ Истощает lookaside списки → гарантирует предсказуемый макет кучи
[3] ПРИМИТИВ ПРОИЗВОЛЬНОЙ ЗАПИСИ — ClfsArbWrite(Address, Value)
├─ Создаёт неправильно сформированный буфер CLFS (0x102010 байт)
│ ├─ Действительная подпись CLFS в +0x00: 0x0201
│ ├─ Oversized cbRecord в +0x100: 0xFF00 (65 280 байт)
│ ├─ Маркер теневой зоны в +0x9A8: 0x13371337
│ └─ Поддельный CClfsContainerContext по смещению (0xFF00 + 0x100):
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value (записываемые данные)
├─ Вычисляет корректную контрольную сумму CLFS (драйвер проверяет)
├─ Записывает неправильный контейнер → C:\Windows\Temp\evil.blf
├─ Создаёт журнал, указывающий на evil.blf
├─ Вызывает ClfsReadRestartArea() → запускает разбор в ядре
└─ Драйвер переполняет буфер → записывает Value по адресу Address ✓
[4] КРАЖА ТОКЕНА SYSTEM
├─ Читает EPROCESS процесса SYSTEM через PsInitialSystemProcess
└─ Извлекает токен по адресу EPROCESS + 0x4C0
[5] ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
└─ ClfsArbWrite(CurrentEprocess + 0x4C0, SystemToken)
└─ Перезаписывает токен текущего процесса токеном SYSTEM ✓
[6] ЗАПУСК ПОЛЕЗНОЙ НАГРУЗКИ C2
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ Копирует 1789-байтовый shellcode beacon
├─ CreateThread() → выполняется как NT AUTHORITY\SYSTEM
└─ Beacon: IPv6 + DoH C2 → резервный канал Gmail drafts
└─ sRDI + обфускация сна + ETW/AMSI уже пропатчены
[7] ПЕРСИСТЕНТНОСТЬ
└─ Sleep(INFINITE) → процесс сохраняет токен SYSTEM
| Поле | Смещение | Описание |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | Токен безопасности процесса |
EPROCESS_PID | 0x440 | Идентификатор процесса (PID) |
EPROCESS_LINKS | 0x448 | Связанный список активных процессов |
EPROCESS_NAME | 0x5A8 | Имя процесса (ImageFileName) |
⚠️ Эти смещения различаются между сборками Windows. Требуется обновление для других версий.
Легитимный контейнер CLFS:
[Заголовок 0x100 байт][Запись: cbRecord байт реальных данных]
Неправильный контейнер (evil.blf):
[Действительный заголовок][cbRecord=0xFF00 → ядро читает 65 280 байт]
↓
Переполнение в ядре → достигает поддельного CClfsContainerContext
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
Драйвер использует поддельную структуру → записывает ValueToWrite по адресу TargetKernelAddress
CVE-2025-60709.c| Функция | Назначение |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → база ntoskrnl.exe |
KillETW() | VirtualProtect + перезапись EtwEventWrite в ntdll.dll с 0xC3 (RET) |
KillAMSI() | Загрузка amsi.dll + перезапись AmsiScanBuffer с 0xC3 (RET) |
GroomLookaside() | Создание 4096 журналов CLFS для истощения lookaside списков → детерминированная куча |
ClfsArbWrite() | Ядро эксплойта — примитив произвольной записи в память ядра |
main() | Оркестровка атаки: ETW→AMSI→groom→кража токена→arb write→beacon |
| Аспект | Версия C | Версия Go |
|---|---|---|
| Тип | Рабочий эксплойт (согласно документации) | Только обучающая демонстрация |
| API | Прямой доступ (ntdll, clfsw32, advapi32) | Обёртки syscall.NewLazyDLL() |
| Контрольная сумма CLFS | Полный алгоритм | Упрощённый заполнитель |
| Ядерные адреса | Реальные | Жёстко заданный заполнитель (0x123456) |
| Полезная нагрузка C2 | Шеллкод 1789 байт | Тестовые байты NOP (0x90) |
| Ожидаемый результат | Повышение до SYSTEM | Сообщение "Arb write failed (yeah)" |
Версия C (требуется Visual Studio Build Tools + Windows SDK):
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Версия Go (требуется Go 1.19+ на Windows x64):
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go
| Смягчение | Эффективность |
|---|---|
| HVCI (Защита целостности кода под гипервизором) | Высокая — предотвращает запись в память ядра |
| kCFI (Целостность потока управления ядра) | Высокая — затрудняет цепочки ROP/JOP |
| CFG (Защита потока управления) | Средняя — затрудняет выполнение шеллкода |
| Защитник Windows | Средняя — обнаруживает известные техники |
| Обновление Windows | Высокая — официальный патч устраняет уязвимость |
rule CVE_2025_60709_CLFS_LPE {
meta:
description = "Detects CVE-2025-60709 CLFS LPE exploit"
author = "KONDORDEVSECURITYCORP"
date = "2026-03"
cve = "CVE-2025-60709"
severity = "critical"
strings:
$clfs_sig = { 01 02 00 00 }
$magic = { 37 13 37 13 }
$evil_file = "evil.blf" ascii wide
$groom_file = "groom_" ascii wide
$etw_func = "EtwEventWrite" ascii wide
$amsi_func = "AmsiScanBuffer" ascii wide
$token_off = { C0 04 00 00 } // EPROCESS_TOKEN = 0x4C0
condition:
3 of them
}
| Тип | Значение |
|---|---|
| Неправильный файл | C:\Windows\Temp\evil.blf |
| Неправильный журнал | \\.\C:\Windows\Temp\evil_log |
| Файлы grooming | C:\Windows\Temp\groom_00000.blf … groom_04095.blf |
| Процесс | Аномальный приоритет REALTIME_PRIORITY_CLASS |
ФАЙЛ: Массовое создание *.blf в C:\Windows\Temp\ (> 100 за секунды)
ФАЙЛ: Создание C:\Windows\Temp\evil.blf
ПРОЦЕСС: Процесс в режиме REALTIME_PRIORITY + вызовы ClfsReadRestartArea
ПАМЯТЬ: Запись в PAGE_EXECUTE_READWRITE + немедленный CreateThread
API: VirtualProtect над EtwEventWrite или AmsiScanBuffer
ЯДРО: Доступ к PsInitialSystemProcess из пользовательского режима
# Проверить файлы grooming
Get-ChildItem C:\Windows\Temp -Filter "groom_*.blf" | Measure-Object
# Проверить файл эксплойта
Test-Path C:\Windows\Temp\evil.blf
# Проверить целостность ntdll (патч ETW)
Get-AuthenticodeSignature (Get-Process -Name notepad | Select -First 1).Path
CVE-2025-60709 — это уязвимость локального повышения привилегий (LPE) в драйвере CLFS.sys (Common Log File System) Windows. Она позволяет атакующему с локальным выполнением кода повысить привилегии от стандартного пользователя до NT AUTHORITY\SYSTEM через переполнение буфера при разборе контейнеров CLFS, получая примитив произвольной записи в память ядра.
Этот репозиторий содержит две реализации:
| Поле | Деталь |
|---|---|
| CVE ID | CVE-2025-60709 |
| Тип | Локальное повышение привилегий (LPE) |
| Компонент | CLFS.sys (драйвер Common Log File System) |
| Целевая ОС | Windows 11 24H2 (сборка 26100.3485+) |
| Архитектура | Только x64 |
| Вектор | Переполнение буфера при разборе контейнера CLFS |
| Воздействие | Повышение до NT AUTHORITY\SYSTEM |
| Предварительные условия | Локальное выполнение кода (стандартный пользователь) |
[1] ОБХОД ЗАЩИТЫ
├─ KillETW() → Патчит EtwEventWrite в ntdll с помощью RET (0xC3)
└─ KillAMSI() → Патчит AmsiScanBuffer в amsi.dll с помощью RET (0xC3)
[2] HEAP GROOMING
└─ GroomLookaside()
├─ Создаёт 4096 файлов: C:\Windows\Temp\groom_00000.blf
├─ Вызывает CreateLogFile() + AddLogContainer() для каждого
└─ Истощает lookaside списки → гарантирует предсказуемый макет кучи
[3] ПРИМИТИВ ПРОИЗВОЛЬНОЙ ЗАПИСИ — ClfsArbWrite(Address, Value)
├─ Создаёт неправильно сформированный буфер CLFS (0x102010 байт)
│ ├─ Действительная подпись CLFS в +0x00: 0x0201
│ ├─ Oversized cbRecord в +0x100: 0xFF00 (65 280 байт)
│ ├─ Маркер теневой зоны в +0x9A8: 0x13371337
│ └─ Поддельный CClfsContainerContext по смещению (0xFF00 + 0x100):
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value (записываемые данные)
├─ Вычисляет корректную контрольную сумму CLFS (драйвер проверяет)
├─ Записывает неправильный контейнер → C:\Windows\Temp\evil.blf
├─ Создаёт журнал, указывающий на evil.blf
├─ Вызывает ClfsReadRestartArea() → запускает разбор в ядре
└─ Драйвер переполняет буфер → записывает Value по адресу Address ✓
[4] КРАЖА ТОКЕНА SYSTEM
├─ Читает EPROCESS процесса SYSTEM через PsInitialSystemProcess
└─ Извлекает токен по адресу EPROCESS + 0x4C0
[5] ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
└─ ClfsArbWrite(CurrentEprocess + 0x4C0, SystemToken)
└─ Перезаписывает токен текущего процесса токеном SYSTEM ✓
[6] ЗАПУСК ПОЛЕЗНОЙ НАГРУЗКИ C2
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ Копирует 1789-байтовый shellcode beacon
├─ CreateThread() → выполняется как NT AUTHORITY\SYSTEM
└─ Beacon: IPv6 + DoH C2 → резервный канал Gmail drafts
└─ sRDI + обфускация сна + ETW/AMSI уже пропатчены
[7] ПЕРСИСТЕНТНОСТЬ
└─ Sleep(INFINITE) → процесс сохраняет токен SYSTEM
| Поле | Смещение | Описание |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | Токен безопасности процесса |
EPROCESS_PID | 0x440 | Идентификатор процесса |
EPROCESS_LINKS | 0x448 | Связанный список активных процессов |
EPROCESS_NAME | 0x5A8 | Имя процесса (ImageFileName) |
⚠️ Эти смещения различаются между сборками Windows. Должны быть обновлены для других версий.
Легитимный контейнер CLFS:
[Заголовок 0x100 байт][Запись: cbRecord байт реальных данных]
Неправильный контейнер (evil.blf):
[Действительный заголовок][cbRecord=0xFF00 → ядро читает 65 280 байт]
↓
Переполнение в ядре → достигает поддельного CClfsContainerContext
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
Драйвер использует поддельную структуру → записывает ValueToWrite по адресу TargetKernelAddress
CVE-2025-60709.c| Функция | Назначение |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → база ntoskrnl.exe |
KillETW() | VirtualProtect + перезапись EtwEventWrite в ntdll.dll с 0xC3 (RET) |
KillAMSI() | Загрузка amsi.dll + перезапись AmsiScanBuffer с 0xC3 (RET) |
GroomLookaside() | Создание 4096 журналов CLFS для истощения lookaside списков → детерминированная куча |
ClfsArbWrite() | Ядро эксплойта — примитив произвольной записи в память ядра |
main() | Оркестровка: ETW→AMSI→groom→кража токена→arb write→beacon |
| Аспект | Версия C | Версия Go |
|---|---|---|
| Тип | Рабочий эксплойт (согласно документации) | Только обучающая демонстрация |
| API | Прямой доступ (ntdll, clfsw32, advapi32) | Обёртки syscall.NewLazyDLL() |
| Контрольная сумма CLFS | Полный алгоритм | Упрощённый заполнитель |
| Ядерные адреса | Реальные | Жёстко заданный заполнитель (0x123456) |
| Полезная нагрузка C2 | 1789-байтовый шеллкод | Байты NOP (0x90) |
| Ожидаемый результат | Повышение до SYSTEM | Сообщение "Arb write failed (yeah)" |
Версия C (требуется Visual Studio Build Tools + Windows SDK):
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Версия Go (требуется Go 1.19+ на Windows x64):
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go
| Смягчение | Эффективность |
|---|---|
| HVCI (Защита целостности кода под гипервизором) | Высокая — предотвращает запись в память ядра |
| kCFI (Целостность потока управления ядра) | Высокая — блокирует цепочки ROP/JOP |
| CFG (Защита потока управления) | Средняя — затрудняет выполнение шеллкода |
| Защитник Windows | Средняя — обнаруживает известные техники |
| Обновление Windows | Высокая — официальный патч устраняет уязвимость |
rule CVE_2025_60709_CLFS_LPE {
meta:
description = "Detects CVE-2025-60709 CLFS LPE exploit"
author = "KONDORDEVSECURITYCORP"
date = "2026-03"
cve = "CVE-2025-60709"
severity = "critical"
strings:
$evil_file = "evil.blf" ascii wide
$groom_file = "groom_" ascii wide
$etw_func = "EtwEventWrite" ascii wide
$amsi_func = "AmsiScanBuffer" ascii wide
$magic = { 37 13 37 13 }
$token_off = { C0 04 00 00 }
condition:
3 of them
}
| Тип | Значение |
|---|---|
| Неправильный файл | C:\Windows\Temp\evil.blf |
| Неправильный журнал | \\.\C:\Windows\Temp\evil_log |
| Файлы grooming | C:\Windows\Temp\groom_00000.blf … groom_04095.blf |
| Процесс | Аномальный приоритет REALTIME_PRIORITY_CLASS |
ФАЙЛ: Массовое создание *.blf в C:\Windows\Temp\ (> 100 за секунды)
ФАЙЛ: Создание C:\Windows\Temp\evil.blf
ПРОЦЕСС: Процесс в режиме REALTIME_PRIORITY + вызовы ClfsReadRestartArea
ПАМЯТЬ: Запись в PAGE_EXECUTE_READWRITE + немедленный CreateThread
API: VirtualProtect над EtwEventWrite или AmsiScanBuffer
ЯДРО: Доступ к PsInitialSystemProcess из пользовательского режима
# Проверить файлы grooming
Get-ChildItem C:\Windows\Temp -Filter "groom_*.blf" | Measure-Object
# Проверить файл эксплойта
Test-Path C:\Windows\Temp\evil.blf
RU: Данный PoC эксплойта публикуется только для исследований безопасности, анализа уязвимостей, разведки угроз и защитных целей. Использование этого кода против систем без явного письменного разрешения незаконно и может нарушать CFAA, Computer Misuse Act и аналогичные законы. Авторы не несут ответственности за неправомерное использование.
EN: This exploit PoC is published for security research, vulnerability analysis, threat intelligence, and defensive purposes ONLY. Using this code against systems without explicit written authorization is illegal and may violate the CFAA, Computer Misuse Act, and equivalent laws. Authors assume no liability for misuse.