Back to Intelligence

CVE-2026-92209: NoMachine Redis Improper Authentication Local Privilege Escalation — Detection and Remediation Guide

SA
Security Arsenal Team
September 16, 2026
11 min read

The Zero Day Initiative has published ZDI-26-711, disclosing an improper authentication vulnerability in NoMachine — the widely deployed remote desktop and application delivery platform — tracked as CVE-2026-92209 with a CVSS score of 7.8 (High). The flaw resides in the Redis instance bundled with NoMachine, which fails to properly authenticate local clients. A low-privileged attacker who already has code execution on the host can abuse this unauthenticated Redis endpoint to escalate privileges — potentially to SYSTEM or root, depending on platform and service configuration.

This is a classic post-compromise force multiplier. On its own, CVE-2026-92209 requires local access, which dampens its standalone severity. In practice, however, local privilege escalation (LPE) bugs in remote access infrastructure are exactly what ransomware operators and APT intrusion chains reach for in the second stage of an attack: phish a user, land as a low-privileged account, then escalate. NoMachine is frequently deployed in engineering workstations, HPC environments, healthcare imaging systems, and OT-adjacent jump hosts — environments where privilege boundaries matter enormously. If NoMachine is present anywhere in your estate, treat this as a priority patch item.


Technical Analysis

Affected Component

  • Product: NoMachine (NoMachine remote desktop server/workstation installations)
  • Vulnerable component: Bundled Redis server instance used internally by NoMachine services
  • Vulnerability class: CWE-306 — Missing Authentication for Critical Function
  • CVE: CVE-2026-92209
  • Advisory: ZDI-26-711 — http://www.zerodayinitiative.com/advisories/ZDI-26-711/
  • CVSS: 7.8 (High) — consistent with the standard local LPE vector: AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

How the Vulnerability Works

NoMachine ships and runs an embedded Redis instance to support internal service coordination. Per the ZDI disclosure, this Redis instance does not enforce authentication for local connections. Redis, by design, is a powerful in-memory data store — and a dangerously capable one when exposed. The typical abuse primitives available against an unauthenticated Redis instance include:

  1. Direct data manipulation — reading or overwriting keys that the privileged NoMachine service consumes, allowing an attacker to influence service behavior, inject configuration, or poison session state that the privileged process trusts.
  2. Configuration abuse — Redis commands such as CONFIG SET can alter runtime parameters. In historical Redis exploitation, attackers have abused writable config to redirect persistence files (e.g., writing SSH keys or cron entries via CONFIG SET dir + SAVE).
  3. Module loading — where MODULE LOAD is permitted and the server runs with elevated privileges, an attacker can load a malicious Redis module (a shared object) into the privileged server process, achieving direct code execution in the service's security context.

Because the NoMachine-adjacent Redis service runs under a privileged service account while listening for local connections, any low-privileged local user who can reach the Redis socket/port inherits that privilege context. The exploitation requirement — pre-existing local code execution — means this vulnerability slots into the escalation phase of an intrusion chain, not initial access.

Exploitation Status

At the time of writing, this is a ZDI-coordinated disclosure with no confirmed reports of in-the-wild exploitation and no CISA KEV listing. However, ZDI advisories frequently follow failed or expired vendor patch timelines, and public technical detail around unauthenticated Redis abuse is mature and well-documented. Expect proof-of-concept tooling to emerge quickly — the Redis attack surface is one of the most thoroughly mapped in offensive security. Defenders should not wait for KEV inclusion to act.


Detection & Response

Detection for this class of vulnerability centers on three observable behaviors: (1) unexpected processes interacting with the local Redis listener, (2) the privileged Redis/NoMachine service process spawning child processes or writing unexpected files (evidence of successful escalation), and (3) low-privileged users invoking Redis client tooling.

YAML
---
title: Unauthenticated Redis Interaction by Non-NoMachine Process
description: Detects processes other than legitimate NoMachine/Redis components establishing local connections to the Redis default port or executing redis-cli, indicative of abuse of the unauthenticated bundled Redis instance in CVE-2026-92209.
references:
  - http://www.zerodayinitiative.com/advisories/ZDI-26-711/
  - https://attack.mitre.org/techniques/T1068/
