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

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

    Скидки до 10%

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

Статья Avast Anti-Virus CVE-2023-1585 CVE-2023-1587 Privileged file operation abuse: разбор уязвимости

Avast-Service-Not-Responding.png

0x00: Введение

Автор - небольшой любитель уязвимостей типа Privileged file operation abuse, т.к. довольно специфические уязвимости. К сожалению, не всегда приложенные усилия равны результату, но не в этот раз)
В этот раз мой взгляд упал на Avast. После беглого изучения его механизма удаления вредоносных программ я провел ресерч и обнаружил подобные исследования от и , которые касались подобных уязвимостей. Моя цель заключалась в выполнении кода от SYSTEM в результате абьюза механизма удаления вредоносных файлов. Конечно, я понимал всю сложность данного ресерча, но как говорится, глаза краснеют, руки делают. Ниже вы прочитаете какие шаги я делал, чтобы дойти до рабочего POC. Приятного и познавательного чтения)

0x01: Поверхностный обзор уязвимости и возможный импакт при эксплуатации

Антивирус Avast начиная с вер. 22.3.6008 (я не проверял предыдущие версии, но вполне вероятно, что они также уязвимы), при обнаружении ВПО удаляет файл от учетной записи SYSTEM. Чтобы предотрватить атаки перенаправления файлов, он проверяет весь путь на наличие любых типов ссылок, преобразует путь в путь без ссылок и только после этого удаляет файл. Однако проверка пути и удаление файла не являются последовательными операциями, поэтому данный алгоритм имеет уязвимость TOCTOU: манипулируя ссылками пути, злоумышленник может перенаправить операции сервиса и удалить произвольный файл/директорию. Этой уязвимости присвоен номер .

Хотя удаление произвольного файла/каталога само по себе не является критической уязвимостью, эта ошибка может быть докручена до выполнения кода от SYSTEM. Для этого злоумышленнику необходимо использовать вулну для удаления содержимого каталога "C:\ProgramData\Avast Software\Avast\fw", а затем удалить сам каталог. После этого перезапустить основной процесс (AvastSvc.exe) через перезагрузку или краш, как это реализовано в PoC. При запуске, если вышеупомянутого каталога не существует, служба воссоздает его с разрешительным - полный доступ для всех. Затем атакующему достаточно вызвать RPC-метод, который выполнит привилегированный в полностью контролируемом атакующим каталоге. Такой привилегированный метод, какCopyFile(), приводит к произвольной записи файлов и, соответственно, выполнению кода от лица SYSTEM. Данному багу в сервисе была присвоена , другие проблемы были классифицированы как странное поведение.

0x02: Анализ первопричины

При обнаружении вируса (2) Avast Anti-Virus (AV) удаляет файл в статусе учетной записи SYSTEM. Это довольно опасно, поскольку, манипулируя ссылками в контролируемом пути, злоумышленник может спровоцировать ситуацию, когда антивирусная служба удалит не тот файл. Разработчики Avast знают об этом риске, поэтому антивирусная служба пытается создать файл со случайным именем в том же каталоге. Это снижает риск создания перехода, поскольку переход может быть создан только в пустом каталоге (символические ссылки требуют прав администратора, жесткие ссылки не опасны для операций удаления файлов - таким образом, они являются недоступными инструментами злоумышленника). Но если попытка создать файл со случайным именем не удалась (4), AV-сервис продолжает реализовывать собственный алгоритм. Таким образом, это решение является необязательным, поскольку атакующий может просто установить запрещающий FILE_ADD_FILE для SYSTEM на родительский каталог (1).

QuarantineExploit_Trace1.png


Затем главная служба AV проверяет весь путь к вирусу на наличие любых типов ссылок (5), преобразует путь в путь без ссылок и только после этого удаляет файл. Эти действия AV-сервис предпринимает для того, чтобы предотвратить атаки перенаправления файлов. Но без успешно созданного файла со случайным именем родительский каталог вируса не блокируется от создания ссылок на его место.

