BSOD в win32k.sys

4/11/2008 14:03

Дмитрий Кононко aka Killer {R} обнаружил устойчиво воспроизводимую проблему с пользовательскими Win32-программами под Win'2k3, Vista x86 и x64. Для проведения атаки достаточно прав обычного пользователя, что особенно неприятно - завалить систему с правами администратора каждый может, то ли дело из-под рядового юзера. Многократное переключение между Win32-объектами "рабочий стол" (desktop), на которых есть окна, с одновременным созданием потоков, устанавливающих/снимающих Win32-хуки на этих столах, и рассылающих на них оконные сообщения, в половине случаев приводит к BSODу из-за AV в коде win32k.sys, а в другой половине - к зависанию системы. Происходит это предположительно из-за race condition с потоком, который снимает хук, и одновременной доставкой сообщения в другой поток - видимо, оно пытается вызвать только что убитый хук. Пока непонятно, имеют ли десктопы к этому прямое отношение, или просто эти действия приводят к каким-либо особенным условиям тайминга исполнения плохо синхронизированного кода. По крайней мере, в дампе ничего напрямую про десктопы не видно, но без них воспроизвести ситуацию пока не получилось. Доступны исходные тексты в виде проекта для VC6, а также скомпилированные бинарные файлы (exe+dll).
Источник и ссылка на исходный код