author: Security Arsenal
date: 2026/04/06
id: 3f8a1b92-7c4d-4e61-9a2b-5d6e7f8a9b0c
status: experimental
logsource:
  category: network_connection
  product: windows
detection:
  selection_port:
    DestinationPort:
      - 6379
      - 6380
  filter_legitimate:
    Image|endswith:
      - '\redis-server.exe'
      - '\nxserver.bin'
      - '\nxnode.bin'
  condition: selection_port and not filter_legitimate
falsepositives:
  - Developers running local Redis clients on workstations where Redis is intentionally deployed
level: high
---
title: Privileged Redis or NoMachine Service Spawning Suspicious Child Process
description: Detects redis-server or NoMachine service binaries spawning shells, script interpreters, or system utilities — a strong indicator of successful privilege escalation via Redis module load or config abuse (CVE-2026-92209).
references:
  - http://www.zerodayinitiative.com/advisories/ZDI-26-711/
  - https://attack.mitre.org/techniques/T1068/
  - https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/04/06
id: 8c2d4e6f-1a3b-4c5d-8e7f-9a0b1c2d3e4f
status: experimental
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|endswith:
      - '\redis-server.exe'
      - '\nxserver.bin'
      - '\nxservice.bin'
      - '\nxnode.bin'
  selection_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\rundll32.exe'
      - '\regsvr32.exe'
      - '\mshta.exe'
      - '\net.exe'
      - '\net1.exe'
  condition: selection_parent and selection_child
falsepositives:
  - Rare; NoMachine service processes should not routinely spawn shells or admin utilities
level: critical
---
title: Redis Client Execution by Non-Administrative Context
description: Detects execution of redis-cli or ad-hoc Redis interaction tooling on systems running NoMachine, potentially indicating an attacker probing the unauthenticated bundled Redis instance.
references:
  - http://www.zerodayinitiative.com/advisories/ZDI-26-711/
  - https://attack.mitre.org/techniques/T1068/
author: Security Arsenal
date: 2026/04/06
id: 5e7f9a1b-2c4d-4e6f-8a9b-0c1d2e3f4a5b
status: experimental
logsource:
  category: process_creation
  product: windows
detection:
  selection_img:
    Image|endswith:
      - '\redis-cli.exe'
  selection_cli:
    CommandLine|contains:
      - 'MODULE LOAD'
      - 'CONFIG SET'
      - 'CONFIG GET dir'
      - 'SLAVEOF'
      - 'REPLICAOF'
      - 'DEBUG SLEEP'
  condition: selection_img or selection_cli
falsepositives:
  - Legitimate Redis administration on hosts where Redis is a sanctioned workload
level: medium

The following Sentinel/Defender query hunts for the two highest-signal behaviors: unexpected processes connecting to Redis ports and NoMachine/Redis service processes spawning children. It assumes Sysmon/Defender process and network telemetry is ingested.

KQL — Microsoft Sentinel / Defender
// Hunt: NoMachine Redis LPE (CVE-2026-92209) — suspicious Redis interaction & service child processes
let Lookback = 7d;
let RedisPorts = dynamic([6379, 6380]);
let NoMachineProcs = dynamic(["redis-server.exe", "nxserver.bin", "nxservice.bin", "nxnode.bin", "redis-server"]);
let SuspiciousChildren = dynamic(["cmd.exe", "powershell.exe", "pwsh.exe", "wscript.exe", "cscript.exe", "rundll32.exe", "mshta.exe", "net.exe", "sh", "bash", "nc", "ncat"]);
// Part 1: Non-NoMachine processes connecting to local Redis listener
DeviceNetworkEvents
| where TimeGenerated > ago(Lookback)
| where RemotePort in (RedisPorts)
| where RemoteIP in ("127.0.0.1", "::1") or RemoteIP startswith "127."
| where InitiatingProcessFileName !in~ (NoMachineProcs)
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessAccountName, RemoteIP, RemotePort
| extend HuntSignal = "UnexpectedLocalRedisConnection"
| union (
    // Part 2: Privileged NoMachine/Redis service spawning suspicious child processes
    DeviceProcessEvents
    | where TimeGenerated > ago(Lookback)
    | where InitiatingProcessFileName in~ (NoMachineProcs)
    | where FileName in~ (SuspiciousChildren)
    | project TimeGenerated, DeviceName, FileName, ProcessCommandLine, AccountName, InitiatingProcessFileName, InitiatingProcessCommandLine
    | extend HuntSignal = "NoMachineServiceSpawnedShell"
)
| sort by TimeGenerated desc

