CVE-2026-11070
Overview
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifremoting/host/me2me_desktop_environment.cc |
modified |
Files Changed
remoting/host/me2me_desktop_environment.cc
Patch
From 6d3d9b09fc31ed3d2b77595d7656db14fe6d7c91 Mon Sep 17 00:00:00 2001
From: Joe Downing <joedow@google.com>
Date: Fri, 24 Apr 2026 10:24:39 -0700
Subject: [PATCH] remoting: Always show UI on non-curtained Windows Me2Me sessions
This change forces the in-session UI to be shown on Windows and other
hosts, ignoring the 'enable_user_interface' option. This is a short-term
fix for bug 499225384 until the network process is split and the desktop
environment options will be provided from the high-trust process which
handles policies.
Note: This only affects non-curtained Windows connections since we
exit early around line 186 when curtained.
Bug: 499225384
Change-Id: Ic0e42ba7dc7f20ad16a75d02bafcf016e72c2e20
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7789741
Auto-Submit: Joe Downing <joedow@chromium.org>
Commit-Queue: Jamie Walch <jamiewalch@chromium.org>
Commit-Queue: Joe Downing <joedow@chromium.org>
Reviewed-by: Jamie Walch <jamiewalch@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1620303}
---
diff --git a/remoting/host/me2me_desktop_environment.cc b/remoting/host/me2me_desktop_environment.cc
index e6650c21..218daad 100644
--- a/remoting/host/me2me_desktop_environment.cc
+++ b/remoting/host/me2me_desktop_environment.cc
@@ -207,8 +207,10 @@
// function to be used here and in CurtainMode::ActivateCurtain().
bool want_user_interface = getuid() != 0;
#else
- bool want_user_interface =
- desktop_environment_options().enable_user_interface();
+ // TODO: crbug.com/499225384 - Re-enable this and extract the value from
+ // desktop_environment_options().enable_user_interface() after the network
+ // process has been split into low- and high-trust processes.
+ bool want_user_interface = true;
#endif
if (want_user_interface) {
Original Bug Report
Potential Sandbox Escape: Compromised CRD Network Process can disable Security UI via Mojo
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 security team.
Overview: A compromised low-privilege network process in Chrome Remote Desktop can bypass security-critical UI elements in the high-privilege desktop process. By sending a crafted Mojo message with enable_user_interface = false, an attacker can suppress disconnect notifications and local input monitoring, allowing for a stealthy remote takeover.
Affected files:
remoting/host/me2me_desktop_environment.ccremoting/host/desktop_session_agent.ccremoting/host/mojom/desktop_session.mojom
Estimated timestamp from git blame: 2025-02-06
Vulnerability Overview
The Chrome Remote Desktop (CRD) service utilizes a multi-process architecture to enforce a security boundary. The Network process, which handles untrusted internet traffic and WebRTC, runs with low privileges (e.g., NT AUTHORITY\LocalService on Windows with a Low Integrity Level). It communicates via a Mojo IPC channel with the Desktop process, which runs with high privileges (System Integrity/elevated user) to capture the screen and inject inputs.
A potential vulnerability exists where the high-privilege Desktop process blindly trusts the enable_user_interface flag provided by the low-privilege Network process during session initialization. An attacker who compromises the Network process can manipulate this flag to disable critical local security features, leading to a stealthy remote takeover of the physical console.
Technical Details
When a remote connection is established, the Network process calls the DesktopSessionAgent::Start Mojo interface in the Desktop process. This call includes a remoting::DesktopEnvironmentOptions struct.
In remoting/host/desktop_session_agent.cc, the Start method accepts these options and passes them unvalidated to the environment factory:
// remoting/host/desktop_session_agent.cc
void DesktopSessionAgent::Start(..., const remoting::DesktopEnvironmentOptions& options, ...) {
// ...
delegate_->desktop_environment_factory().Create(..., options, ...);
}
The options are ultimately read by Me2MeDesktopEnvironment::InitializeSecurity:
// remoting/host/me2me_desktop_environment.cc
bool Me2MeDesktopEnvironment::InitializeSecurity(...) {
// ...
bool want_user_interface = desktop_environment_options().enable_user_interface();
if (want_user_interface) {
// Create the local input monitor.
local_input_monitor_ = interaction_strategy().CreateLocalInputMonitor();
// ...
// Create the disconnect window.
disconnect_window_ = HostWindow::CreateAutoHidingDisconnectWindow(...);
}
return true;
}
Because the Desktop process performs no server-side validation against local machine policies to verify if UI suppression is authorized, a compromised Network process can simply set enable_user_interface to false.
Impact
By bypassing the want_user_interface block, the attacker suppresses:
- The Disconnect Window: The local user will not see the “Your desktop is shared” notification.
- The Emergency Hotkey: The
Ctrl+Alt+Escdisconnect hotkey is managed by the disconnect window and is never registered. - Local Input Monitoring: The “local-wins” policy, which blocks remote input for 2 seconds after local keyboard/mouse activity, is disabled. The attacker can fight the user for input control.
This turns a compromise of an untrusted sandbox into a stealthy, persistent takeover of the local user’s desktop session.
Suggested Reproduction Steps
Note: These are suggested steps based on static analysis, as our tooling cannot execute arbitrary code.
- Install CRD Me2Me host on a Windows machine where a user is logged in at the physical console.
- Gain arbitrary code execution in the CRD Network process (running as
NT AUTHORITY\LocalService). - Construct a
remoting::DesktopEnvironmentOptionsobject in memory withenable_user_interface = falseandenable_curtaining = false. - Locate the bound
mojom::DesktopSessionAgentMojo remote (managed byDesktopSessionProxy). - Invoke
DesktopSessionAgent::Startpassing the maliciously crafted options struct. - Observe that the session connects, but no “Sharing” UI is drawn,
Ctrl+Alt+Escdoes not disconnect the session, and local mouse movement does not block remote input.
Suggested Fix
The high-privilege Desktop Process should not trust the low-privilege Network Process to enforce policy-based UI constraints.
The DesktopEnvironmentOptions struct should likely be removed from the DesktopSessionAgent::Start Mojo interface entirely. Instead, the high-privilege Daemon or Desktop process should be responsible for resolving the machine’s enterprise policies (e.g., parsing the registry or policy files directly) and explicitly determining whether the UI should be enabled or curtain mode required. If the options must be passed via Mojo, the Desktop process must independently validate the requested options against the actual machine policy before applying them.
Evaluated with Chrome root at commit: ff3d2b74fa39431785bd60e51463b08fcc71ee33
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.