CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-59178

CVE-2026-59178: Authentication Bypass in ESPHome Device Builder Dashboard

Alon Barad
Alon Barad
Software Engineer

Sep 14, 2026·6 min read·25 visits

Executive Summary (TL;DR)

ESPHome Device Builder Dashboard silently disables authentication upon upgrading if operators rely on legacy USERNAME and PASSWORD environment variables, granting full unauthenticated administrative access to remote network attackers.

An authentication bypass vulnerability in ESPHome Device Builder Dashboard allows unauthenticated remote attackers to gain administrative access. The flaw is caused by a backward compatibility break during an environment variable rename that silently disables dashboard authentication upon upgrade.

Vulnerability Overview

The ESPHome Device Builder Dashboard provides a web-based interface for managing, configuring, compiling, and flashing firmware to ESPHome-compatible microcontrollers. This service exposes a significant attack surface because it interacts directly with host system compilation tools and connected hardware devices. When exposed to a network, the dashboard relies on authentication mechanisms to control administrative access.

CVE-2026-59178 is a critical authentication bypass vulnerability affecting the standalone deployment model of the ESPHome Device Builder Dashboard. The vulnerability manifests during an upgrade process when operators rely on older, previously documented configuration files. A sudden backward compatibility break in how environment variables are parsed causes the application to silently disable its authentication middleware.

This flaw is classified under CWE-306 (Missing Authentication for Critical Function) and carries a CVSS v3.1 base score of 9.8. It allows unauthenticated remote attackers with network access to the service port to execute administrative actions without providing credentials. The impact on standalone Docker deployments is particularly severe, as these installations run without external reverse proxies or orchestrator-level security controls.

Root Cause Analysis

To understand the root cause of CVE-2026-59178, it is necessary to examine how credentials were historically handled. In legacy versions of the dashboard, authentication was configured using the bare environment variables $USERNAME and $PASSWORD. This design created a security risk on multi-user systems because $USERNAME is a standard pre-populated operating system variable. On Linux and Windows, the system automatically defines $USERNAME as the active shell user, which often resulted in unexpected privilege escalation patterns inside the application.

To resolve this environment variable collision, developers modified the system to parse application-prefixed variables named $ESPHOME_USERNAME and $ESPHOME_PASSWORD. However, the implementation of this change completely removed the fallback parser logic for the legacy bare variables. No warning or error was raised during configuration loading if only the legacy variables were present, leading to a silent failure state.

When an upgraded instance starts with legacy environment variables, the new configuration parser evaluates the unset $ESPHOME_USERNAME and $ESPHOME_PASSWORD variables to empty strings. The application logic interprets empty credential variables as a deliberate choice by the administrator to run without authentication. Consequently, the initialization sequence disables the REST endpoint protection and WebSocket gates, rendering the entire dashboard publicly accessible.

Code Analysis

A review of the vulnerable codebase in esphome_device_builder/controllers/config/settings.py highlights the parsing logic failure. The application parsed CLI arguments and environment variables without fallback validation. The code segment below demonstrates how the credentials resolved to empty strings when operators supplied only legacy variables:

# Vulnerable parsing implementation in settings.py
username = getattr(args, "username", None) or os.getenv("ESPHOME_USERNAME") or ""
password = getattr(args, "password", None) or os.getenv("ESPHOME_PASSWORD") or ""
self.username = username
self.using_password = bool(username and password)

In this implementation, if an administrator defined USERNAME=admin and PASSWORD=secret, both os.getenv("ESPHOME_USERNAME") and os.getenv("ESPHOME_PASSWORD") returned None. The variables resolved to empty strings, which forced self.using_password to evaluate to False.

The patch introduced in commit 9e294f729c3eb7334bb57b9fc49b75b728052f52 addresses this design flaw by introducing a structured credential resolver class. This resolver maintains backward compatibility safely by validating the legacy variables conditionally. It only activates the fallback mechanism when the legacy $PASSWORD variable is explicitly set, ensuring that system-default $USERNAME values do not inadvertently trigger authentication logic:

# Patched credentials resolution helper in credentials.py
def resolve_credentials(
    username_arg: str,
    password_arg: str,
    environ: Mapping[str, str] = os.environ,
) -> ResolvedCredentials:
    # 1. Resolve new variables first
    username = username_arg or environ.get("ESPHOME_USERNAME", "")
    password = password_arg or environ.get("ESPHOME_PASSWORD", "")
    used_legacy = False
 
    # 2. Safe fallback: Gate legacy parsing on the presence of the PASSWORD environment variable
    if not username and not password and environ.get("PASSWORD"):
        username = environ.get("USERNAME", "")
        password = environ.get("PASSWORD", "")
        used_legacy = bool(username and password)
 
    return ResolvedCredentials(
        username=username,
        password=password,
        used_legacy=used_legacy,
        mismatch=bool(username) != bool(password),
    )

