VYPR
High severityNVD Advisory· Published Feb 26, 2024· Updated Aug 27, 2024

ESPHome remote code execution via arbitrary file write

CVE-2024-27081

Description

ESPHome is a system to control your ESP8266/ESP32. A security misconfiguration in the edit configuration file API in the dashboard component of ESPHome version 2023.12.9 (command line installation) allows authenticated remote attackers to read and write arbitrary files under the configuration directory rendering remote code execution possible. This vulnerability is patched in 2024.2.1.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
esphomePyPI
>= 2023.12.9, < 2024.2.12024.2.1

Affected products

1

Patches

1
d814ed1d4adc

Merge pull request from GHSA-8p25-3q46-8q2p

https://github.com/esphome/esphomeJesse HillsFeb 22, 2024via ghsa
1 file changed · +19 5
  • esphome/dashboard/web_server.py+19 5 modified
    @@ -806,8 +806,16 @@ class EditRequestHandler(BaseHandler):
         @bind_config
         async def get(self, configuration: str | None = None) -> None:
             """Get the content of a file."""
    -        loop = asyncio.get_running_loop()
    +        if not configuration.endswith((".yaml", ".yml")):
    +            self.send_error(404)
    +            return
    +
             filename = settings.rel_path(configuration)
    +        if Path(filename).resolve().parent != settings.absolute_config_dir:
    +            self.send_error(404)
    +            return
    +
    +        loop = asyncio.get_running_loop()
             content = await loop.run_in_executor(
                 None, self._read_file, filename, configuration
             )
    @@ -833,11 +841,17 @@ def _write_file(self, filename: str, content: bytes) -> None:
         @bind_config
         async def post(self, configuration: str | None = None) -> None:
             """Write the content of a file."""
    +        if not configuration.endswith((".yaml", ".yml")):
    +            self.send_error(404)
    +            return
    +
    +        filename = settings.rel_path(configuration)
    +        if Path(filename).resolve().parent != settings.absolute_config_dir:
    +            self.send_error(404)
    +            return
    +
             loop = asyncio.get_running_loop()
    -        config_file = settings.rel_path(configuration)
    -        await loop.run_in_executor(
    -            None, self._write_file, config_file, self.request.body
    -        )
    +        await loop.run_in_executor(None, self._write_file, filename, self.request.body)
             # Ensure the StorageJSON is updated as well
             DASHBOARD.entries.async_schedule_storage_json_update(filename)
             self.set_status(200)
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

4

News mentions

0

No linked articles in our index yet.