CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-116679

CVE-2026-116679: Incorrect Authorization in m1k1o/neko Legacy WebRTC Input Handler

Amit Schendel
Amit Schendel
Senior Security Researcher

Oct 28, 2026·8 min read·2 visits

Executive Summary (TL;DR)

A boolean logic flaw in m1k1o/neko versions 3.0.0 through 3.1.4 allows any authenticated room member to bypass control locks and inject keyboard and mouse inputs via the legacy WebRTC data channel when legacy mode and session.implicit_hosting are enabled. Upgrading to v3.1.5 resolves the vulnerability.

CVE-2026-116679 (GHSA-5cp7-fp4j-wwcv) is an incorrect authorization vulnerability (CWE-863) in m1k1o/neko, a self-hosted virtual browser running inside Docker via WebRTC. In versions from 3.0.0 prior to 3.1.5, a boolean logic inversion in the LegacyIsHost() method within server/internal/session/session.go causes the server to unconditionally grant host input privileges over the legacy WebRTC data channel when implicit hosting is enabled. Authenticated non-privileged room members can exploit this flaw to bypass room control locks and profile restrictions, allowing unauthorized injection of mouse and keyboard events into the shared virtual browser session.

Vulnerability Overview

m1k1o/neko is a self-hosted virtual browser and desktop environment that runs inside a Docker container and streams video, audio, and user interaction via WebRTC. In a typical deployment, multiple users connect to a shared room to view a remote X11/Xorg display. Access to interactive desktop controls—specifically the transmission of keyboard keystrokes and mouse movements via XTest and XInput—is governed by a host privilege model.

Neko supports two primary mechanisms for processing client input events: a modern WebSocket and HTTP control API, and a legacy WebRTC data channel maintained for backward compatibility with older client implementations. While the modern control API enforces strict checks against user profile capabilities and room lock states, the legacy WebRTC data channel relies on a dedicated helper function named LegacyIsHost() located in server/internal/session/session.go.

In Neko versions v3.0.0 through v3.1.4, LegacyIsHost() contains an incorrect authorization flaw classified under CWE-863 (Incorrect Authorization). When a server deployment operates with legacy mode active and the configuration option session.implicit_hosting enabled, the authorization check fails to verify whether the requesting session belongs to a permitted host or whether room controls have been locked by an administrator.

As a result of this flaw, any authenticated room member with a valid WebRTC peer connection can transmit input commands directly over the legacy data channel. The server accepts and executes these unauthorized mouse and keyboard events inside the shared virtual desktop environment, bypassing administrative restrictions (LockedControls), profile-level hosting prohibitions (CanHost == false), and private mode constraints.

Root Cause Analysis

The root cause of CVE-2026-116679 is a boolean logic inversion and missing guard clauses within the LegacyIsHost() method on the SessionCtx struct in server/internal/session/session.go. This method was introduced around commit fe94c999c6aff927e0c28c31b4edacf503d18871 to determine whether an active session is authorized to dispatch desktop input over the legacy WebRTC data channel.

In the vulnerable implementation, the developer attempted to combine the evaluation of the global ImplicitHosting setting, the active host check session.manager.isHost(session), and the user profile property session.profile.CanHost into a single compound boolean return statement:

return !(!implicitHosting && !session.manager.isHost(session)) || (implicitHosting && !session.profile.CanHost)

We can evaluate this expression using formal boolean algebra by defining three variables: let $I$ represent implicitHosting, $H$ represent session.manager.isHost(session), and $C$ represent session.profile.CanHost. The vulnerable expression is represented as:

$$\neg (\neg I \land \neg H) \lor (I \land \neg C)$$

Applying De Morgan's Law to the left-hand sub-expression $\neg (\neg I \land \neg H)$ yields $(I \lor H)$. Substituting this back into the full expression produces $(I \lor H) \lor (I \land \neg C)$. By the boolean absorption law, $(I \lor (I \land \neg C))$ simplifies directly to $I$, reducing the entire method's logic to:

$$I \lor H$$

Notice that in addition to the absorption error, the right-hand clause $(I \land \neg C)$ inverted the intended check on CanHost by negating it (!session.profile.CanHost). Whenever ImplicitHosting is enabled ($I = \text{true}$), the expression $(I \lor H)$ short-circuits and unconditionally evaluates to true for every connected session. Furthermore, the function completely omitted checks for session.PrivateModeEnabled() and settings.LockedControls, allowing non-admin and restricted users to bypass all room control barriers.

Code Analysis