Exploitation and Attack Path

An attack targeting CVE-2026-59178 is direct and requires no complex exploitation chaining or payload crafting. An attacker must first identify an exposed ESPHome Device Builder Dashboard service. This is typically achieved by scanning for the default port 6052 or identifying instances exposed through misconfigured reverse proxies.

Once an exposed port is identified, the attacker sends a standard HTTP request to the dashboard's API endpoints or initiates a WebSocket connection. Because the application has disabled its authentication checks, the server skips the validation routine and immediately grants administrative access. The diagram below illustrates the attack flow of an unauthenticated actor bypass:

There are no prerequisites such as session hijacking or database manipulation. The exploit succeeds instantly as long as the underlying container is running with legacy configuration parameters. This minimal operational complexity results in a high likelihood of successful exploitation once a vulnerable instance is discovered.

Impact Assessment

The security consequences of an unauthenticated actor gaining access to the ESPHome dashboard are severe. ESPHome's system architecture assumes that anyone with dashboard access possesses host-equivalent permissions. An attacker who accesses the interface can instantly view the underlying YAML configuration files, which frequently store sensitive secrets.

These configurations typically expose cleartext Wi-Fi passwords, Home Assistant API tokens, internal security keys, and encrypted credentials. Beyond information disclosure, the dashboard allows users to compile and build custom firmware. An attacker can inject arbitrary Python or C++ code into the build process, leading to remote code execution on the hosting system.

Furthermore, attackers can overwrite the firmware of physical microcontrollers connected to the system. This allows for the propagation of malicious firmware across internal networks, potentially turning embedded devices into network sniffers, denial-of-service bots, or persistence mechanisms within the local environment.

Remediation and Mitigation

Remediation of CVE-2026-59178 requires upgrading the dashboard components or updating the environment variables to align with the new schema. The permanent solution is to upgrade to esphome-device-builder version 1.0.12 or container version 2026.6.2. This upgrade restores safe fallback parsing and alerts administrators of deprecated configurations.

If an immediate upgrade is not feasible, operators must implement manual workarounds. You can secure the installation by manually renaming the environment variables in your container definitions. Replace the legacy keys with the new application-prefixed versions:

# Corrected environment definition
environment:
  - ESPHOME_USERNAME=admin
  - ESPHOME_PASSWORD=your_secure_password

Additionally, enforce network-level segmentation to prevent public exposure. Restrict access to port 6052 using local firewalls or VPNs, and ensure the dashboard is never exposed to the public internet without an external authentication proxy.

Fix Analysis (1)

Technical Appendix

CVSS Score
9.8/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Affected Systems

ESPHome Device Builder Dashboard standalone container installations

Affected Versions Detail

Product
Affected Versions
Fixed Version
esphome-device-builder
ESPHome
< 1.0.121.0.12
ghcr.io/esphome/esphome
ESPHome
< 2026.6.22026.6.2
AttributeDetail
CWE IDCWE-306 (Missing Authentication for Critical Function)
Attack VectorNetwork
CVSS v3.1 Score9.8
Exploit StatusNone
CISA KEV StatusNot Listed
ImpactUnauthenticated Remote Code Execution and Firmware Manipulation

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
CWE-306
Missing Authentication for Critical Function

The application does not perform any authentication check for functionality that requires a proven user identity.

