BSOD в win32k.sys dl // 04.11.08 01:11
Дмитрий Кононко aka Killer {R} обнаружил устойчиво воспроизводимую проблему с пользовательскими Win32-программами под Win'2k3, Vista x86 и x64. [Не забывайте при копировании материала указывать полный адрес источника: //bugtraq.ru/rsn/archive/2008/11/01.html] Для проведения атаки достаточно прав обычного пользователя, что особенно неприятно - завалить систему с правами администратора каждый может, то ли дело из-под рядового юзера.
Многократное переключение между Win32-объектами "рабочий стол" (desktop), на которых есть окна, с одновременным созданием потоков, устанавливающих/снимающих Win32-хуки на этих столах, и рассылающих на них оконные сообщения, в половине случаев приводит к BSODу из-за AV в коде win32k.sys, а в другой половине - к зависанию системы.
Происходит это предположительно из-за race condition с потоком, который снимает хук, и одновременной доставкой сообщения в другой поток - видимо, оно пытается вызвать только что убитый хук. Пока непонятно, имеют ли десктопы к этому прямое отношение, или просто эти действия приводят к каким-либо особенным условиям тайминга исполнения плохо синхронизированного кода. По крайней мере, в дампе ничего напрямую про десктопы не видно, но без них воспроизвести ситуацию пока не получилось.
Доступны исходные тексты в виде проекта для VC6, а также скомпилированные бинарные файлы (exe+dll).
"Многократное переключение между Win32-объектами "рабочий стол" (desktop), на которых есть окна, с одновременным созданием потоков, устанавливающих/снимающих Win32-хуки на этих столах, и рассылающих на них оконные сообщения"
Очень нетривиальная последовательность операций! Ладно: "почесать правое ухо левой рукой через-под правое колено". Но когда это надо сделать 1000 раз подряд... Ясно, что чел наткнулся на этот глюк случайно, но что же он такое сотворил?
Писал (вернее переписывал) свою виндовую тулзу у которой в...05.11.08 11:40 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 05.11.08 12:02 Количество правок: 1
Писал (вернее переписывал) свою виндовую тулзу у которой в фичах есть виртуальные десктопы. Тулза делала следующее - переключала дестопы и ставила на текущем активном десктопе хуки на мышь клаву etc для некоторых своих других фич. Ну я вначале исключительно из соображений экономии ресурсов снимал хуки с неактивного дестопа при переключении на другой. Потом пришлось забить на экономию, потоки не гасить и хуки не снимать, ибо как выяснилось это убивает висту :) Воспроизводилось не то чтобы очень часто, но...
Да, а на HWND_BROADCAST мессагу какую нить я всегда шлю после снятия хуков. Т.к. это приводит в выгрузке длл, содержащей процедуру хука из процессов, в которые она вгрузилась. Что позволяет без ребута апдейтить эту длл потом.
Меинстрим-былокодеры ходят проторенными путями, в которых типо всё «чистенько». Но путь Мастера тернист и непредсказуем ;-)05.11.08 08:12 Автор: HandleX <Александр М.> Статус: The Elderman