The vulnerability was remediated in commit 395ca1a6f62b7b0e270e654d366a2d57b8042efd (Pull Request #675). The patch replaces the flawed single-line boolean expression in server/internal/session/session.go with explicit, sequential guard clauses that mirror the authorization logic enforced by the modern control API.

File: server/internal/session/session.go
@@ -75,8 +75,14 @@ func (session *SessionCtx) IsHost() bool {
 
 // only needed for legacy webrtc handler
 func (session *SessionCtx) LegacyIsHost() bool {
-	implicitHosting := session.manager.Settings().ImplicitHosting
-	return !(!implicitHosting && !session.manager.isHost(session)) || (implicitHosting && !session.profile.CanHost)
+	settings := session.manager.Settings()
+	if !session.profile.CanHost || session.PrivateModeEnabled() {
+		return false
+	}
+	if settings.LockedControls && !session.profile.IsAdmin {
+		return false
+	}
+	return settings.ImplicitHosting || session.manager.isHost(session)
 }
 
 func (session *SessionCtx) SetAsHost() {

In the patched version of LegacyIsHost(), the server retrieves the room settings object and performs three distinct evaluations in order:

func (session *SessionCtx) LegacyIsHost() bool {
	settings := session.manager.Settings()
	// 1. Verify profile permissions and private mode state
	if !session.profile.CanHost || session.PrivateModeEnabled() {
		return false
	}
	// 2. Enforce administrative control locks against non-admin users
	if settings.LockedControls && !session.profile.IsAdmin {
		return false
	}
	// 3. Grant host status if implicit hosting is active or user is explicitly assigned host
	return settings.ImplicitHosting || session.manager.isHost(session)
}

This restructuring ensures that settings.ImplicitHosting is only evaluated after confirming that the user's profile permits hosting (CanHost == true), the session does not have private mode enabled, and room controls are either unlocked or the user holds administrator privileges (IsAdmin == true). The fix is complete for this code path and eliminates the discrepancy between legacy WebRTC data channel authorization and standard session control checks.

Exploitation

Exploiting CVE-2026-116679 requires network access to a vulnerable Neko instance (>= 3.0.0, < 3.1.5) configured with legacy mode enabled and NEKO_SESSION_IMPLICIT_HOSTING set to true. The attacker must also possess valid credentials for any room account, including low-privilege guest or viewer-only profiles where CanHost is explicitly disabled.

To execute the attack, the adversary authenticates to the Neko room and completes the standard WebRTC signaling handshake to establish a peer connection. Rather than requesting host control through the modern WebSocket signaling protocol—which would be rejected by the server if LockedControls is enabled or CanHost is false—the client opens the legacy WebRTC data channel dedicated to input handling.

Once the data channel is open, the attacker serializes and transmits binary or formatted mouse movement, button click, and keyboard keycode packets directly over the peer connection. When the Neko backend receives each packet on the legacy handler, it invokes session.LegacyIsHost(). Because ImplicitHosting is active, the function returns true, and the server forwards the attacker's keystrokes and pointer actions directly to the underlying Xorg display server.

No public proof-of-concept (PoC) scripts or weaponized exploit modules currently exist in ExploitDB, PacketStorm, or public GitHub repositories. However, constructing a client capable of sending input frames over the legacy WebRTC data channel is straightforward using standard WebRTC client APIs in a web browser or custom Go/Python WebRTC scripts.

Impact Assessment

CVE-2026-116679 is assigned a CVSS v3.1 base score of 5.4 (Medium) with the vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L. Exploitation requires low privileges (PR:L, representing a basic room login) and no user interaction (UI:N). The vulnerability does not grant direct access to the underlying container host filesystem or server configuration secrets (C:N), keeping the CVSS scope unchanged (S:U).

Despite the medium severity rating, the practical impact within the context of a shared virtual browser session is substantial. By injecting arbitrary mouse and keyboard events, an unprivileged participant can hijack active browsing sessions being operated by an administrator or legitimate host. The attacker can navigate to arbitrary URLs, interact with web applications authenticated within the shared browser, or manipulate browser developer tools.

If the virtual browser session contains active authenticated sessions to third-party services, internal corporate dashboards, or password managers, unauthorized input injection enables the attacker to perform state-changing actions under the context of the shared browser user (I:L). Additionally, if the container desktop environment allows access to a terminal emulator or file manager via keyboard shortcuts, keyboard injection can be leveraged to execute arbitrary commands as the container's desktop user.

From an availability perspective (A:L), an attacker can continuously disrupt legitimate participants by moving the mouse cursor, closing active browser tabs or windows, or locking up the user interface. As of the latest threat intelligence evaluations, CVE-2026-116679 is not listed in the CISA Known Exploited Vulnerabilities (KEV) catalog and has no recorded active exploitation in the wild.

Remediation

The primary remediation is to upgrade all m1k1o/neko deployments to version v3.1.5 or later, which includes commit 395ca1a6f62b7b0e270e654d366a2d57b8042efd. Containerized deployments using Docker Compose should update their image tags accordingly and recreate the running containers:

services:
  neko:
    image: ghcr.io/m1k1o/neko/firefox:v3.1.5
    restart: unless-stopped

> [!NOTE] > Ensure that any custom container images built on top of m1k1o/neko base images are rebuilt against the v3.1.5 release tag to incorporate the compiled Go binary fix.

For environments where an immediate version upgrade is not feasible, administrators can neutralize the vulnerability by applying configuration workarounds. Setting session.implicit_hosting to false prevents the boolean short-circuit in LegacyIsHost(). When ImplicitHosting ($I$) is false, the vulnerable expression $\neg(\neg I \land \neg H) \lor (I \land \neg C)$ simplifies to $H$ (session.manager.isHost(session)), restoring standard host verification:

services:
  neko:
    environment:
      NEKO_SESSION_IMPLICIT_HOSTING: "false"

Additionally, administrators should disable legacy mode and legacy WebRTC data channel handlers if support for older Neko client versions is not required. Organizations should also audit room access controls to ensure that untrusted users are not granted guest credentials to rooms running sensitive browser sessions.

Official Patches

m1k1o/nekoOfficial GitHub Security Advisory GHSA-5cp7-fp4j-wwcv
m1k1o/nekoOfficial fix commit in m1k1o/neko repository
m1k1o/nekoPull Request #675 fixing LegacyIsHost boolean logic
m1k1o/nekoNeko v3.1.5 patched release

Fix Analysis (1)

Technical Appendix

CVSS Score
5.4/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L

Affected Systems

m1k1o/neko (Self-hosted virtual browser in Docker)

Affected Versions Detail

Product
Affected Versions
Fixed Version
m1k1o/neko
m1k1o
>= 3.0.0, < 3.1.53.1.5
AttributeDetail
CVE IDCVE-2026-116679 (GHSA-5cp7-fp4j-wwcv)
Weakness ClassCWE-863: Incorrect Authorization
Affected ComponentLegacyIsHost() in server/internal/session/session.go
Attack VectorNetwork via Legacy WebRTC Data Channel (AV:N/PR:L)
CVSS v3.1 Score5.4 Medium (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L)
ImpactUnauthorized remote mouse and keyboard input injection into shared virtual browser
Exploit StatusNo public PoCs or active exploitation reported
Patched Versionm1k1o/neko v3.1.5

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
T1204.002User Execution: Malicious File
Execution
CWE-863
Incorrect Authorization

The software performs an authorization check when an actor attempts to access a resource or perform an action, but does not correctly evaluate whether the actor is authorized to perform the action.

Vulnerability Timeline

Fix commit 395ca1a6f62b7b0e270e654d366a2d57b8042efd authored by Miroslav Šedivý merged via PR #675
2026-08-05
GitHub Security Advisory GHSA-5cp7-fp4j-wwcv and CVE-2026-116679 published
2026-10-27
NVD record published with CVSS v3.1 base score 5.4 (Medium)
2026-10-27
CVE and OSV record metadata updated across public vulnerability databases
2026-10-28

References & Sources

  • [1]GitHub Security Advisory GHSA-5cp7-fp4j-wwcv
  • [2]Fix Commit 395ca1a6f62b7b0e270e654d366a2d57b8042efd (m1k1o/neko)
  • [3]Pull Request #675: fix: correct LegacyIsHost boolean logic
  • [4]m1k1o/neko Release v3.1.5
  • [5]Official CVE Record: CVE-2026-116679
  • [6]National Vulnerability Database (NVD) - CVE-2026-116679
  • [7]CVEListV5 JSON Record for CVE-2026-116679

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•36 minutes ago•CVE-2026-87018
7.5

CVE-2026-87018: Denial of Service via TLS 1.2 Renegotiation in Node.js Undici

CVE-2026-87018 (GHSA-qrxm-fqhp-jwvm) is a high-severity Denial of Service (DoS) vulnerability in undici, the default HTTP/1.1 and HTTP/2 client for Node.js that backs the global fetch() implementation. The flaw stems from reachable assertions in undici's socket and session error handlers, which assume that TLS hostname verification errors (ERR_TLS_CERT_ALTNAME_INVALID) cannot occur after the initial connection establishment. By initiating a post-handshake TLS 1.2 renegotiation and presenting a certificate with a mismatched Subject Alternative Name (SAN), a remote HTTPS server can trigger this assertion and terminate the entire Node.js runtime process via an uncaught AssertionError.

Amit Schendel
Amit Schendel
1 views•11 min read
•about 2 hours ago•CVE-2026-116682
8.6

CVE-2026-116682: Arbitrary File Read via Improper Symlink Resolution in FileBrowser Quantum

FileBrowser Quantum prior to versions 1.5.2-stable and 2.0.1-beta contains an improper link resolution vulnerability (CWE-59) in its file indexing and retrieval subsystems. When processing file read, download, preview, media streaming, OnlyOffice integration, or public share requests, the application resolves symbolic links via Go's filepath.EvalSymlinks without verifying that the canonical target path remains within the configured source root and the user's assigned access scope. Consequently, authenticated users with read access or unauthenticated holders of public share links can read arbitrary server-accessible files outside their designated directory boundaries.

Amit Schendel
Amit Schendel
2 views•10 min read
•about 3 hours ago•CVE-2026-116676
8.8

CVE-2026-116676: OS Command Injection via Terraform Workspace Parameter in Atlantis

CVE-2026-116676 (GHSA-rjh2-4xgw-p2hj) is an OS command injection vulnerability (CWE-78) in Atlantis, an open-source Go application that automates Terraform pull request workflows via webhooks. From version 0.4.0 prior to version 0.47.1, Atlantis constructed Terraform and Conftest commands by joining argument slices into a single space-separated string and passing them to a shell interpreter (`sh -c`). Because user-controlled workspace names from `atlantis.yaml`, pull request comments, HCL configurations, and API requests were insufficiently validated against shell metacharacters, an authenticated contributor eligible to trigger a Terraform plan can execute arbitrary commands under the Atlantis service account.

Amit Schendel
Amit Schendel
3 views•11 min read
•about 5 hours ago•CVE-2026-116688
8.1

CVE-2026-116688: DOM-based Cross-Site Scripting via Prototype Pollution in CKEditor 5 Engine

CVE-2026-116688 (GHSA-rh54-vffm-5fvp) is a high-severity Cross-Site Scripting (XSS) vulnerability in the CKEditor 5 engine package (`@ckeditor/ckeditor5-engine` and the umbrella `ckeditor5` package). The flaw originates from an upstream prototype pollution vulnerability in the `es-toolkit` dependency (versions prior to 1.52.0) used to parse and process inline HTML `style` attributes. When processing crafted CSS style declarations, the engine permits modification of `Object.prototype`, which alters downstream DOM conversion and sanitization checks to achieve arbitrary JavaScript execution in the browser context.

Amit Schendel
Amit Schendel
3 views•10 min read
•about 6 hours ago•CVE-2026-116687
3.1

CVE-2026-116687: Cross-Site Scripting in CKEditor 5 Engine via Data URI and Control Character Bypass

CVE-2026-116687 is a Cross-Site Scripting (XSS) vulnerability in the @ckeditor/ckeditor5-engine package of CKEditor 5. When the General HTML Support (GHS) plugin is configured to permit embedded container elements such as <object>, <embed>, or <iframe>, insufficient validation of data: URIs and incomplete stripping of ASCII C0 control characters allow attackers to execute arbitrary JavaScript within an isolated null-origin browser context.

Alon Barad
Alon Barad
5 views•9 min read
•about 7 hours ago•CVE-2026-116686
6.5

CVE-2026-116686: Server-Side Request Forgery and Synchronous Denial of Service in Model Context Protocol Python SDK

CVE-2026-116686 is a Server-Side Request Forgery (SSRF) and Denial of Service (DoS) vulnerability in the official Model Context Protocol (MCP) Python SDK (mcp package on PyPI). When an MCP client validates structured tool execution results against a server-provided outputSchema, the SDK invokes the Python jsonschema library with its default URI resolution configuration. An untrusted or compromised MCP server can supply an outputSchema containing external $ref directives (using http://, https://, or file:// schemes), forcing the client process to synchronously fetch internal network resources, read local files, or block the main event loop indefinitely.

Amit Schendel
Amit Schendel
7 views•10 min read