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).Затем главная служба AV проверяет весь путь к вирусу на наличие любых типов ссылок (5), преобразует путь в путь без ссылок и только после этого удаляет файл. Эти действия AV-сервис предпринимает для того, чтобы предотвратить атаки перенаправления файлов. Но без успешно созданного файла со случайным именем родительский каталог вируса не блокируется от создания ссылок на его место.
Между ранее описанными проверками пути и последующим описанием удаления файла существует временной промежуток, когда злоумышленник может перенаправить путь в другое место. Это временное окно довольно короткое, но злоумышленник может его продлить. После проверки пути и перед удалением файлов
AvastSvc
записывает логи (6) в файл журнала с именем "C:\ProgramData\Avast Software\Avast\log\Cleaner.log
". Поэтому, если злоумышленник установит RWH-запрет (3) на Cleaner.log
, он заблокирует выполнение алгоритма удаления вируса и злоумышленник сможет надежно переадресовать (7) родительский каталог вируса в ранее недоступное место. Хорошей новостью является то, что в момент срабатывания блокировки, обработчики файлов внутри каталога не открыты.После переключения директорий основная AV-служба по символическим ссылкам удаляет произвольный файл/директорию (8) по желанию злоумышленника. Более того, благодаря привилегиям сервиса и флагам
CreateFile()
злоумышленник может удалить даже файлы, защищенные
Ссылка скрыта от гостей
: файлы, принадлежащие TrustedInstaller
, доступные с правами READ-only
для SYSTEM.Если собрать все шаги вместе, то для успешной эксплуатации произвольного удаления файла/директории (CVE-2023-1585) нам нужно сделать следующее:
- Создать каталог "
.\Switch
" DACL с ограничениями (запретитеFILE_ADD_FILE
Ссылка скрыта от гостейдля SYSTEM) и протестировать EICAR-вирус ".\Switch\{GUID}.dll
"; - Создайте блокировку на "
C:\ProgramData\Avast Software\Avast\log\Cleaner.log
" и подождите, пока тестовый вирус будет помещен в карантин; - Когда срабатывает блокировка, удалите тестовый вирус "
.\Switch\{GUID}.dll
" и поменяйте родительский каталог с точкой монтирования на родную символическую ссылку, например, точка монтирования ".\Switch
" -> "\RPC Control
" и родная символическая ссылка "\RPC Control\{GUID}.dll
" -> "??\C:\Windows\System32\aadjcsp.dll
"; - Снимите блокировку, подождите пару секунд, затем убедитесь, что "
C:\Windows\System32\aadjcsp.dll
" была удалена.
Ссылка скрыта от гостей
и
Ссылка скрыта от гостей
. Первый уже исправлен в современных операционных системах, а второй не надежен из-за эксплуатируемого состояния гонки. Поэтому было решено найти собственный, еще не исправленный 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, сервис немедленно завершается.Как уже было сказано, после перезапуска главная служба 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) в единую цепочку, злоумышленник может получить произвольную запись файлов:
- Используя CVE-2023-1585 удалить целевой файл, содержимое каталога "
C:\ProgramData\Avast Software\Avast\fw
" и затем удалить сам каталог; - Обход самозащиты и вызов
Proc3
RPC-интерфейса "aswChest
" приводит к аварийному завершению работы и перезапуску основного сервиса (CVE-2023-1587); - Убедитесь, что каталог "
C:\ProgramData\Avast Software\Avast\fw
" теперь доступен всем; - Создайте точку монтирования на родную символическую ссылку, например, точка монтирования "
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
". - Вызов
Proc58
RPC-интерфейса "[aswAavm]
" для запуска привилегированногоCopyFile()
в каталоге "C:\ProgramData\Avast Software\Avast\fw
"; - Убедитесь, что "
C:\Windows\System32\aadjcsp.dll
" была успешно заменена.
0x03: Proof-of-Concept
Исходный код POC вы можете найти
Ссылка скрыта от гостей
.Шаги для воспроизведения:
- Скопируйте
AswQuarantineFileExploit.dll
на целевую виртуальную машину, где уже установлен Avast Free Anti-Virus; - Запустите 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. - Убедитесь, что файл, переданный в качестве второго аргумента, был успешно заменен файлом, переданным в качестве первого аргумента.
Примечание: Стоит отметить, что код PoC адаптирован для Avast Free Antivirus 22.5.6015 (сборка 22.5.7263.728). Это важно, поскольку эксплойт интенсивно использует RPC-интерфейсы, а расположение RPC-интерфейса может незначительно меняться между версиями продукта.
Выполнение произвольного кода от SYSTEM намеренно не продемонстрировано в данном POC.
Спасибо всем, кто прочитал данную статью. Вы стали ещё умнее после её полного прочтения!
Последнее редактирование: