
Writeup и POC для CVE-2020-0753, CVE-2020-0754 и шести исправленных уязвимостей DOS в Windows.
Служба отчетов об ошибках Windows исправила 2 ошибки повышения привилегий в последний Patch Tuesday, эти две ошибки зарегистрированы как CVE-2020-0753 и CVE-2020-0754. Обе ошибки используют состояние гонки в операциях службы с файловой системой. Однако эти две уязвимости не так просто эксплуатировать из-за маленьких окон гонки и неопределенных мест сброса файлов. Здесь мы делимся нашими методами их эксплуатации.
Коренная причина двух ошибок гонки приведена в наших отчетах, фактическую причину можно выразить как Предсказуемость уязвима. Когда служба WER обрабатывает временные файлы, она манипулирует расположением файла C:\ProgramData\Microsoft\Windows\WER\Temp, который является каталогом с доступом на чтение/запись для аутентифицированных пользователей. Это означает, что обычный пользователь со средним уровнем целостности может перезаписывать файл, созданный службой WER, и даже превратить его в ссылку файловой системы, чтобы повредить/удалить другие файлы, к которым они не могли получить доступ.
Чтобы обеспечить безопасность файловых операций, служба WER использует стандартный API под названием GetTempFileNameW и обернутый им wersvc.dll->UtilGetTempFile. Этот API помогает WerSvc генерировать незанятые случайные имена файлов в форме "WER****.tmp", случайная часть имени файла генерируется как 4-байтовое шестнадцатеричное число от 0000 до FFFF. Если одно число уже было занято для создания файла, API выберет другое случайное имя файла.
Эта стратегия явно имеет недостаток: если создать 65535 файлов с именами от WER0000.tmp до WERFFFE.tmp, API выберет случайное число и проверит, существует ли файл с таким именем, например WERA560.tmp. Он обнаружит, что файл уже существует, и продолжит проверку от WERA560.tmp до WERFFFF.tmp. Пока идет проверка, появляется окно подготовки, потому что мы нашли способ заставить WerSvc зависнуть на вызове GetTempFileNameW на 4-5 секунд, что представляет собой большой временной промежуток. Тем временем мы заставляем службу сбросить временный файл с фиксированным именем, а именно WERFFFF.tmp.
После того как служба создает временный файл с именем WERFFFF.tmp, API автоматически закрывает дескриптор файла, который он держал, и возвращает имя файла службе для дальнейших операций с файлом. Это именно то место, где возникает ошибка. Выполняются три условия:
Здесь служба будет записывать содержимое в файл и удалять его. И запись, и удаление приведут к повышению привилегий за счет использования ссылок файловой системы и определенных методов эксплуатации.
Чтобы превратить ошибку в произвольное удаление файлов, мы творчески используем множественные точки соединения каталогов для завершения эксплуатации. Наш эксплойт включает следующие шаги:
WER***.tmp в $pwd\1\ и создаем точку соединения $pwd\2\ -> $pwd\1\;$pwd\2\ и создаем другой процесс для непрерывного выполнения команды SetOplock $pwd\1\WERFFFF.tmp;$pwd\2\ -> \RPC CONTROL\, а затем создаем объект символической ссылки \RPC CONTROL\WERFFFF.tmp -> $target и \RPC CONTROL\WERFFFF.tmp.etl -> $target;Подробное описание эксплуатации и POC предоставлены в WERReport-CVE-2020-0753.
Эксплуатируя недостаток в GetTempFileNameW, мы получаем предсказуемое местоположение, с которым будет работать служба; используя многоуровневые точки соединения файловой системы, мы делаем состояние гонки надежно эксплуатируемым.
Тем временем мы заметили, что такая ошибка гонки также может вызвать возможную проблему перезаписи файлов, что, вероятно, приведет к ошибкам повышения привилегий при определенных обстоятельствах.
Чтобы объяснить, почему произвольное повреждение файлов (если вы можете контролировать очень малую часть содержимого файла: менее 63 байт) может быть превращено в повышение привилегий (EoP), нам нужно обратить внимание на механизм работы Защитника Windows.
У Защитника Windows есть база сигнатур вредоносных программ. Если какой-то файл содержит сигнатуру вредоносного ПО, Защитник считает его вредоносным и удаляет. Однако эта функция приводит к дополнительной поверхности атаки. Например, на WCTF2019 @icchy из tokyowesterns разработал задание Windows ctf под названием "Gyotaku The Flag", которое использует эту функцию как оракул для утечки информации.
Здесь мы используем эту функцию Защитника Windows для удаления произвольного файла, если у нас есть произвольное повреждение файла с частичным контролем его содержимого. Мы можем просто записать сигнатуру вредоносного ПО в файл и инициировать стандартное сканирование Защитником Windows, файл будет помещен в изолированную область Защитника, которая может быть удалена обычным пользователем (т.е. пользователем со средним уровнем целостности без прав администратора) простым запуском операции сканирования дважды.
Таким образом, ошибка произвольного повреждения файлов может быть превращена в произвольное удаление файлов, если в целевой файл с помощью ошибки можно поместить строку сигнатуры вредоносного ПО.
Повредите целевой файл с помощью ошибки, поместите в него строку функции, распознаваемую Защитником Windows.
Запустите сканирование Защитника Windows целевого файла, что приведет к его изоляции.
Запустите сканирование снова, целевой файл будет удален.
Используя эту технику, мы получаем произвольное удаление файлов с помощью Защитника.
Произвольное удаление файлов можно использовать гораздо проще для получения дальнейших привилегий.
Microsoft OneDrive — это пакет приложений, предоставляющий услуги персонального облачного хранения, это приложение было интегрировано в Windows как опция установки по умолчанию, начиная с Windows 8. В ходе нашего исследования было обнаружено и отправлено в MSRC 6 уязвимостей в запланированных задачах обслуживания OneDrive.
Вот таблица уязвимостей, которые мы собираемся раскрыть в соответствующих запланированных задачах Microsoft OneDrive:
| Уязвимая программа | Тип | POC предоставлен |
|---|---|---|
| FileSyncConfig.exe | Жесткая ссылка | да |
| FileSyncHelper.exe | Жесткая ссылка | да |
| OneDriveFileSyncConfig.exe | Символическая ссылка | да |
| OneDriveSetup.exe | Жесткая ссылка | да |
| OneDriveSetup.exe | Жесткая ссылка | да |
| OneDriveStandaloneUpdater.exe | Жесткая ссылка | да |