For endpoint forensics and proactive hunting across your fleet, this Velociraptor artifact enumerates live Redis listeners and any non-standard processes holding connections to them:

VQL — Velociraptor
-- CVE-2026-92209 Hunt: Identify processes with connections to local Redis listeners
-- Flags any non-NoMachine/Redis process connected to common Redis ports
LET redis_ports <= (6379, 6380)
LET suspicious_conns <= SELECT Pid, Name, Path, Status, Family, Type,
       Laddr.IP AS LocalIP, Laddr.Port AS LocalPort,
       Raddr.IP AS RemoteIP, Raddr.Port AS RemotePort
FROM netstat()
WHERE (RemotePort in redis_ports OR LocalPort in redis_ports)
  AND NOT Path =~ '(?i)(redis-server|nxserver|nxservice|nxnode)'
SELECT LocalIP, LocalPort, RemoteIP, RemotePort, Pid, Name, Path, Status,
       timestamp(epoch=now()) AS CollectionTime
FROM suspicious_conns

Remediation / Verification Script

Until the vendor patch is applied everywhere, use the following to inventory NoMachine installations, identify exposed local Redis listeners, and verify whether the bundled Redis enforces authentication. Run as administrator/root on endpoints and servers.

Bash / Shell
#!/bin/bash
# CVE-2026-92209 verification: NoMachine bundled Redis exposure check
# Run with elevated privileges on Linux/macOS hosts.

echo "=== [1] NoMachine installation check ==="
if command -v nxserver >/dev/null 2>&1; then
  /etc/NX/nxserver --version 2>/dev/null || nxserver --version 2>/dev/null
elif [ -d /usr/NX ] || [ -d /etc/NX ]; then
  echo "NoMachine directories present: /usr/NX or /etc/NX"
else
  echo "NoMachine not detected on this host."; fi

