ESPHome Device Builder Dashboard Authentication Bypass (CVE-2026-59178)
Detects exploitation and exposure of CVE-2026-59178, a missing-authentication vulnerability (CWE-306) in ESPHome Device Builder versions prior to 1.0.12. An upgrade renamed the dashboard authentication environment variables; deployments still setting the old variable names silently start with authentication disabled, exposing the ESPHome dashboard (default port 6052) to unauthenticated access. Unauthenticated actors can then reach device configuration, OTA firmware compilation/flashing, and secrets management. This detection surfaces unauthenticated dashboard access, sensitive dashboard/API endpoint hits without prior authentication, and OTA/compile actions originating from unauthenticated sessions.
Vulnerability Intelligence
Public PoCAffected Software
- Vendor
- pip
- Product
- esphome-device-builder
- Versions
- < 1.0.12
Weakness (CWE)
Timeline
- Disclosed
- September 14, 2026
References & Proof of Concept
- PoChttps://github.com/advisories/GHSA-rrxg-g2pf-6hh4
- https://github.com/esphome/device-builder/security/advisories/GHSA-rrxg-g2pf-6hh4
- https://github.com/esphome/device-builder/pull/1625
- https://github.com/esphome/device-builder/commit/9e294f729c3eb7334bb57b9fc49b75b728052f52
- https://github.com/esphome/device-builder/releases/tag/1.0.12
CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
What is CVE-2026-59178 ESPHome Device Builder Dashboard Authentication Bypass (CVE-2026-59178)?
ESPHome Device Builder Dashboard Authentication Bypass (CVE-2026-59178) (CVE-2026-59178) maps to the Initial Access and Privilege Escalation tactics — the adversary is trying to get into your network in MITRE ATT&CK.
This page provides production-ready detection logic for ESPHome Device Builder Dashboard Authentication Bypass (CVE-2026-59178), covering the data sources and telemetry it touches: Network Proxy Logs, Web Application Firewall, Reverse Proxy / Ingress Access Logs. The queries below are rated critical severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.
MITRE ATT&CK
let dashboardPort = dynamic([6052]);
let sensitivePaths = dynamic(["/login", "/devices", "/edit", "/compile", "/upload", "/ota", "/secret_keys", "/download.bin", "/api/"]);
CommonSecurityLog
| where DestinationPort in (dashboardPort) or RequestURL has_any (sensitivePaths)
| where RequestMethod in ("GET","POST")
| extend HasAuth = tostring(AdditionalExtensions) has "Authorization" or tostring(AdditionalExtensions) has "Cookie="
| where HasAuth == false
| where RequestURL has_any (sensitivePaths)
| summarize Hits=count(), Paths=make_set(RequestURL, 25), FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated) by SourceIP, DestinationIP, DestinationPort
| where Hits >= 1
| order by Hits desc Flags unauthenticated HTTP requests to ESPHome Device Builder dashboard endpoints (default port 6052) reaching sensitive device, compile and OTA paths, consistent with the auth-disabled state of CVE-2026-59178.
Data Sources
Required Tables
False Positives
- Internal health-check or uptime monitors polling the dashboard without credentials on an intentionally trusted network.
- Authorized administrators legitimately accessing the dashboard from a bastion where auth is terminated upstream by a reverse proxy.
- Vulnerability scanners run by the security team probing dashboard endpoints during authorized assessments.
Sigma rule & cross-platform mapping
The detection logic for ESPHome Device Builder Dashboard Authentication Bypass (CVE-2026-59178) (CVE-2026-59178) above is provided in a vendor-neutral
form so you can deploy it on any SIEM. The same logic is shipped here as native
KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the
following logsource:
logsource:
category: network_connection
product: windows Browse the community-maintained Sigma rules for this technique:
Platform-specific guides for CVE-2026-59178
References (5)
- https://github.com/esphome/device-builder/security/advisories/GHSA-rrxg-g2pf-6hh4
- https://github.com/esphome/device-builder/pull/1625
- https://github.com/esphome/device-builder/commit/9e294f729c3eb7334bb57b9fc49b75b728052f52
- https://github.com/esphome/device-builder/releases/tag/1.0.12
- https://github.com/advisories/GHSA-rrxg-g2pf-6hh4
Testing Methodology
Validate this detection against 3 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1Start ESPHome Device Builder with renamed/unset auth variables (auth disabled)
Expected signal: Container start event and a service listening on TCP 6052 with no authentication challenge on HTTP requests.
- Test 2Unauthenticated access to device list endpoint
Expected signal: Web/proxy access log entry: GET /devices on port 6052 with no Authorization or Cookie header, HTTP 200.
- Test 3Unauthenticated OTA/compile endpoint probe
Expected signal: Web/proxy access log entry: POST /compile on port 6052 without auth headers.
Response Playbook
Triage
- Confirm the ESPHome Device Builder version on the affected host: run `pip show esphome-device-builder` (or inspect the container image tag) and flag any version < 1.0.12.
- Inspect the running process/container environment for the deprecated authentication variables and confirm whether the renamed variables are set; an unset/renamed auth variable means the dashboard started with authentication disabled.
- Review reverse-proxy and dashboard access logs for the source IPs identified by the detection and determine whether any unauthenticated session reached /devices, /edit, /compile, /ota, or /secret_keys.
- Determine the network exposure of port 6052 (internet-facing, VLAN, or localhost-only) to establish blast radius.
Containment
- Immediately restrict network access to port 6052 via firewall/security group so only trusted management hosts can reach the dashboard, or take the dashboard offline until patched.
- Restore authentication by setting the correct (renamed) auth environment variables, or place the dashboard behind an authenticating reverse proxy, then restart the service and verify a login prompt is enforced.
- Upgrade ESPHome Device Builder to 1.0.12 or later on all affected instances.
Evidence Collection
- Preserve dashboard and reverse-proxy access logs covering the exposure window, including request methods, URLs and source IPs, before any log rotation.
- Capture the current process environment and container configuration (`/proc/<pid>/environ`, compose/helm manifests) to document which auth variables were set.
- Export the list of device configurations, secrets files, and any firmware binaries that were accessed or downloaded during the unauthenticated window.
Escalation Criteria
- ! Escalate to incident response if logs show an unauthenticated session performed an OTA/compile/upload action or downloaded firmware or secret_keys.
- ! Escalate if the dashboard on port 6052 was reachable from the public internet during the exposure window.
- ! Escalate if device configurations or ESPHome secrets appear to have been modified or exfiltrated by an unauthenticated source.
Investigation Guide
Forensic Artifacts
- >
Reverse-proxy/dashboard access logs showing unauthenticated requests to /devices, /compile and /ota endpoints. - >
Process environment (`/proc/<pid>/environ`) or container manifest showing the deprecated auth variable names. - >
ESPHome build/OTA artifacts (compiled .bin firmware) and modified device YAML configs under the ESPHome config directory.
Tuning Guidance
Baseline known monitoring and load-balancer source IPs that legitimately poll the dashboard without credentials and exclude them. If a reverse proxy terminates authentication upstream, the captured logs will lack Authorization headers on every request — in that case anchor the rule on external/untrusted source IPs and on the sensitive path list (/compile, /ota, /secret_keys) rather than on the absence of the header alone. Prioritize alerts where port 6052 is reachable from outside the management network.
Hunting Queries
Hunts for unauthenticated OTA/compile/firmware-download activity against the ESPHome dashboard indicating post-exposure abuse.
CommonSecurityLog | where DestinationPort == 6052 | where RequestURL has_any ("/compile","/ota","/upload","/download.bin") | where tostring(AdditionalExtensions) !has "Authorization" | summarize count() by SourceIP, RequestURL, bin(TimeGenerated, 1h) index=web dest_port=6052 (uri_path="/compile" OR uri_path="/ota" OR uri_path="/upload" OR uri_path="/download.bin") NOT _raw="*Authorization:*" | stats count by src_ip, uri_path Atomic Red Team Tests
Launches a vulnerable device-builder instance in a lab using the deprecated auth environment variable names, reproducing the silently-disabled authentication state.
Command
docker run -d --name esphome-cve-test -p 6052:6052 -e ESPHOME_DASHBOARD_USE_PING=false -e OLD_DASHBOARD_USERNAME=admin -e OLD_DASHBOARD_PASSWORD=admin ghcr.io/esphome/esphome:1.0.11 Cleanup
docker rm -f esphome-cve-test Expected Telemetry
Container start event and a service listening on TCP 6052 with no authentication challenge on HTTP requests.
Expected Detection
Not directly alerted; establishes the vulnerable listener for subsequent unauthenticated-access tests.
Sends an unauthenticated HTTP request to the dashboard /devices endpoint and confirms a 200 response instead of a login redirect.
Command
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:6052/devices Cleanup
true Expected Telemetry
Web/proxy access log entry: GET /devices on port 6052 with no Authorization or Cookie header, HTTP 200.
Expected Detection
KQL/SPL/EQL rules fire on unauthenticated GET /devices to port 6052.
Issues an unauthenticated request to the compile/OTA path to simulate an attacker preparing to build or flash firmware without credentials.
Command
curl -s -X POST http://127.0.0.1:6052/compile -H 'Content-Type: application/json' -d '{"configuration":"test.yaml"}' -o /dev/null -w '%{http_code}\n' Cleanup
true Expected Telemetry
Web/proxy access log entry: POST /compile on port 6052 without auth headers.
Expected Detection
Hunting query and primary detections flag unauthenticated POST to /compile, indicating potential OTA abuse.