Skip to content

Supermicro BMC/IPMI coordinated wave: RMCP+ state-machine breaks, client-specified session validation, and the "Lights Out" measurement corpus

Published: 2026-10-27 09:30Z (nine GHSAs in one second, all referencing the vendor advisories security_BMC_IPMI_Oct_2026_1 and security_BMC_IPMI_Oct_2026_2; GHSA package version fields are empty on every leg — the vendor-advisory band-fingerprinting pattern from the Oct 14 NGINX wave applies: pivot bands to the vendor advisory, not the GHSA). Companion research: HD Moore, "Lights Out: BMCs are still broken, and we have the receipts," Black Hat 2026 (PDF, scanner runZeroInc/oobscan) — the talk names the same CVE IDs and supplies the mechanics, the internet-wide measurements, and the toolchain.

Audience: red-team and bug-bounty operators who touch out-of-band management networks, lab BMC fleets, or OT/edge server rooms; anyone doing recon against a management VLAN.

This is the protocol-layer BMC wave the 2013 Farmer disclosures never got. Two of the legs are unauthenticated RMCP+ session-establishment breaks; the rest are admin→root/BMC-code-execution legs and a KVM-token leg. The talk adds what the GHSAs withhold: exact state-machine mechanics, injection preconditions, exposure rates, and a non-destructive scanner.

Advisory inventory (GHSA / CVE, sev)

GHSA / CVE Sev Leg
GHSA-4gmh-3v9m-9469 / CVE-2026-18450 critical 9.8 (CWE-306) BMC does not enforce integrity/encryption requirements for in-session IPMI commands — crafted packets execute arbitrary commands on an active session (X12SPI per secondary sources)
GHSA-h8gp-mmvv-4j3c / CVE-2026-18449 high 7.5 (CWE-798) Same missing integrity/encryption enforcement, hard-coded-credential flavor — crafted packets execute commands on an active session
GHSA-hjj8-98hq-9pcr / CVE-2026-65219 high RAKP+ flaw: Open Session Request followed by a specially crafted RAKP message (no RAKP Message 1) establishes an RMCP+ session usable to execute commands
GHSA-6fhf-89qw-rcm8 / CVE-2026-65220 high 8.8 RAKP+ logic flaw: crafted messages escalate an account to administrator
GHSA-rwmh-x2cf-2ccg / CVE-2026-16521 high OS command injection into a BMC function; payload executes when the related service is restarted (deferred detonation)
GHSA-p555-j79x-v3hw / CVE-2026-65213 medium IPMI-authenticated administrator → root on the BMC OS
GHSA-v4pm-whwg-hg9x / CVE-2026-65211 high IPMI administrator reads/writes arbitrary BMC physical memory → code execution on the BMC OS
GHSA-xx37-69mm-2gc7 / CVE-2026-65210 medium IPMI administrator reads arbitrary BMC filesystem files ("material well beyond the intended IPMI management role")
GHSA-3989-gjgc-5cm8 / CVE-2026-18451 low HTML5 KVM-over-IP console token is guessable → take over a live KVM session

The mechanics (from the Lights Out talk, same CVE families)

The talk's "State Confusion in IPMI Authentication" and "Client-Specified Validation" classes map 1:1 onto this wave. The durable model is the RMCP+ state machine: CLOSED → SETUP (Open Session) → IDENTIFIED (RAKP 1) → ACTIVE (RAKP 3) → RELEASED (Close), where every gate has exactly one job — and these implementations fail by testing the wrong half.

  1. Client-specified validation (the 18450/18449 family). The RMCP+ payload-type byte's bit 7 (encrypted) and bit 6 (authenticated) are written by the sender, and the receive path tests them instead of the session's negotiated cipher suite: if (pkt bit 6) verify_integrity(); if (pkt bit 7) decrypt(); dispatch(); — clear both bits and the command runs at the victim session's privilege with no HMAC and no decryption. Three independent vendor codebases had the identical shape (one covers both bits in a single cleartext branch with no verify call; one reads bit 7 as a sign bit, (char)hdr[1] < 0). Session IDs ride in every packet in cleartext, and the session slot is found by session ID alone — no peer-address binding (the peer address is only used to address the reply). Three preconditions for on-/off-path command injection: hold a live SID, send from anywhere, clear both bits. Predictable SIDs turn this off-path: one stack allocates SIDm = slot_count + prev_SIDm, +16 per session, no random source, and accepts any sequence number up to last+8.
  2. Message 3 without message 1 (CVE-2026-65219 shape). RAKP Message 1 is the only writer of the bound user ID, requested role, and both nonces into the session slot; Close Session clears only state/allocation/channel, so a released slot keeps the identity and nonce fields at boot values. Skip Message 1 and Message 3 verifies against a transcript whose key is record 0's stored password right-padded to 20 bytes — with boot values that is 16 zero bytes, or on the ATEN-derived stack a 20-byte constant that ships in the firmware image, or on OpenBMC the constructor default. The gate runs and passes; the session activates with no password ever presented.
  3. Message 1 replayed on an existing slot (CVE-2026-65220 shape). A second RAKP Message 1 on an ACTIVE session writes a role byte value that reaches no dispatch arm, so the per-user privilege clamp never executes — the session comes out at the higher registered role = account escalation to Administrator.
  4. Payload-type mislabel at negotiation. Open Session algorithm records are stored by record position but validated by declared type: declare record 0 as CONFIDENTIALITY algorithm 0 and park a decoy RAKP-HMAC-SHA1 record elsewhere → the guard reads record 0, sees "auth = none," and message 3 has no code to test. openSessionStatus = 0x00, session live with auth=none. (Same-shape prior: OpenBMC CVE-2021-39296, CVSS 10.0.)
  5. KVM token leg (CVE-2026-18451 shape). Console token = srand(time) + fifteen rand() draws — seed bounded by the launch second, wrong token answers 404 with no lockout. It looks like a 32-char random; it is a ≤2^32 sweep of unix seconds around page-load time.

