
Локальное повышение привилегий на медиасервере Plex - PoC CVE-2021-42835
Plex Media Server для Windows версий до 1.25.0.5282 уязвим к ошибке «Время проверки — время использования» (TOCTOU), что позволяет пользователям с низкими привилегиями получить права SYSTEM.
Tomer Peled, Netanel Cohen и Amir Shen — исследователи безопасности из BugSec.
Plex для Windows использует службу PlexUpdateService.exe для установки новых обновлений. Служба работает в контексте SYSTEM. При установке обновления служба сначала проверяет целостность файла и цифровую подпись; только если проверки успешны, обновление будет установлено.
В этом процессе после проверки целостности и подписи была допущена ошибка проектирования: файл обновления обрабатывался некорректно. Файл закрывался, а затем снова открывался для установки.
Эта уязвимость позволяет злоумышленнику подменить файл обновления на вредоносный сразу после того, как служба закончит проверку целостности и подписи, что приводит к выполнению кода в контексте SYSTEM.
Данный PoC использует инструменты, разработанные James Forshaw, с небольшими изменениями. Оригинал можно найти здесь — https://github.com/googleprojectzero/symboliclink-testing-tools
Для достижения описанного выше мы использовали папку-переходник (Junction), которая сначала указывала на папку с легитимным файлом обновления, а затем переключалась на папку с вредоносным файлом.
Мы обнаружили, что порядок доступа к файлам был следующим:
Мы создали точку подключения на папке-переходнике, указывающую на папку с легитимным файлом обновления. Установили opLock на cacert.pem с функцией обратного вызова. Как только происходит обращение к cacert.pem, мы меняем точку подключения на вредоносную папку.
Кроме того, мы создали RPC-клиент, который запускает обновление.
В PlexClient/PlexClient.cpp замените ROOTDIR на ваш путь.
const wchar_t* pszString = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction\\plex.exe"; // Путь к файлу обновления.
В PlEXcalaison/BaitAndSwitch/BaitAndSwitch.cpp замените ROOTDIR на ваш путь.
static LPCWSTR junction = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction"; // Путь к папке-переходнику, УБЕДИТЕСЬ, ЧТО ОНА ПУСТА!
static LPCWSTR target1 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\valid"; // Путь к папке, содержащей легитимный файл обновления.
static LPCWSTR target2 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\malicious"; // Путь к папке, содержащей вредоносный файл — ИМЯ ДОЛЖНО СОВПАДАТЬ С ИМЕНЕМ ФАЙЛА ОБНОВЛЕНИЯ.
static LPCWSTR cacert = L"C:\\Program Files (x86)\\Plex\\Plex Media Server\\Resources\\cacert.pem"; // Путь к cacert.pem — находится в директории Plex.
https://ir-on.io/2021/12/02/local-privilege-plexcalation/
https://forums.plex.tv/t/security-regarding-cve-2021-42835/761510