Контакты
Подписка
МЕНЮ
Контакты
Подписка

В Windows обнаружена ошибка, вызывающая взаимную блокировку

В Windows обнаружена ошибка, вызывающая взаимную блокировку

В Windows обнаружена ошибка, вызывающая взаимную блокировку


01.02.2018

Пользователь GitHub под псевдонимом leo-yuriev сообщил об уязвимости в версиях Windows с 8-й по 10-ю, вызывающей взаимную блокировку (deadlock) в файловых операциях.

Процедуры из трех операций LockFile + WriteFile + UnlockFile;

Два потока, конкурентно выполняющие процедуру;

В результате возникает взаимная блокировка между потоками, но процесс можно убить без видимых последствия для ядра.

 В качестве побочного эффекта замечено, что в результате взаимной блокировки утилита Process Hacker для мониторинга системных процессов и служб не может получить имя файла по проблемному хендлу. Хендл становится "unnamed" и исчезает из отображаемого набора (при наличии соответствующего флажка по умолчанию).

Примерные трейсы из ядра из 8.1-ent

 Стек первого потока:

 nt!KiSwapContext+0x7a

 nt!KiCommitThreadWait+0x1d2

 nt!KeWaitForSingleObject+0x19f

 nt!IopSynchronousServiceTail+0x2a9

 nt!NtLockFile+0x514

 nt!KiSystemServiceCopyEnd+0x13

 Стек второго потока:

 nt!KiSwapContext+0x7a

 nt!KiCommitThreadWait+0x1d2

 nt!KeWaitForSingleObject+0x19f

 nt!IopAcquireFileObjectLock+0x84

 nt! ?? ::NNGAKEGL::"string-+0x491d5

 nt!KiSystemServiceCopyEnd+0x13

С работающим тест-кейсом можно ознакомиться здесь.

Взаимная блокировка – ситуация в многозадачной среде или СУБД, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами.

 

Securitylab