Исследование

Драйвер Windows CLFS и пять эксплойтов операторов шифровальщиков (№ 1: CVE-2022-24521)

Это вторая часть нашей статьи о файловой системе CLFS и пяти уязвимостях этого компонента ОС Windows, встречавшихся в кампаниях шифровальщиков на протяжении года. Если вы еще не ознакомились с первой частью, прочтите сначала ее.

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

Эксплойт № 1: CVE-2022-24521

История, которая привела к написанию этого исследования, началась в апреле 2022 года с выпуска обновления для CVE-2022-24521. Об этой уязвимости стало известно в результате появлении «в дикой природе» эксплойта нулевого дня, о котором сообщили Агентство национальной безопасности (NSA) и специалисты CrowdStrike Адам Подлоски (Adam Podlosky) и Амир Базин (Amir Bazine). К сожалению, мы не знаем в деталях, как была обнаружена эта уязвимость и какой злоумышленник ею воспользовался т.к. не видели, чтобы эта уязвимость использовалась в атаках на наших клиентов до того, как вышло исправление, и те, кто ее выявил, не опубликовали эту информацию.

Вскоре после выпуска исправления мы увидели на форумах в даркнете объявления о продаже эксплойта первого дня к этой уязвимости и начали наблюдать атаки с применением эксплойта к этой уязвимости. Артефакты в обнаруженном нами эксплойте говорят о том, что он был создан как эксплойт первого дня после выпуска исправления.

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

Метод использования уязвимости в обнаруженном нами эксплойте отличается от описанного здесь. Эксплойт создает новый файл BLF с помощью функции CreateLogFile и изменяет в нем всего пять значений. Эти изменения представлены ниже.

Модификации, вносимые в файл BLF эксплойтом № 1 (CVE-2022-24521)

Модификации, вносимые в файл BLF эксплойтом № 1 (CVE-2022-24521)

Последняя модификация касается значения CLFS_BASE_RECORD_HEADER->rgClients[0], которое должно указывать на структуру CLFS_CLIENT_CONTEXT. Цель остальных изменений и возможная первопричина уязвимости становятся ясны при наложении новой структуры CLFS_CLIENT_CONTEXT поверх уже существующих структур в файле BLF.

Наложение новой структуры CLFS_CLIENT_CONTEXT на существующую структуру CLFS_CONTAINER_CONTEXT

Наложение новой структуры CLFS_CLIENT_CONTEXT на существующую структуру CLFS_CONTAINER_CONTEXT

В результате модификаций создается новая структура CLFS_CLIENT_CONTEXT с действительными значениями cbSymName и cbOffset структуры CLFSHASHSYM, которая должна ей предшествовать; cidClient получает значение 0, а llCreateTime получает значение 0x40000000, и оно накладывается на плейсхолдер для указателя ядра на класс CClfsContainer.

При открытии или закрытии файла BLF контейнеры всегда обрабатываются после клиентов.

При открытии файла BLF:

  1. Функция CClfsLogFcbPhysical::Initialize закэширует некоторые значения из CLFS_CLIENT_CONTEXT, включая дату создания файла — 0x40000000.
  2. Функция LoadContainerQ перепишет 0x40000000 действительным указателем на класс CClfsContainer.

При закрытии файла BLF:

  1. Функция CClfsLogFcbPhysical::FlushMetadata восстановит закэшированную дату создания файла 0x40000000 для клиента, в результате чего указатель на класс CClfsContainer будет переписан значением 0x40000000!
  2. Код вызовет функцию CClfsLogFcbPhysical::CloseContainers для закрытия всех контейнеров.
  3. Значение 0x40000000 будет передано как указатель в функцию CClfsContainer::Close.
Функция CClfsContainer::Close

Функция CClfsContainer::Close

Передача управляемого адреса в функцию CClfsContainer::Close позволяет злоумышленникам уменьшить произвольное значение в памяти ядра с помощью функции ObDereferenceObject.

Получив возможность уменьшать произвольные значения в памяти, злоумышленники могут повысить свои привилегии, используя мощную технику под названием PreviousMode. Структура ядра KTHREAD, создаваемая для всех потоков, имеет поле с именем PreviousMode. С его помощью некоторые функции ядра проверяют, были ли они вызваны напрямую из ядра или через системный вызов из кода пользовательского уровня. Для потоков ядра это значение равно нулю (false), для потоков пользовательского режима — единице (true).

Функция MiReadWriteVirtualMemory

Функция MiReadWriteVirtualMemory

