VULNARCHIVE

GCVE-1988-2026-0390

[NotCVE-2026-0015] Input Leap through 3.0.3 input-leapd Unauthenticated IPC Command Execution Allows Local Privilege Escalation to SYSTEM

Description (en)

----------------------------------------------------------------------------
NotCVE Advisory — NotCVE-2026-0015
----------------------------------------------------------------------------

[-] Summary:
Missing authentication for a critical function in the input-leapd daemon of
Input Leap, the open-source keyboard and mouse sharing tool, allows a
local, low-privileged user on Windows to execute arbitrary commands as
NT AUTHORITY\SYSTEM by sending a single IPC command message to the
daemon's unauthenticated listener on 127.0.0.1:24801. The command persists
and runs again after a service restart or reboot. CVSS:3.1 7.8
(AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H).

[-] Affected:
Input Leap on Windows from v2.4.0 through 3.0.3 (the final release), where
input-leapd is registered as a service. The input-leap/input-leap
repository was archived read-only on 26 July 2026; no fixed version exists
or is expected.

[-] Technical Description:
IpcServer::listen() binds a TCPListenSocket to 127.0.0.1:24801 (IPC_HOST
and IPC_PORT in src/lib/ipc/Ipc.h). IpcServer::handle_client_connecting()
accepts the socket and wraps it in an IpcClientProxy with no check of the
peer's identity, session or integrity level; the only thing that tells
clients apart is the type each one declares for itself in the kIpcMsgHello
handshake.

IpcClientProxy::parseCommand() reads a length-prefixed command string and
a trailing one-byte elevate flag from the stream, and
DaemonApp::handle_ipc_message() passes both to the watchdog unchanged:

  m_watchdog->setCommand(command, cm.elevate());

There is no allowlist, no check that the command is an Input Leap binary,
and no authorisation check on the elevate flag. With the flag set,
MSWindowsWatchdog::getUserToken() locates winlogon.exe, duplicates its
primary token (OpenProcessToken, DuplicateTokenEx) and the watchdog calls
CreateProcessAsUser() with the attacker's command line. winlogon.exe runs
as NT AUTHORITY\SYSTEM, so the new process does too.

handle_ipc_message() also stores the input with ARCH->setting("Command")
and ARCH->setting("Elevate"). DaemonApp::mainLoop() reads both back at
daemon start ("using last known command") and calls setCommand() again, so
the command is re-executed as SYSTEM after a restart or reboot without
further action by the attacker.

Preconditions: the input-leapd service is installed; beyond that, only
local code execution under any account. ArchDaemonWindows::installDaemon()
registers the service with SERVICE_AUTO_START as LocalSystem, the listener
is opened unconditionally, and no administrative rights, file write or
desktop session are needed.

The sibling project Deskflow fixed the equivalent defect in 1.26.0.161
(CVE-2026-41477); that fix does not apply to Input Leap, which uses a TCP
socket rather than a named pipe and so has no ACL on the endpoint. The
same class of defect in the ancestor Barrier 2.4.0 is NotCVE-2026-0010.
Mitigation until a fork ships a fix: stop and disable the input-leapd
service on hosts where Input Leap is not in use.

Weaknesses:
CWE-306: Missing Authentication for Critical Function
CWE-862: Missing Authorization
CAPEC-69: Target Programs with Elevated Privileges