The measurement corpus (recon-priority numbers)

One static Go scanner (oobscan, 116 checks, zero destructive) against 126,151 public-internet out-of-band hosts plus a 130,448-host corporate inventory:

  • Service mix on BMC hosts: Redfish 67%, KVM/virtual-media 42%, IPMI 32%, SNMP 18%, serial console 12% — IPMI is only the third surface; Redfish carries its own injection classes (admin/operator SQLi before ACL, one no-login command injection).
  • RAKP Message 2 hands a crackable password verifier to any unauthenticated peer — spec-required (HMAC keyed by the raw stored password), no lockout, nothing logged, two UDP round trips per account. 59.4% of IPMI-answering hosts leak a hash; 24,129 hosts externally. Cracking is offline and cannot lock an account: hashcat -m 7300 (HMAC-SHA1 suites 1–5), -m 7350 (HMAC-MD5 suites 6–14); suites 15–19 (HMAC-SHA256) are John-only (GPU mode now). Public-internet captured hashes skew HMAC-MD5 67.6% (fastest to crack); internal skew HMAC-SHA1 99.5%.
  • Still-switchable-on legacy: IPMI 1.5 on 29–36%, cipher suite 0 offered on 49–55% of IPMI hosts (697/1,576 complete a session with no password), null-authentication accepted on 7,614 hosts, predictable/fixed session IDs on 15.9–22.4%.
  • Survivor bias is the headline: "trivially exploitable before credential theft" measures 2.0% on the public internet vs 8.3% internal before this wave — the same population class is four times softer inside. Plan internal OOB recon accordingly; internet rates understate any private management VLAN.
  • Honeypot tax: 22% of answering "BMC" hosts on the public internet are decoys (nine first-wins heuristics: cert self-naming, cowrie/kippo/dionaea server headers, two BMC families on one address, ≥12 open ports, SSH banner that is an HTTP response...). Any external BMC hit-rate you measure is inflated by deception; the talk's classifier short-circuits the probe battery on decoys.
  • Identity for free, sessionless: Get System GUID embeds the board serial (Supermicro board-code/model prefix), Dell service tag, or HPE part+plant+serial in sixteen printable bytes — one packet identifies the exact machine behind the controller. Get Channel Auth Capabilities + Cipher Suites enumerate auth posture pre-session.
  • Factory-password corpus: per-unit chassis labels (HPE-style) split into a numeric 8-digit generator (10^8 = 26.6 bits, seconds on one GPU) and an alphanumeric 34^8 generator; five vendors ship one constant default across the install base (iDRAC calvin, AMI/ASRock superuser, Supermicro ADMIN, Lenovo/IBM PASSW0RD). 694 in-service hosts still ran the factory password; 84 organizations.
  • Where the machine is: controller→host location without any credential — unauthenticated iLO xmldata, shipped SNMP community neighbour tables, reverse-DNS naming, cert CN — located 2,758 of 87,735 in-scope controllers. Four paths needed a valid login.

The escalation map (why the post-auth legs matter too)

  • One BMC login reaches: keyboard/video/mouse, virtual-USB boot media, host power/reset, BIOS config and passwords, host serial console, firmware update. The admin→root→memory legs here (65213/65211/65210) sit on the path to firmware persistence and host memory.
  • BMC is a separate machine on the auxiliary rail: boots before any host firmware, outlives the host (only AC removal stops it), and host remediation (OS reinstall, disk swap) never touches it — iLOBleed stayed resident since ~2020. Unsigned config-restore persistence (one CRC32 computed then discarded, no signature) survives reboot without any firmware write.
  • In-band is credential-free: the KCS/eSPI system interface carries no host-side authentication — sessionless channels dispatch at Administrator (OpenBMC: Set User Name/Password/Access all granted from host root); HPE iLO CHIF answers full Redfish admin with no session token (AutoLogin, authorization by request origin). ASPEED AHB bridges (iLPC2AHB, PCIe VGA P2A, X-DMA, debug UART) give a host-root process read/write of all BMC physical memory — Pantsdown CVE-2019-6260 silicon, shipped enabled. Blocklist ipmi_si/intel-ilo/chif modules on hosts you own; on engagements, host root → BMC takeover is a lateral path with no credential to steal.
  • Shared LOM / NC-SI sideband: the BMC rides the host NIC's MAC/VLAN filtering — one cable, one switch port, an ACL written for the server. "Surprise public IPMI" is a topology artifact; an IPMI command flips dedicated↔shared mode (Admin on Dell/Lenovo/Cisco, Operator on Huawei).
  • Host reach tiers: T1 raw PECI/AMD APML sideband/host DRAM/BIOS flash; NetFn 0x36 cmd 0x03 at User privilege on six vendors writes AMD SB-RMI registers; arbitrary I2C 0x06/0x52 on 17 of 19 vendors (DIMM SPD, PSU, risers). OEM command families, not the spec, carry the host-touching surface.

