китайцы из matousec снова открывают америку (продолжение BSODhook) h__p://www.matousec.com/info/articles/khobe-8.0-earthquake-for-windows-desktop-security-software.php Только вот меня смущает то, что они называют зироудэй уязвимость - на самом деле типичный пример race condition. У меня вопрос к васмовцем, неужели никто не применял данную технику для убийства процессов "проактивок"?
С изменением памяти на которую указывает PUNICODE_STRING всё ясно. а каким хитрым способом изменить значение handle'a?
Ev0lwaves Хэндлер выполняется на нулевом IRQL с разрешённой ядерной APC(Suspend-APC). Тоесть можно исполнить атаку типо race condition. Атакующий код должен находится в ином потоке. Он передаёт описатель текущего процесса(это не приведёт к завершению процесса, так как права соответствующие не заданы при открытии, тогда NtTerminateProcess возвратит STATUS_ACCESS_DENIED) в сервис, при этом второй поток останавливает текущий, освобождает описатель и открывает целевой процесс. Значение описателя будет такимже. Затем текущий поток ресумится. Тоесть достигается останов потока на: Код (Text): status=OldNtTerminateProcess(ProcessHandle,ExitStatus); и замена описателя. Это распростанённый тип атаки. Кстате в wrk в resource.c дано чёткое описание:
Clerk Примерно такой псевдокод: Код (Text): status=ZwQueryInformationProcess(ProcessHandle,ProcessBasicInformation,&info,sizeof(info),NULL);стопим после выполнения этого NtClose(ProcessHandle); NtOpenProcess(...);//открываем процесс HIPS, Handle в нашем стопнутом треде будет иметь смысловое значение handle'a HIPS //будим тред и тут вызывается status=OldNtTerminateProcess(ProcessHandle,ExitStatus);//что закрывает защищённый процесс То есть по Вашему мнению, авторы "проактивок" не учли, что надо использовать KeEnterCriticalRegion и копировать(или блокировать доступ?) память на которую ссылаются поинтеры в SSDT хуках?
Ev0lwaves Смысл в изменении обькта описываемого хэндлом без изменения его значения. Например имеется у вас описатель файла со значением 0x30. Вы его освобождаете, закрыв после чего открываете к примеру эвент. Значение описателя не поменяется, по прежнему будет 0x30, но описывать он будет новый обьект, тоесть эвент. В данном случае псевдокод следующий: Первый тред. o Открываем текущий процесс, из флагов удаляем PROCESS_TERMINATE. o Взводим фалажёк Synch. o Вызываем NtTerminateProcess передав описатель. Второй тред. o Ждём Synch. o Суспендим первый тред. o Закрываем описатель процесса. o Открываем целевой процесс с флагом PROCESS_TERMINATE. o Ресумим первый тред. - Разумеется это выполняется в цикле при большом числе итераций. Обычно для окончания атаки нужно не более нескольких сот миллисекунд, что не долго.
Не только перехваты, это частный случай. В протах вобще юзается KeEnterCriticalRegion()/поднимается IRQL очень редко.