echo ""
echo "=== [2] Listening Redis sockets (6379/6380 and unix sockets) ==="
ss -lntup 2>/dev/null | grep -Ei ':(6379|6380)\b' || echo "No TCP Redis listener found."
ls -la /tmp/*.sock /var/run/*.sock /usr/NX/var/*.sock 2>/dev/null | grep -i redis || echo "No obvious Redis unix socket found."

echo ""
echo "=== [3] Authentication probe on local Redis (expect NOAUTH or error if secured) ==="
for port in 6379 6380; do
  if ss -lnt 2>/dev/null | grep -q ":$port "; then
    RESP=$(printf 'PING\r\n' | timeout 2 nc 127.0.0.1 $port 2>/dev/null | head -1)
    echo "Port $port response: ${RESP:-<none>}"
    if echo "$RESP" | grep -q '+PONG'; then
      echo "!!! WARNING: Redis on port $port responds to PING without authentication — VULNERABLE configuration"
    elif echo "$RESP" | grep -qi 'NOAUTH\|DENIED'; then
      echo "OK: Redis on port $port requires authentication."
    fi
  fi
done

echo ""
echo "=== [4] Redis process privilege context ==="
ps -eo user,pid,comm,args 2>/dev/null | grep -i '[r]edis' || echo "No redis-server process running."

echo ""
echo "=== [5] Check for loaded Redis modules (potential post-exploitation artifact) ==="
for port in 6379 6380; do
  printf 'MODULE LIST\r\n' | timeout 2 nc 127.0.0.1 $port 2>/dev/null | grep -vi '\*0\|NOAUTH' && echo "^ Modules returned on port $port — investigate" || true
done

For Windows hosts running NoMachine:

PowerShell
# CVE-2026-92209 verification: NoMachine + bundled Redis exposure on Windows
# Run in an elevated PowerShell session.

Write-Host "=== [1] NoMachine installation check ===" -ForegroundColor Cyan
$nxPaths = @("$env:ProgramFiles\NoMachine", "${env:ProgramFiles(x86)}\NoMachine", "$env:ProgramFiles\NX")
$nxFound = $nxPaths | Where-Object { Test-Path $_ }
if ($nxFound) { $nxFound | ForEach-Object { Write-Host "Found: $_" } } else { Write-Host "NoMachine not detected." }

Write-Host "`n=== [2] Local Redis listeners (6379/6380) and owning processes ===" -ForegroundColor Cyan
$listeners = Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue | Where-Object { $_.LocalPort -in 6379,6380 }
if ($listeners) {
  foreach ($l in $listeners) {
    $proc = Get-Process -Id $l.OwningProcess -ErrorAction SilentlyContinue
    Write-Host ("Port {0} <- PID {1} ({2}) [{3}]" -f $l.LocalPort, $l.OwningProcess, $proc.ProcessName, $proc.Path)
  }
} else { Write-Host "No Redis TCP listener found." }

Write-Host "`n=== [3] Unauthenticated PING probe ===" -ForegroundColor Cyan
foreach ($port in 6379,6380) {
  try {
    $tcp = New-Object System.Net.Sockets.TcpClient
    $tcp.Connect("127.0.0.1", $port)
    $stream = $tcp.GetStream()
    $buf = [System.Text.Encoding]::ASCII.GetBytes("PING`r`n")
    $stream.Write($buf, 0, $buf.Length)
    Start-Sleep -Milliseconds 300
    $resp = New-Object byte[] 256
    $len = $stream.Read($resp, 0, 256)
    $text = [System.Text.Encoding]::ASCII.GetString($resp, 0, $len)
    if ($text -match '\+PONG') { Write-Host "!!! Port $port: +PONG without auth — VULNERABLE configuration" -ForegroundColor Red }
    elseif ($text -match 'NOAUTH|DENIED') { Write-Host "Port $port : authentication required — OK" -ForegroundColor Green }
    $tcp.Close()
  } catch { Write-Host "Port $port : not reachable." }
}

Write-Host "`n=== [4] Redis service account context ===" -ForegroundColor Cyan
Get-CimInstance Win32_Process -Filter "Name like '%redis%'" -ErrorAction SilentlyContinue |
  ForEach-Object { $owner = Invoke-CimMethod -InputObject $_ -MethodName GetOwner
    Write-Host ("PID {0}: {1} running as {2}\{3}" -f $_.ProcessId, $_.Name, $owner.Domain, $owner.User) }

Remediation

  1. Patch immediately when the vendor update lands. ZDI-26-711 is a coordinated disclosure — monitor the official NoMachine advisories page (https://www.nomachine.com/security-updates and https://www.nomachine.com/download) and the ZDI advisory at http://www.zerodayinitiative.com/advisories/ZDI-26-711/ for the fixed version. Apply the update across all NoMachine server, workstation, and enterprise desktop installations as an emergency or expedited change given the 7.8 CVSS and trivially weaponizable attack surface.

  2. Inventory first. Many organizations do not know where NoMachine is installed — it is frequently shadow-deployed by engineers, researchers, and imaging teams. Sweep your estate for nxserver, nxnode, redis-server binaries and NoMachine installation directories, and reconcile against your authorized software list.

  3. Enforce Redis authentication as an interim hardening measure. Where the bundled Redis instance permits configuration, set requirepass (or ACL-based auth on newer Redis builds) in the redis configuration consumed by NoMachine, and restart the service. Test service functionality afterward — if NoMachine breaks with auth enforced, that constraint is the vulnerability itself and patching is the only true fix.

  4. Bind and firewall the listener. If the Redis instance listens on TCP, ensure it is bound exclusively to 127.0.0.1 (never 0.0.0.0) and add host firewall rules blocking inbound access to ports 6379/6380 from any non-loopback interface. A remotely reachable unauthenticated Redis changes this from an LPE into a critical remote exposure.

  5. Restrict local logon rights. Because exploitation requires local code execution, tightening interactive logon and reducing local user privileges on NoMachine hosts (jump boxes, shared engineering workstations) directly shrinks the attack surface. Apply least privilege per CIS Controls 5 and 6.

  6. Hunt retroactively. Run the detection content above against the last 30 days of telemetry. Successful exploitation leaves artifacts: unexpected module loads, service-spawned shells, and Redis config changes. Treat any hit as a full IR trigger — a successful LPE means you already had an intruder on the box.

  7. Segment NoMachine hosts. Remote access infrastructure should sit in a managed enclave with egress filtering and restricted lateral movement paths. If an attacker does escalate via CVE-2026-92209, segmentation limits blast radius.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.