QuarantineExploit_2.png


Между ранее описанными проверками пути и последующим описанием удаления файла существует временной промежуток, когда злоумышленник может перенаправить путь в другое место. Это временное окно довольно короткое, но злоумышленник может его продлить. После проверки пути и перед удалением файлов AvastSvc записывает логи (6) в файл журнала с именем "C:\ProgramData\Avast Software\Avast\log\Cleaner.log". Поэтому, если злоумышленник установит RWH-запрет (3) на Cleaner.log, он заблокирует выполнение алгоритма удаления вируса и злоумышленник сможет надежно переадресовать (7) родительский каталог вируса в ранее недоступное место. Хорошей новостью является то, что в момент срабатывания блокировки, обработчики файлов внутри каталога не открыты.

QuarantineExploit_3.png


После переключения директорий основная AV-служба по символическим ссылкам удаляет произвольный файл/директорию (8) по желанию злоумышленника. Более того, благодаря привилегиям сервиса и флагам CreateFile() злоумышленник может удалить даже файлы, защищенные : файлы, принадлежащие TrustedInstaller, доступные с правами READ-only для SYSTEM.

QuarantineExploit_4.png


Если собрать все шаги вместе, то для успешной эксплуатации произвольного удаления файла/директории (CVE-2023-1585) нам нужно сделать следующее:
  1. Создать каталог ".\Switch" DACL с ограничениями (запретите FILE_ADD_FILE для SYSTEM) и протестировать EICAR-вирус ".\Switch\{GUID}.dll";
  2. Создайте блокировку на "C:\ProgramData\Avast Software\Avast\log\Cleaner.log" и подождите, пока тестовый вирус будет помещен в карантин;
  3. Когда срабатывает блокировка, удалите тестовый вирус ".\Switch\{GUID}.dll" и поменяйте родительский каталог с точкой монтирования на родную символическую ссылку, например, точка монтирования ".\Switch" -> "\RPC Control" и родная символическая ссылка "\RPC Control\{GUID}.dll" -> "??\C:\Windows\System32\aadjcsp.dll";
  4. Снимите блокировку, подождите пару секунд, затем убедитесь, что "C:\Windows\System32\aadjcsp.dll" была удалена.
Произвольное удаление файлов/каталогов не является серьезной уязвимостью, обычно оно приводит только к DoS. Однако существуют подходы, позволяющие довести эту не критическую уязвимость до выполнения кода от SYSTEM - и . Первый уже исправлен в современных операционных системах, а второй не надежен из-за эксплуатируемого состояния гонки. Поэтому было решено найти собственный, еще не исправленный 100% надежный способ улучшить импакт этой вулны.

В кодовой базе Avast был обнаружен путь, который может помочь модернизировать удаление файла/директории до выполнения кода. При запуске, если каталог "C:\ProgramData\Avast Software\Avast\fw" не существует, служба AvastSvc.exe создает его с - полный доступ для всех.
Ожидание перезагрузки компьютера или сервиса может занять много времени, поэтому в RPC-интерфейсе с именем "aswChest" и UUID "c6c94c23-538f-4ac5-b34a-00e76ae7c67a" была обнаружена ошибка null dereference (CVE-2023-1587). Когда злоумышленник вызывает Proc3 для добавления файла в сундук, он должен указать массив пар ключ-значение (так называемые свойства файла), и если имя свойства (*propertiesArray на изображении) равно null, сервис немедленно завершается.

IDA_null_deref.png


Как уже было сказано, после перезапуска главная служба Avast создает каталог "C:\ProgramData\Avast Software\Avast\fw", если он не существует. А для злоумышленника остается найти код, который управляет файлами в этой директории таким образом, что позволит получить произвольную запись файлов. Это могут быть различные варианты подходящих шаблонов кода, но был найден путь кода, реализующий сброс *.ini файлов внутри директории. Этот код доступен из RPC-интерфейса с именем "[Aavm]" с UUID eb915940-6276-11d2-b8e7-006097c59f07. Когда злоумышленник вызывает метод с индексом 58, сервис копирует, например, файл "config.ori" в "config.xml" внутри каталога "C:\ProgramData\Avast Software\Avast\fw". Такого приема достаточно для получения уязвимости Arbitrary File Write.