Operator rules

  1. On any protocol where a client-set flag selects whether a security check runs, the flag IS the boundary. Clear-the-bit battery: capture one legitimately-secured packet (any authenticated session, any tool), replay it with the auth/encrypt bits cleared, from a different source port/address. Acceptance at the victim's session privilege = finding. This generalizes far past IPMI — audit flag-byte dispatch in any session-layer protocol.
  2. Test every protocol message against every state. Send message 3 without message 1; send message 1 twice; skip messages; reorder. State machines fail at the unset-slot/default-value edge: "validate against the value the skipped writer would have set" means skipped writes leave boot/default/constant keys. Grep fix diffs for state-transition rewrites and re-run the whole matrix against pre-patch firmware.
  3. Stored-by-position vs validated-by-declared-type is a reusable confusion class whenever a request carries a typed record list: shuffle declared types against positions and watch which read wins.
  4. RAKP hash capture is the zero-lockout credential attack: one RAKP 1 per username, keep the reply, never send message 3. Username-validity oracle on stacks that refuse invented names. Cracking happens with no session open — no failed login, no lockout, no log line. For scope-safe proof, capture your own lab unit's hash and crack it; export modes 7300/7350 or JtR.
  5. Treat the management VLAN as a different threat model than production: survivor-bias says internals are 4x softer; IPMI 1.5/cipher-0/null-auth/predictable-SID all persist internally; Redfish out-exposes IPMI 2:1 and needs its own injection sweep; honeypot heuristics matter when scoring external hits.
  6. Persistence framing for reports: a BMC foothold survives reinstall/disk-replacement/OS patching; config-restore paths with discarded CRC32s need no firmware write; the talk's five-step ladder (unauth→admin→root→firmware→host) had firmware and host legs demonstrated on four product lines — say which rung your proof actually reaches.
  7. Scanner-grounded recon: oobscan's per-check design (scoped applicability, negative controls on both bypass checks, offline-crack-before-online with a six-guess online cap) is a reusable template for non-destructive OOB assessment; its NDJSON per-host output (identity, findings-with-proof, RAKP material) maps straight into reporting.

Validation boundaries

Authorized lab BMCs or owned fleet only; firmware/emulation (QEMU ast2600/npcm845 images boot and produced two blind auth bypasses before any metal was touched). On third-party engagements, proof stops at: hash capture of an account you own or the factory default you demonstrate on a vendor-published default, one cleared-bit replay on a session you initiated, and read-only enumeration. No power operations, no firmware writes, no KVM injection into live consoles, no host memory reads; memory-write primitives (oobscan ipmi mem prints bytes but sends nothing until apply) must stay un-applied on anything not yours. BMC compromise is not a demo — it is persistence on someone's server.

Same-wave tracked without publication

Qt QAuthenticator NTLM OOB read (client-side, server-controlled challenge) + QTextCodec TSCII OOB read (memory-safety singles); fast-uri quartet (scheme spoofing/normalization/host-confusion — known URL-parser classes, July 30 URL-policy page); undici content-encoding DoS + EventSource memory DoS + SRI non-lowercase-token bypass (the SRI leg is a parser-normalization class already covered); MSAL Node auth-code param disclosure (endpoint-configuration class, Sept 16 rmcp page); multer async fileFilter teardown DoS; Pillow FlashPix FPX JPEG heap overflow (memory-safety, watch for KEV — critical pre-auth-decode on a ubiquitous lib; Arrow export stale-heap leak paired); postal-mime/Nodemailer addressparser comment/group parser legs (email-parser class, Nodemailer pair is the nested-comment-ends-early family already tracked July 22); Laravel relationship-inclusion unauthorized destruction (ORM verb-ACL class); GSS Deployment Server hardcoded key decrypt (known hardcoded-at-rest class); Moxa MRC client cert-validation + OnCell hardcoded key/cmdi/improper-cert trio (IoT appliance singles; OnCell SMS cmdi is privilege-gated); Fortinet FortiOS HTTPS-management DoS (unauth network DoS, availability-only); Kirki PHP object injection + Qode Membership auth bypass promoted as folds on the WordPress pages this run. KEV unchanged (catalog 2026.10.26, 1758, cveID-set sha 3dde3ea0; none of the Supermicro CVEs KEV'd; RouterOS CVE-2026-84411 still the oldest open ITW-confirmed un-KEV'd watch).