References & Sources

  • [1]Official Security Advisory
  • [2]Fix Pull Request (PR #1625)
  • [3]Official Fix Commit
  • [4]Release Page (Version 1.0.12)
  • [5]ESPHome Security Best Practices Documentation
  • [6]ESPHome 2026.6.0 Changelog

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•29 minutes ago•CVE-2026-115908
7.4

CVE-2026-115908: Arbitrary File Write via Lexical Symlink Validation Bypass in Rust zip Crate

CVE-2026-115908 (GHSA-hjqx-j4rw-g7xv) is a high-severity path traversal and link-following vulnerability in the Rust zip library (zip-rs/zip2) affecting versions >= 7.2.0 and < 9.0.0. Because ZipArchive::extract and ZipArchive::extract_unwrapped_root_dir validate symbolic link targets solely via lexical prefix comparisons rather than resolving intermediate filesystem links, an attacker who knows or can guess the absolute extraction path can construct multi-hop symlink chains that escape the destination directory, enabling arbitrary file creation and overwrite with the privileges of the extracting process.

Amit Schendel
Amit Schendel
0 views•10 min read
•about 2 hours ago•CVE-2026-115907
7.5

CVE-2026-115907: Denial of Service via Excessive Memory Pre-allocation in Rust zip Crate Legacy Decoders

CVE-2026-115907 is an uncontrolled resource consumption vulnerability in the Rust zip crate (versions 5.1.0 through 8.6.0, and 9.0.0 pre-releases) when compiled with the optional legacy-zip feature flag. The vulnerability resides in the legacy decompression decoders—Shrink, Reduce, and Implode—which directly pass an archive-declared 64-bit uncompressed size from a ZIP64 extended information extra field to Vec::reserve() before validating the compressed data stream. By supplying a malformed ZIP archive with a declared uncompressed size exceeding isize::MAX (such as u64::MAX), an unauthenticated attacker can trigger an unhandled capacity overflow panic in the Rust standard library allocator, terminating the calling thread or aborting the entire process.

Alon Barad
Alon Barad
2 views•12 min read
•about 3 hours ago•GHSA-VPP8-G58W-M8MP
7.5

GHSA-vpp8-g58w-m8mp: HTTP/2 Rapid Reset Denial of Service in Twisted Web

Twisted versions up to and including 26.4.0 are vulnerable to an unauthenticated remote denial-of-service attack via the HTTP/2 Rapid Reset technique (a variant of CVE-2023-44487). The HTTP/2 connection handler in twisted.web processes pipelined HEADERS and RST_STREAM frames sequentially within the same TCP segment. Because the request dispatch and synchronous rendering occur upon receiving the StreamEnded event before the subsequent StreamReset event is evaluated, an attacker can force the server to expend CPU cycles rendering responses while immediately evicting stream state to bypass concurrent stream limits.

Alon Barad
Alon Barad
7 views•8 min read
•about 4 hours ago•CVE-2026-118664
8.2

CVE-2026-118664: Quadratic Complexity Denial of Service in decode-uri-component

An inefficient algorithmic complexity vulnerability exists in the npm package decode-uri-component prior to version 0.5.1. When processing malformed URI strings containing invalid percent-escape sequences, the library falls back to a custom decoder that collects distinct percent-encoded runs into a dictionary and executes a full-string regular expression replacement for each entry. Supplying a payload with thousands of distinct percent-encoded sequences alongside a malformed escape triggers quadratic O(K * L) execution time, starving the single-threaded Node.js event loop and resulting in an unauthenticated Denial of Service.

Amit Schendel
Amit Schendel
4 views•9 min read
•about 4 hours ago•CVE-2026-115921
6.2

CVE-2026-115921: Null Pointer Dereference and Integer Conversion in ONNX ScanInferenceFunction

Open Neural Network Exchange (ONNX) versions 1.4.0 prior to 1.22.0 contain a null pointer dereference (CWE-476) and a signed-to-unsigned integer conversion error (CWE-195) in the shape inference functions for the Scan operator. When processing an untrusted ONNX model, the functions ScanInferenceFunction, ScanInferenceFunction_opset8, and ScanInferenceFunction_opset9 fail to validate the presence and value of the required num_scan_inputs attribute. Omitting the attribute results in a direct null pointer dereference that crashes the host process via SIGSEGV, while supplying a negative value triggers an integer wrap-around during type narrowing that leads to an unhandled allocation failure. Notably, models containing a negative num_scan_inputs value bypass standard validation via onnx.checker.check_model().

Amit Schendel
Amit Schendel
4 views•9 min read
•about 5 hours ago•CVE-2026-91403
9.1

CVE-2026-91403: Cryptographic Trust Validation Bypass in Oracle Java SE JSSE via Compromised eMudhra Intermediate CAs

CVE-2026-91403 is a critical cryptographic trust validation flaw (CWE-327) in the Java Secure Socket Extension (JSSE) component of Oracle Java SE, Oracle GraalVM, and OpenJDK builds. Triggered by the compromise of private signing keys for eight intermediate Certificate Authorities operated by eMudhra (emSign), unpatched Java runtime environments implicitly trust fraudulent TLS and code-signing certificates issued by these compromised intermediates. Because Java disables online certificate revocation checking (OCSP/CRL) by default, an unauthenticated network attacker in an Adversary-in-the-Middle (AiTM) position can intercept, decrypt, and modify encrypted TLS communications or bypass code signature verification without triggering security exceptions.

Alon Barad
Alon Barad
7 views•12 min read