Функции и системные вызовы NtReadVirtualMemory и NtWriteVirtualMemory по значению флага PreviousMode определяют, можно ли выполнять считывание и запись в память ядра. Уменьшив значение флага PreviousMode с 1 до 0 в структуре KTHREAD, связанной с потоком эксплойта, злоумышленники смогут считывать и записывать память ядра через эти системные вызовы.

Насколько нам известно, впервые этот прием был упомянут в презентации Тарджея Мандта (Tarjei Mandt) Modern Kernel Pool Exploitation: Attacks and Techniques (Современная эксплуатация пула ядра: атаки и техники) в 2011 году. Однако «в дикой природе» мы впервые столкнулись с этой техникой в 2018 году в эксплойте нулевого дня к уязвимости CVE-2018-8611 (повышение привилегий с помощью диспетчера транзакций ядра), который был описан в нашей презентации Overview of the latest Windows OS kernel exploits found in the wild (Обзор последних эксплойтов ядра ОС Windows, обнаруженных «в дикой природе») на конференции BlueHat 2019 года в Шанхае. Сегодня этот метод широко известен и активно используется, так что мы рады, что компания Microsoft наконец-то приняла меры для его нейтрализации.

Чтобы использовать технику PreviousMode, злоумышленникам нужно знать адрес структуры KTHREAD для текущего потока. Эксплойт получает этот адрес с помощью широко известной функции, которая раскрывает информацию об адресном пространстве ядра — NtQuerySystemInformation. Первый аргумент этой функции — класс запрашиваемых сведений о системе. Эта функция поддерживает несколько классов сведений о системе, которые не упомянуты в документации. Эксплойт получает нужный адрес структуры KTHREAD с помощью класса SystemExtendedHandleInformation (0x40).

Важно отметить, что техника NtQuerySystemInformation работает при среднем уровне целостности (integrity level, IL). По мнению Microsoft, доступность этой информации для процессов и пользователей среднего IL — часть штатного поведения. Однако случаи, когда API NtQuerySystemInformation предоставляет сведения об адресном пространстве ядра процессу или пользователю низкого IL, считаются уязвимостями и регистрируются как CVE. Пример такой уязвимости — CVE-2021-31955 (класс сведений о системе SuperfetchPrivSourceQuery), которая была использована в цепочке APT-атаки PuzzleMaker на Google Chrome. По нашему мнению, не стоило оставлять такую лазейку для процессов среднего IL, благодаря которой уже не один год существуют эксплойты для повышения среднего IL до системного IL. Поэтому мы очень рады тому, что в новых сборках Windows 11 этот прием наконец заблокирован. Однако мы полагаем, что он по-прежнему будет широко применяться в эксплойтах для операционных систем Windows 10 и семейства Windows Server.

Весь процесс эксплуатации на основе двух этих техник выглядит следующим образом:

  1. С помощью техники NtQuerySystemInformation эксплойт получает адрес флага PreviousMode для текущего потока.
  2. Получает адреса токенов текущих и системных процессов посредством той же техники.
  3. Получает адрес функции ClfsSetEndOfLog посредством той же техники. Это функция «пустышка», которая предотвращает вывод исключения дальнейшим кодом.
  4. Выделяет буфер по адресу 0x40000000.
  5. Размещает в выделенном буфере необходимые данные с соответствующими относительными адресами.
  6. Задействует уязвимость и уменьшает значение флага PreviousMode с 1 до 0.
  7. Использует функции NtReadVirtualMemory/NtWriteVirtualMemory, чтобы перезаписать токен и получить системные привилегии.

Перейдите по ссылке, чтобы ознакомиться со следующей частью:

Драйвер Windows CLFS и пять эксплойтов операторов шифровальщиков (№ 1: CVE-2022-24521)

Ваш e-mail не будет опубликован. Обязательные поля помечены *

 

Отчеты

StripedFly: двуликий и незаметный

Разбираем фреймворк StripedFly для целевых атак, использовавший собственную версию эксплойта EternalBlue и успешно прикрывавшийся майнером.

Азиатские APT-группировки: тактики, техники и процедуры

Делимся с сообществом подходами, которые используют азиатские APT-группировки при взломе инфраструктуры, и подробной информацией о тактиках, техниках и процедурах (TTPs) злоумышленников, основанной на методологии MITRE ATT&CK.

Как поймать «Триангуляцию»

Эксперты «Лаборатории Касперского» смогли получить все этапы «Операции Триангуляция»: эксплойты нулевого дня для iOS, валидаторы, имплант TriangleDB и дополнительные модули.

Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике