ParaShells — Parallels Desktop for Mac local privilege escalation: a quote in an appliance folder name becomes tar --use-compress-program running as root (CVE-2026-90894, CVSS 7.8, JFrog, Sep 14, 2026)
Summary
JFrog Security Research (Yuval Moravchick, published September 14, 2026, blog "ParaShells: Parallels Desktop Turns Appliance Install Into a Root Shell") documents CVE-2026-90894 (CVSS 7.8, high) in Parallels Desktop for Mac < 27.0.0: any local, unprivileged, unsigned process can obtain a root shell through the appliance-install path. Parallels runs prl_disp_service as root and exposes it on the world-writable socket /var/run/prl_disp_service.socket; PrlSrv_LoginLocal accepts peer credentials with no Parallels signature requirement and no admin-group requirement. After that unprivileged login, PrlSrv_InstallAppliance lets the caller choose the appliance destination folder (sVmParentPath), and the daemon unpacks with a single command string — tar -xf "%1" -C "%2" — chopped into words by Qt QProcess::splitCommand. A double-quote embedded in the folder name closes the quoting early, and the leftover text becomes extra tar flags; macOS tar then honors --use-compress-program=, executing the named program as root. Demonstrated root on 26.4.0 (57513). In 27.0.0 the daemon starts tar as a fixed argv list, so the same quote stays literal — but hosts that stay on the 26.x line (including 26.4.2) never got that change.
Tags
- tools
- Parallels Desktop
- CVE-2026-90894
- ParaShells
- local privilege escalation
- argument injection
- tar
- --use-compress-program
- QProcess::splitCommand
- command string concatenation
- world-writable socket
- prl_disp_service
- macOS
- virtualization
- JFrog Security Research
- root shell
Vulnerability mechanics
- Reachability:
/var/run/prl_disp_service.socketissrwxrwxrwx(world-writable).PrlSrv_LoginLocalaccepts any local peer's credentials — an unsigned, non-admin process logs in successfully (PrlUsrCfg_IsLocalAdministratorstays 0, and that is not checked). - Injection:
PrlSrv_InstallAppliancetakessVmParentPath(the appliance folder) from the caller. The root daemon builds one string,tar -xf "<archive>" -C "<folder>", and passes it throughQProcess::splitCommand, which splits on whitespace after quote handling. A folder name like/tmp/sprl_p_<uid>" --use-compress-program=/tmp/u<uid> "terminates the quoted segment and injects the flag; the archive'sPackageURL/PackageMd5just need to be a matchingfile://tar. - Execution: macOS
tarruns the--use-compress-programtarget as root (uid 0) during extract.InstallAppliancemay still return error-41508afterward — the proof is the root marker, not the job status. - Fix shape: 27.0.0 invokes
tarwith a fixed argv array, so the quote survives as part of a literal directory name (created on disk, never parsed as flags). 26.x line is unfixed — there is no patch for staying on 26.x.
Defender heuristics
- Move hosts to 27.0.0+; the 26.x branch (through at least 26.4.2) has no extract-path fix. Parallels KB 131168 tracks the release notes.
- Until upgraded, restrict local access: any local account — including low-value service/shared accounts — can reach the dispatcher socket on a vulnerable install. This collapses the "local foothold is low severity" assumption on Macs running Parallels.
- Hunt artifacts: directories under
/tmpmatchingsprl_p_*containing an embedded quote;tarprocesses spawned byprl_disp_servicewith--use-compress-programin argv; unexpected uid-0 children of the extract during an appliance install;InstallAppliancereturning-41508alongside a root-executed marker. - Pattern-level: the durable lesson is "never build a command as one string and split it yourself" — quoting bugs in concatenated command strings turn a path parameter into flags, and
--use-compress-program-style options (alsotar --checkpoint-action,git -c,ssh -o) turn flags into code execution. Audit any root daemon that shells out with caller-influenced paths.
Related pages
- Bifrost CVE-2026-90898 unauthenticated MCP stdio RCE — the same JFrog researcher, same disclosure week, opposite side of the exec boundary
- isolated-vm ExternalCopy type-confusion sandbox escape — adjacent macOS/desktop trust-boundary research
Sources
- JFrog Security Research advisory: Parallels Desktop is vulnerable to a Local Privilege Escalation via Appliance Extract Argument Injection (CVE-2026-90894)
- JFrog Security Research blog: ParaShells: Parallels Desktop Turns Appliance Install Into a Root Shell (Sep 15, 2026)
- Parallels knowledge base: KB 131168 — Parallels Desktop 27 updates summary
- CVE record: CVE-2026-90894