Windows 版 Plex Media Server 1.25.0.5282 之前版本存在检查时间与使用时间漏洞(TOCTOU),允许低权限用户获取 SYSTEM 权限。
Tomer Peled、Netanel Cohen 以及 BugSec 安全研究员 Amir Shen。
Windows 版 Plex 使用 PlexUpdateService.exe 来安装新更新。该服务在 SYSTEM 上下文中运行。安装更新时,服务首先验证文件完整性和数字签名,只有检查通过后才安装更新。
在此过程中,在完整性检查和签名检查之后,存在一个设计缺陷:对更新文件的处理不当。文件被关闭后,稍后才重新打开进行安装。
这个漏洞允许攻击者在服务完成完整性和签名验证后,立即将更新文件替换为恶意文件,从而在 SYSTEM 上下文中执行代码。
此 POC 使用了 James Forshaw 开发的工具,并做了轻微修改。原始工具可在此处找到 - https://github.com/googleprojectzero/symboliclink-testing-tools
为了实现上述操作,我们使用了一个交接文件夹,该文件夹首先指向包含有效更新文件的文件夹,然后切换到包含恶意文件的文件夹。
我们发现文件访问顺序如下:
我们在交接文件夹上创建了一个挂载点,指向包含有效更新文件的文件夹。 在 cacert.pem 上设置 opLock 并附带回调函数,一旦该文件被访问,我们就将挂载点更改为恶意文件夹。
此外,我们还创建了一个 RPC 客户端来触发更新。
Delete me.txt 文件——它只是占位符,用于让 git 包含该文件夹,此文件夹必须为空!在 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