
PoC for Acronis Arbitrary File Read - CVE-2022-45451
Драйвер антивирусного сканера "ngscan" от Acronis страдает от неправильного / ненадлежащего контроля доступа, установленного на порту фильтрации связи. Минифильтр-драйвер поддерживает следующие функции, которые могут быть использованы:
Анализ драйвера ngscan.sys начался с декомпиляции драйвера с помощью Ida Pro. Исследователь отметил, что, хотя объект устройства был создан, не было создано символических ссылок для взаимодействия с драйвером через DeviceIoControl.
В связи с этим анализ продолжился наблюдением за возможностями порта фильтрации связи.
Во время инициализации драйвер создаёт пять (5) портов связи для поддержки взаимодействия с другими процессами.

Рис. 1: Подпрограмма, поддерживающая создание до пяти (5) портов фильтрации связи (FCP)
Было замечено, что эта функция вызывается, инициализируя каждый из 5 FCP с DACL по умолчанию, причём последний FCP создаётся с NULL DACL.

Рис. 2: Создание FCP с DACL по умолчанию/NULL
Анализ продолжился наблюдением за функциями CreateNotifyCallback и MessageNotifyCallback, заданными драйвером фильтра. Эти функции обратного вызова вызываются всякий раз, когда процесс открывает соединение и отправляет сообщение на порт связи.

Первоначальная проверка MessageNotifyCallback показала, что буфер входящего сообщения должен удовлетворять следующим требованиям:
После прохождения проверок из InputBuffer извлекается номер функции, который используется в последующих операторах switch для выбора функции, выполняемой с предоставленными данными.

Рис. 3: Подмножество функций, поддерживаемых MessageNotifyCallback
Проверка каждой из поддерживаемых функций показала две функции, представляющие интерес для потенциального злоупотребления, ведущего к произвольному чтению файлов.

Рис. 4: Функции, поддерживающие создание контекста сканирования и возврат файлового дескриптора контекста сканирования (строки 206, 233)
Хотя точная функциональность "контекста сканирования" полностью не известна, анализ показал, что контекст сканирования файла может быть создан для любого файла, указанного пользователем в InputBuffer. После создания контекста сканирования его идентификатор возвращается пользователю в выходном буфере.

Рис. 5: Подпрограмма создания контекста сканирования, возвращающая данные контекста сканирования пользователю

Рис. 6: Данные, отправленные минифильтр-драйверу с запросом доступа к защищённому файлу реестра SAM (\??\C:\Windows\System32\config\SAM)

Рис. 7: Ответ от минифильтр-драйвера, содержащий идентификатор контекста сканирования (0x3aaf)
После создания контекста сканирования и получения его идентификатора дескриптор файла, для которого был создан контекст, может быть открыт в запрашивающем приложении путём повторной отправки сообщения на порт связи.

Рис. 8: Получение дескриптора файла созданного контекста сканирования
Функция, обозначенная как CreateFileReturnHandle0, вызывалась только в том случае, если предыдущая функция SearchScanContextsByID возвращала действительный контекст сканирования.
Например, только если запрашивающий процесс предоставил действительный идентификатор контекста, который ранее был создан вызовом упомянутой функции создания контекста.
Запрашивающая программа успешно открыла дескриптор привилегированного файла, предоставив идентификатор контекста сканирования функции, указанной на рисунке 8 (рисунок 4, строка 233).

Рис. 9: Успешное получение дескриптора файла для файла SAM
С помощью processhacker доступ к дескриптору файла был подтверждён просмотром дескрипторов запрашивающего процесса:

Рис. 10: Процесс, содержащий дескриптор файла SAM

Рис. 11: Доступ на чтение, предоставленный полученному дескриптору
Дальнейшее исследование поддерживаемых функций показало контроль над тремя ключами реестра, которые могут быть использованы для получения выполнения кода.

Рис. 12: Функции, поддерживающие открытие дескрипторов ключей реестра

Рис. 13: Открытие ключей реестра, указывающих DLL монитора хуков для внедрения в процесс

Рис. 14: Функция OpenKey, демонстрирующая возможность изменения ключа реестра данными, контролируемыми пользователем
Обстоятельства внедрения DLL для перехвата (хукинга) в составе пакета Acronis не были определены, хотя, если мониторинг хуков включён, предполагается, что DLL, указанная ключами реестра x64HookLib и x86HookLib, будет внедрена в назначенный процесс.

Рис. 15: x64HookLibKey, указывающий DLL для хукинга C:\ProgramData\Acronis\NGMP\shared\acr_protect.x64.dll
Процесс открытия контекста сканирования был пропущен в анализе для произвольного чтения файлов.
Вместо создания контекста сканирования процесс может перебирать идентификаторы контекстов сканирования методом грубой силы, многократно отправляя запросы к функции GetScanContextByID, циклически перебирая значения ContextID, пока не будет найден один или несколько действительных контекстов сканирования.