
Preuve de concept d'escalade de privilèges locale pour Plex Media Server - CVE-2021-42835
Plex Media Server pour Windows antérieur à la version 1.25.0.5282 est vulnérable à une faille de type Time Of Check Time Of Use (TOCTOU) qui permet aux utilisateurs à faibles privilèges d'obtenir les privilèges SYSTEM.
Tomer Peled, Netanel Cohen et Amir Shen, chercheurs en sécurité chez BugSec.
Plex pour Windows utilise PlexUpdateService.exe pour installer les nouvelles mises à jour. Le service s'exécute dans le contexte SYSTEM. Lors de l'installation d'une mise à jour, le service vérifie d'abord l'intégrité du fichier et la signature numérique ; ce n'est que si les vérifications réussissent que la mise à jour est installée.
Dans ce processus, après la vérification de l'intégrité et de la signature, il y avait un défaut de conception qui gérait le fichier de mise à jour de manière inappropriée. Le fichier était fermé puis rouvert plus tard pour l'installation.
Cette faille permet à un attaquant de remplacer le fichier de mise à jour par un fichier malveillant dès que le service a fini de vérifier l'intégrité et la signature, ce qui entraîne l'exécution de code dans le contexte SYSTEM.
Cette POC utilise des outils développés par James Forshaw avec de légères modifications. L'original peut être trouvé ici - https://github.com/googleprojectzero/symboliclink-testing-tools
Pour y parvenir, nous avons utilisé un dossier Junction qui pointera d'abord vers un dossier contenant un fichier de mise à jour valide, puis basculera vers un dossier contenant le fichier malveillant.
Nous avons constaté que l'ordre d'accès aux fichiers était le suivant :
Nous avons créé un point de montage sur le dossier junction pour pointer vers un dossier contenant le fichier de mise à jour valide. Nous avons défini un opLock sur cacert.pem avec une fonction de rappel ; dès qu'il est accédé, nous changeons le point de montage vers le dossier malveillant.
De plus, nous avons créé un client RPC qui déclenchera la mise à jour.
PlexClient/PlexClient.cpp remplacez ROOTDIR par votre chemin.
const wchar_t* pszString = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction\\plex.exe"; // Path to the update file.
PlEXcalaison/BaitAndSwitch/BaitAndSwitch.cpp remplacez ROOTDIR par votre chemin.
static LPCWSTR junction = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction"; // Path to junction folder , MAKE SURE IT IS EMPTY !
static LPCWSTR target1 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\valid"; // Path to folder contains the valid update file.
static LPCWSTR target2 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\malicious"; // Path to folder contains the malicious file - MUST BE THE SAME NAME AS THE UPDATE FILE.
static LPCWSTR cacert = L"C:\\Program Files (x86)\\Plex\\Plex Media Server\\Resources\\cacert.pem"; // Path to cacert.pem - can be found in plex directory.
https://ir-on.io/2021/12/02/local-privilege-plexcalation/
https://forums.plex.tv/t/security-regarding-cve-2021-42835/761510