CVE-2026-11170
Overview
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifremoting/host/linux/linux_process_launcher_delegate.cc |
modified |
Files Changed
remoting/host/linux/linux_process_launcher_delegate.cc
Patch
From 959947c664bf7a6c6c2f35f0688db6e2ff274c25 Mon Sep 17 00:00:00 2001
From: Yuwei Huang <yuweih@chromium.org>
Date: Tue, 14 Apr 2026 11:10:29 -0700
Subject: [PATCH] [remoting] Properly drop privileges in Linux process launcher
See bug for more details.
Bug: 502322596
Change-Id: I50466dbd65d49915834a89b7e098201c626b3e57
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7759054
Commit-Queue: Lambros Lambrou <lambroslambrou@chromium.org>
Auto-Submit: Yuwei Huang <yuweih@chromium.org>
Reviewed-by: Lambros Lambrou <lambroslambrou@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1614608}
---
diff --git a/remoting/host/linux/linux_process_launcher_delegate.cc b/remoting/host/linux/linux_process_launcher_delegate.cc
index 7858f01..2c35bff6f 100644
--- a/remoting/host/linux/linux_process_launcher_delegate.cc
+++ b/remoting/host/linux/linux_process_launcher_delegate.cc
@@ -4,6 +4,7 @@
#include "remoting/host/linux/linux_process_launcher_delegate.h"
+#include <grp.h>
#include <sys/prctl.h>
#include <sys/types.h>
#include <unistd.h>
@@ -61,6 +62,11 @@
RAW_LOG(FATAL, "Failed to create a new session.");
}
}
+ if (uid_ >= 0 || gid_ >= 0) {
+ if (setgroups(0, nullptr) != 0) {
+ RAW_LOG(FATAL, "Failed to clear supplementary groups");
+ }
+ }
if (gid_ >= 0 && setgid(gid_) != 0) {
RAW_LOG(FATAL, "Failed to setgid");
}
Original Bug Report
Potential privilege escalation in Linux CRD via uncleared supplementary groups
Project Fortify, an experimental security project, has identified the following potential security issue. If you’re a feature owner CC-ed on this bug, please do your best to review these reports without the Chrome Security team.
Overview: The Chrome Remote Desktop host daemon on Linux fails to clear supplementary groups when dropping privileges for worker processes. Consequently, the network and desktop worker processes inherit the root group (gid 0). This creates a potential sandbox escape and local privilege escalation vector.
Affected files:
remoting/host/linux/linux_process_launcher_delegate.ccremoting/host/daemon_process_linux.cc
Estimated timestamp from git blame: 2026-02-05
Vulnerability Description
There is a potential privilege escalation vulnerability in the Chrome Remote Desktop (CRD) Linux host due to incomplete privilege dropping.
Initial logic and parameters for launching worker processes (both the Network and Desktop workers) are validated. The CRD daemon securely resolves the target unprivileged UIDs and GIDs (such as the _crd_network user) and delegates execution via base::LaunchProcess.
However, inspecting the final credential transition within RunAsUserPreExecDelegate::RunAsyncSafe() (remoting/host/linux/linux_process_launcher_delegate.cc) reveals a critical omission. While the implementation correctly shifts the primary credentials using setgid() and setuid(), it fails to clear the supplementary group list. Standard POSIX processing is applied: because setuid/setgid do not alter supplementary groups, the child processes unconditionally inherit the root daemon’s supplementary groups.
As a result, these supposedly unprivileged worker processes execute with persistent gid 0 (root) membership.
Potential Exploitation Steps
Note: These are suggested/potential steps, as our tooling agent doesn’t yet have the ability to run code to produce a working proof of concept.
- An attacker achieves arbitrary code execution within the CRD network process (e.g., via a memory safety vulnerability in WebRTC parsing) or the desktop worker process.
- The attacker executes arbitrary system commands from this compromised context.
- Because the process retains
gid 0in its supplementary groups, the attacker bypasses the intended sandbox limitations. - The attacker successfully reads or writes to sensitive local files, directories, or IPC endpoints restricted to
root:rootgroup ownership (e.g., files with0640or0660permissions), achieving local privilege escalation.
Suggested Fix
Modify RunAsUserPreExecDelegate::RunAsyncSafe() in remoting/host/linux/linux_process_launcher_delegate.cc to explicitly clear or initialize the supplementary groups before calling setuid().
Add a call to setgroups(0, NULL) to completely drop all supplementary groups, or use initgroups() if the unprivileged target user requires specific secondary groups.
Evaluated with Chrome root at commit: 096fc8fdbfacf2546485756d03f160a3d04fcc9b
Results so far have been promising, but there can be wrong deductions. If this proves to be a false positive, please close as WAI; data from false positives will be used to improve accuracy over time. And please feel free to reach out to me directly if you have concerns or feedback on the project.