
Plex メディアサーバーのローカル権限昇格 PoC - CVE-2021-42835
Windows 版 Plex Media Server のバージョン 1.25.0.5282 より前のバージョンは、Time Of Check Time Of Use(TOCTOU)に対して脆弱であり、低特権ユーザーが SYSTEM 権限を取得できる可能性があります。
Tomer Peled、Netanel Cohen、Amir Shen(BugSec のセキュリティ研究者)によって発見されました。
Plex for Windows は新しいアップデートをインストールするために PlexUpdateService.exe を使用します。このサービスは SYSTEM コンテキストで実行されています。アップデートをインストールする際、サービスはまずファイルの整合性とデジタル署名を検証し、チェックが成功した場合にのみアップデートがインストールされます。
このプロセスにおいて、整合性と署名のチェック後、更新ファイルを不適切に処理する設計上の欠陥がありました。ファイルはいったん閉じられ、インストールのために後で再度開かれていました。
この欠陥により、攻撃者はサービスが整合性と署名の検証を終えるとすぐに更新ファイルを悪意のあるファイルに置き換えることができ、SYSTEM コンテキストでのコード実行が可能になります。
この POC は、James Forshaw が開発したツールをわずかに変更して使用しています。オリジナルはこちら - https://github.com/googleprojectzero/symboliclink-testing-tools
上記を実現するために、最初に有効な更新ファイルを含むフォルダを指し、その後悪意のあるファイルを含むフォルダに切り替わる Junction フォルダを使用しました。
ファイルへのアクセス順序は次のとおりであることがわかりました:
junction フォルダにマウントポイントを作成し、有効な更新ファイルを含むフォルダを指すようにしました。cacert.pem にコールバック関数付きの opLock を設定し、アクセスされたらすぐにマウントポイントを悪意のあるフォルダに変更します。
さらに、アップデートをトリガーする RPC クライアントも作成しました。
PlexClient/PlexClient.cpp の ROOTDIR をあなたのパスに置き換えます。
const wchar_t* pszString = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction\\plex.exe"; // Path to the update file.
PlEXcalaison/BaitAndSwitch/BaitAndSwitch.cpp の ROOTDIR をあなたのパスに置き換えます。
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