И последнее, вероятно, самое важное - Avast AV предотвращает доступ к собственным RPC-интерфейсам для недоверенных процессов. Это реализовано как часть механизма самозащиты. При выделении интерфейса RPC для дальнейшего взаимодействия с интерфейсом RPC-сервер проверяет, является ли клиент доверенным, и только в этом случае создает для него корректный хэндл. Для обхода этого ограничения был реализован обход самозащиты на основе для конфигурирования дочернего процесса AvastUI.exe и последующего инжекта через dll-planting. Я не хочу вдаваться в подробности этой темы здесь, но вы можете проверить это в исходном коде PoC.

Соединив обе уязвимости (CVE-2023-1585 и CVE-2023-1587) в единую цепочку, злоумышленник может получить произвольную запись файлов:
  1. Используя CVE-2023-1585 удалить целевой файл, содержимое каталога "C:\ProgramData\Avast Software\Avast\fw" и затем удалить сам каталог;
  2. Обход самозащиты и вызов Proc3 RPC-интерфейса "aswChest" приводит к аварийному завершению работы и перезапуску основного сервиса (CVE-2023-1587);
  3. Убедитесь, что каталог "C:\ProgramData\Avast Software\Avast\fw" теперь доступен всем;
  4. Создайте точку монтирования на родную символическую ссылку, например, точка монтирования "C:\ProgramData\Avast Software\Avast\fw" -> "\RPC Control" и родные символические ссылки "\RPC Control\config. ori" -> "??\C:\Users\User\Desktop\PoC\pwn.txt", "\RPC Control\config.xml" -> "??\C:\Windows\System32\aadjcsp.dll".
  5. Вызов Proc58 RPC-интерфейса "[aswAavm]" для запуска привилегированного CopyFile() в каталоге "C:\ProgramData\Avast Software\Avast\fw";
  6. Убедитесь, что "C:\Windows\System32\aadjcsp.dll" была успешно заменена.

0x03: Proof-of-Concept

Исходный код POC вы можете найти .

Шаги для воспроизведения:
  1. Скопируйте AswQuarantineFileExploit.dll на целевую виртуальную машину, где уже установлен Avast Free Anti-Virus;
  2. Запустите powershell.exe и вызовите rundll32.exe с DLL AswQuarantineFileExploit.dll, экспортированной функцией Exploit и двумя аргументами: 1-й - имя файла, заменяющего файл, указанный 2-м аргументом, 2-й - имя заменяемого файла. Пример командной строки rundll32:
    Код:
    rundll32 .\AswQuarantineFileExploit.dll,Exploit C:\Users\User\Desktop\PoC\pwn.txt C:\Windows\System32\aadjcsp.dll
    . Эксплойт также может создать файл, если он не существует, и перезаписать файлы, принадлежащие TrustedInstaller и доступные READ-ONLY для учетной записи SYSTEM.
  3. Убедитесь, что файл, переданный в качестве второго аргумента, был успешно заменен файлом, переданным в качестве первого аргумента.
Ниже вы можете ознакомиться с POC:



Примечание: Стоит отметить, что код PoC адаптирован для Avast Free Antivirus 22.5.6015 (сборка 22.5.7263.728). Это важно, поскольку эксплойт интенсивно использует RPC-интерфейсы, а расположение RPC-интерфейса может незначительно меняться между версиями продукта.

Выполнение произвольного кода от SYSTEM намеренно не продемонстрировано в данном POC.

Спасибо всем, кто прочитал данную статью. Вы стали ещё умнее после её полного прочтения!
 
Последнее редактирование:
Мы в соцсетях:

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