Skip to the content.

kvm-it exists to type setup passwords and commands into machines. Treat it as a keyboard that can be remote-controlled over radio.

Threat model (what we defend against)

  1. A nearby BLE client trying to type into the target. This is the main risk: a successful attacker gets arbitrary keystrokes on the target, i.e. full control of a logged-in or unlocked machine.
  2. Passive eavesdropping of typed credentials on the BLE link.
  3. Secrets leaking into logs, config files or crash dumps on the controller.

Out of scope: a malicious target (it can already read what the USB HID device does), physical access to the ESP32, and a compromised controller.

Pairing and authentication — decision

BLE LE Secure Connections bonding gives encryption and authentication if configured for MITM-protected pairing. This board has no display or keypad, so pairing would fall back to “Just Works”, which is not MITM-protected: an attacker present during first pairing could bond.

Decision, as implemented in 0.1.0 (pairing, bonding and the encrypted GATT link hardware-verified 2026-10-03 on Linux/BlueZ; the refusal paths below are built and reviewed but not exercised on hardware):

Secrets in the controller

Credential-macro risks (to be repeated in the UI)

A stored credential macro lets anyone with access to the controller session (or a stolen unlocked laptop) type that credential into any attached target. Prefer entering secrets per session; use unique, rotatable provisioning credentials.

Firmware-side notes

The firmware stores no typed text and has no logging of key events beyond counters. The self-test types only the fixed non-secret string HELLO FROM KVM.

The boot drive (0.4.0)

The adapter can also present a USB mass-storage drive carrying iPXE. It is off by default and is switched on deliberately (the Adapter popup, or kvmit boot-drive on; the adapter stores the setting and restarts). While it is off, the adapter’s USB configuration is just the keyboard and mouse interfaces it has always presented (its product id did change from 303a:4008 to 303a:400a with firmware 0.2.0, drive on or off). What the drive does and does not change when it is on:

Windows controller (0.2.0)