[-] Credit:
Reported by Christopher Duram
(https://www.linkedin.com/in/christopherduram/).

[-] Full Details and Updates:
https://notcve.org/notcve/NotCVE-2026-0015

[-] Main References:
https://github.com/input-leap/input-leap
https://github.com/input-leap/input-leap/blob/v3.0.3/src/lib/ipc/IpcClientProxy.cpp
https://github.com/deskflow/deskflow/security/advisories/GHSA-6rx5-g478-775c

[-] About NotCVE:
NotCVE (https://notcve.org) assigns public, timestamped NotCVE IDs to
vulnerabilities not acknowledged by vendors. Vendor will not assign a CVE?
Request a NotCVE: https://notcve.org/form/ · Contributors:
https://notcve.org/hall/
_______________________________________________
Sent through the Full Disclosure mailing list
https://nmap.org/mailman/listinfo/fulldisclosure
Web Archives & RSS: https://seclists.org/fulldisclosure/

References

Raw JSON
{
  "containers": {
    "cna": {
      "affected": [
        {
          "product": "Input Leap",
          "vendor": "unknown",
          "versions": [
            {
              "status": "affected",
              "version": "unknown"
            }
          ]
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "advisories"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "----------------------------------------------------------------------------\nNotCVE Advisory — NotCVE-2026-0015\n----------------------------------------------------------------------------\n\n[-] Summary:\nMissing authentication for a critical function in the input-leapd daemon of\nInput Leap, the open-source keyboard and mouse sharing tool, allows a\nlocal, low-privileged user on Windows to execute arbitrary commands as\nNT AUTHORITY\\SYSTEM by sending a single IPC command message to the\ndaemon's unauthenticated listener on 127.0.0.1:24801. The command persists\nand runs again after a service restart or reboot. CVSS:3.1 7.8\n(AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H).\n\n[-] Affected:\nInput Leap on Windows from v2.4.0 through 3.0.3 (the final release), where\ninput-leapd is registered as a service. The input-leap/input-leap\nrepository was archived read-only on 26 July 2026; no fixed version exists\nor is expected.\n\n[-] Technical Description:\nIpcServer::listen() binds a TCPListenSocket to 127.0.0.1:24801 (IPC_HOST\nand IPC_PORT in src/lib/ipc/Ipc.h). IpcServer::handle_client_connecting()\naccepts the socket and wraps it in an IpcClientProxy with no check of the\npeer's identity, session or integrity level; the only thing that tells\nclients apart is the type each one declares for itself in the kIpcMsgHello\nhandshake.\n\nIpcClientProxy::parseCommand() reads a length-prefixed command string and\na trailing one-byte elevate flag from the stream, and\nDaemonApp::handle_ipc_message() passes both to the watchdog unchanged:\n\n  m_watchdog->setCommand(command, cm.elevate());\n\nThere is no allowlist, no check that the command is an Input Leap binary,\nand no authorisation check on the elevate flag. With the flag set,\nMSWindowsWatchdog::getUserToken() locates winlogon.exe, duplicates its\nprimary token (OpenProcessToken, DuplicateTokenEx) and the watchdog calls\nCreateProcessAsUser() with the attacker's command line. winlogon.exe runs\nas NT AUTHORITY\\SYSTEM, so the new process does too.\n\nhandle_ipc_message() also stores the input with ARCH->setting(\"Command\")\nand ARCH->setting(\"Elevate\"). DaemonApp::mainLoop() reads both back at\ndaemon start (\"using last known command\") and calls setCommand() again, so\nthe command is re-executed as SYSTEM after a restart or reboot without\nfurther action by the attacker.\n\nPreconditions: the input-leapd service is installed; beyond that, only\nlocal code execution under any account. ArchDaemonWindows::installDaemon()\nregisters the service with SERVICE_AUTO_START as LocalSystem, the listener\nis opened unconditionally, and no administrative rights, file write or\ndesktop session are needed.\n\nThe sibling project Deskflow fixed the equivalent defect in 1.26.0.161\n(CVE-2026-41477); that fix does not apply to Input Leap, which uses a TCP\nsocket rather than a named pipe and so has no ACL on the endpoint. The\nsame class of defect in the ancestor Barrier 2.4.0 is NotCVE-2026-0010.\nMitigation until a fork ships a fix: stop and disable the input-leapd\nservice on hosts where Input Leap is not in use.\n\nWeaknesses:\nCWE-306: Missing Authentication for Critical Function\nCWE-862: Missing Authorization\nCAPEC-69: Target Programs with Elevated Privileges\n\n[-] Credit:\nReported by Christopher Duram\n(https://www.linkedin.com/in/christopherduram/).\n\n[-] Full Details and Updates:\nhttps://notcve.org/notcve/NotCVE-2026-0015\n\n[-] Main References:\nhttps://github.com/input-leap/input-leap\nhttps://github.com/input-leap/input-leap/blob/v3.0.3/src/lib/ipc/IpcClientProxy.cpp\nhttps://github.com/deskflow/deskflow/security/advisories/GHSA-6rx5-g478-775c\n\n[-] About NotCVE:\nNotCVE (https://notcve.org) assigns public, timestamped NotCVE IDs to\nvulnerabilities not acknowledged by vendors. Vendor will not assign a CVE?\nRequest a NotCVE: https://notcve.org/form/ · Contributors:\nhttps://notcve.org/hall/\n_______________________________________________\nSent through the Full Disclosure mailing list\nhttps://nmap.org/mailman/listinfo/fulldisclosure\nWeb Archives & RSS: https://seclists.org/fulldisclosure/"
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-306",
              "description": "CWE-306",
              "lang": "en",
              "type": "CWE"
            },
            {
              "cweId": "CWE-862",
              "description": "CWE-862",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-02T04:57:26Z",
        "orgId": "4e2abfbf-4a2a-4b76-a4e0-d77c18ba156c",
        "shortName": "VULNARCHIVE"
      },
      "references": [
        {
          "tags": [
            "technical-description"
          ],
          "url": "https://vuln.freearchive.org/archive/full-disclosure/2026/Sep/68"
        },
        {
          "tags": [
            "technical-description"
          ],
          "url": "https://seclists.org/fulldisclosure/2026/Sep/68"
        },
        {
          "url": "https://github.com/deskflow/deskflow/security/advisories/GHSA-6rx5-g478-775c"
        },
        {
          "url": "https://github.com/input-leap/input-leap"
        },
        {
          "url": "https://github.com/input-leap/input-leap/blob/v3.0.3/src/lib/ipc/IpcClientProxy.cpp"
        },
        {
          "url": "https://nmap.org/mailman/listinfo/fulldisclosure"
        },
        {
          "url": "https://notcve.org"
        },
        {
          "url": "https://notcve.org/form/"
        },
        {
          "url": "https://notcve.org/hall/"
        },
        {
          "url": "https://notcve.org/notcve/NotCVE-2026-0015"
        },
        {
          "url": "https://seclists.org/fulldisclosure/"
        },
        {
          "url": "https://www.linkedin.com/in/christopherduram/"
        }
      ],
      "source": {
        "defect": [
          "https://seclists.org/fulldisclosure/2026/Sep/68"
        ],
        "discovery": "EXTERNAL"
      },
      "title": "[NotCVE-2026-0015] Input Leap through 3.0.3 input-leapd Unauthenticated IPC Command Execution Allows Local Privilege Escalation to SYSTEM",
      "x_gcve": [
        {
          "recordType": "reference",
          "relationships": [
            {
              "destId": "CVE-2026-41477",
              "type": "related"
            }
          ],
          "vulnId": "GCVE-1988-2026-0390",
          "x_vulnarchive": {
            "archiveUrl": "https://vuln.freearchive.org/archive/full-disclosure/2026/Sep/68",
            "automated": true,
            "contentSha256": "09ff9afd1696fc211e18cba5265ddcbc0aa9bba040c99ee7f3d9da113075eef0",
            "evidenceScore": 8,
            "messageId": "",
            "originalUrl": "https://seclists.org/fulldisclosure/2026/Sep/68",
            "policy": "vulnarchive-1",
            "sourceFormat": "text/html",
            "sourcePublishedAt": "2026-09-25T16:51:50Z"
          }
        }
      ]
    }
  },
  "cveMetadata": {
    "assignerOrgId": "4e2abfbf-4a2a-4b76-a4e0-d77c18ba156c",
    "assignerShortName": "VULNARCHIVE",
    "datePublished": "2026-10-02T04:57:26Z",
    "dateUpdated": "2026-10-02T04:57:26Z",
    "state": "PUBLISHED",
    "vulnId": "GCVE-1988-2026-0390"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}