• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Гостевая статья Анализ трех ошибок удаленного выполнения кода в безпроводных адаптерах INTEL

Ранее в этом месяце мы опубликовали три ошибки повреждения памяти ( , и - вместе именуемые CVE-2020-0558), затрагивающие два драйвера Windows Wi-Fi для различных Intel двухдиапазонные беспроводные адаптеры. По словам Эти драйверы предназначены для беспроводных адаптеров AC 7265 Rev D, AC 3168, AC 8265 и AC8260. И ZDI-20-494, и ZDI-20-496 являются уязвимостями записи за пределами допустимых пределов, которые имеют общую коренную причину и находятся в обоих драйверах, а именно Netwtw04.sys и Netwtw06.sys. ZDI-20-495 - это уязвимость переполнения стекового буфера, которая затрагивает только драйвер Netwtw06.sys. Эти ошибки были обнаружены Haikuo Xie и Ying Wang из Baidu Security Lab и первоначально были сообщены в ZDI в конце ноября 2019 года.

Вы можете найти копию PoC для всех трех уязвимостей на нашей странице GitHub и ткнуть в них самостоятельно. PoC были протестированы с адаптерами AC 3168 и AC 8260 с использованием сетевого адаптера USB на базе Qualcomm Atheros AR9271.

Все три уязвимости требуют, чтобы жертва включила функцию «Мобильная точка доступа». Злоумышленник может воспользоваться этими уязвимостями, просто подключившись к беспроводной сети с помощью вредоносных MAC-фреймов 802.11, не зная пароля для мобильной точки доступа.

ZDI-20-495

Эта уязвимость переполнения буфера стека существует в Netwtw06.sysдрайвере. PoC отправляет четыре кадра MAC 802.11 в мобильную точку доступа жертвы, вызывая BSOD на компьютере жертвы. Причина уязвимости проста. Слишком длинный SSID передается уязвимой функции через тегированный параметр информационного элемента Tag-length-value-value, расположенный в теле кадра запроса ассоциации 802.11. Ниже приведен анализ вредоносного фрейма, созданного утилитой Scapy:

fig1b.png

Рисунок 1 - Пакетная рассылка вредоносного фрейма 802.11

На приведенной выше диаграмме мы видим информационный элемент с идентификатором 0x00, который соответствует SSID, имеет длину 55 байтов. Далее следует длинная строка SSID.
Уязвимая функция, prvhPanClientSaveAssocResp()копирует SSID в стек стека фиксированной длины memcpy_s()с неверным DstSizeпараметром. Вместо размера буфера назначения он предоставляет предоставленную злоумышленником длину SSID. Ниже приведен фрагмент кода разборки prvhPanClientSaveAssocResp()функции, взятой из версии драйвера 20.70.13.2.

fig2.png

Рисунок 2 - Разборка уязвимой функции prvhPanClientSaveAssocResp ()

В 0x1403A7F5C r8указывает на начало информационного элемента SSID. В 0x1403A7F66 злоумышленнику предоставлена длина SSID (55) DstSize, и это значение позже также передается MaxCount. Передача длины SSID таким способом подрывает безопасность memcpy_s()и является сущностью этой уязвимости. Если мы посмотрим дальше на разборку, то увидим, что буфер стека var_4C имеет длину только 36 байтов:

fig3.png

Рисунок 3 - Стек стека var_4C

Когда memcpy_s()происходит копирование буфера, управляемого злоумышленником, в переменную буфера стека меньшего размера, возникает условие переполнения буфера.

ZDI-20-494 и ZDI-20-496

Поскольку эти две уязвимости имеют одну и ту же основную причину, мы обсудим только ZDI-20-494. В процессе обработки фреймов запроса на ассоциацию существует уязвимость записи за пределы допустимой записи. Чтобы добраться до уязвимого пути кода, злоумышленник должен сначала отправить запрос аутентификации [1] перед отправкой запроса злонамеренной ассоциации. Злоумышленник отправляет кадр запроса ассоциации, содержащий информационный элемент с идентификатором 59 (0x3B), который соответствует поддерживаемым операционным классам. Значение информационного элемента состоит из 221 нулевого байта. Рамка рассечения запроса:

fig4.jpg

Рисунок 4 - Пакетная рассылка вредоносного запроса на ассоциацию, отправленного PoC

Драйвер вызывает две функции для обработки информационного элемента: prvPanCnctProcessAssocSupportedChannelList()и utilRegulatoryClassToChannelList(). При обработке вредоносного запроса prvPanCnctProcessAssocSupportedChannelList()предпринимается попытка вызвать функцию utilRegulatoryClassToChannelList()221 раз, соответствующую длине информационного элемента. Ниже приведен фрагмент кода разборки prvPanCnctProcessAssocSupportedChannelList()функции, взятой из версии драйвера 19.51.23.1 Netwtw04.sys:

fig5.png

Рисунок 5 - Фрагмент разборки prvPanCnctProcessAssocSupportedChannelList ()

В 0x140388500 ebxиндекс цикла инициализируется равным 0. Условие выхода из цикла в 0x1403885AF сравнивает индекс цикла ebxс длиной информационного элемента, сохраненной в eaxрегистре, из четырех предыдущих инструкций [2]. utilRegulatoryClassToChannelList()Функция вызывается в теле цикла на 0x140388559. Третий аргумент функции - это адрес буфера памяти, передаваемый через r8регистр, который является адресом буфера, подверженного этой уязвимости записи за пределами допустимого диапазона. Также обратите внимание, что в 0x14088502 первый DWORDиз буфера инициализируется в ноль.
utilRegulatoryClassToChannelList()Функция считывает первый DWORDбуфера из буфера уязвимого в качестве индекса и использует его как смещение для записи 0xFF байт данных к себе. Это происходит каждый раз, когда вызывается функция. Из-за отсутствия проверки границ индекс может указывать на области памяти за концом буфера, когда эта функция вызывается повторно.

fig6.png

Рисунок 6 - Разборка utilRegulatoryClassToChannelList ()

В 0x1400D06A8 уязвимый буфер из третьего аргумента передается в rbxрегистр. В 0x140D068F индекс цикла ediинициализируется равным 0 до входа в тело цикла. Это будет повторяться в течение 0xFF раз. В базовом блоке, начиная с 0x140D0718, первый DWORDиз буфера считывается и сохраняется в eaxрегистре. Это значение сразу же используется как смещение для уязвимого буфера, и в него записывается байт. В 0x1004D0729 первый DWORDиз уязвимого буфера увеличивается. Записывающее условие записи возникает, когда utilRegulatoryClassToChannelList()функция вызывается более двух раз.

Вывод

Хотя условия запуска этих ошибок встречаются довольно редко, все же очень интересно видеть ошибки на канальном уровне, которые могут пройти через нашу программу. В то время как было несколько разговоров о нечетком информационном элементе, мы не видим много анализов и открытий ошибок на основе Wi-Fi. Семейство стандартов беспроводных технологий IEEE 802.11 предлагает обширную поверхность для атак, и сообщество исследователей уязвимостей только начало изучать протокол. Хорошая ошибка драйвера из этого вектора атаки дает прямой доступ к ядру. По сравнению с атаками на основе веб-браузера, которые требуют множества ошибок и выходов из песочницы, вектор атаки Wi-Fi может быть интересным альтернативным вектором для рассмотрения злоумышленниками. Для тех, кто хочет узнать больше о семействе стандартов IEEE 802.11,Беспроводные сети 802.11: Полное руководство, написанное Мэтью С. Гастом, является отличным ресурсом для начала вашего обучения.

Источнк:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!