16 października 2026 do ESPHome trafiła poprawka komponentu web_server, która zamyka boczną furtkę do encji oznaczonych jako internal: true. Do tej pory REST API urządzenia odpowiadało na żądania kierowane do takich encji po nazwie, choć strona WWW i strumień /events w ogóle ich nie pokazują. Po zmianie te adresy zwracają błąd 404, chyba że w sekcji web_server: ustawisz include_internal: true. Autorem poprawki jest sebo-b, a przejrzał ją i scalił bdraco. Poprawka jest w gałęzi dev, więc wejdzie do ESPHome 2026.11. Oznaczono ją jako zmianę niezgodną wstecz.
Do czego dało się dostać
Opcja internal: true często służy do schowania niskopoziomowego elementu za bezpieczniejszą nakładką. Typowy przykład to przekaźnik na zwykłym pinie GPIO, ukryty za przełącznikiem szablonowym (template), który dodaje odliczanie czasu, blokadę albo samoczynne wyłączenie. Home Assistant widzi tylko nakładkę, strona WWW również. REST API nie trzymało się tej zasady: żądanie w rodzaju curl -d '' http://<urządzenie>/switch/<internal_id>/turn_on nadal przełączało sam przekaźnik z pominięciem zabezpieczeń nakładki.
Taki adres łatwo zgadnąć. Encja, która ma tylko id:, automatycznie staje się wewnętrzna, a jej nazwą zostaje identyfikator, więc wystarczy znać plik YAML.
Według opisu poprawki sprawdzanie is_internal() w poszczególnych procedurach obsługi zniknęło w ESPHome 2021.12, kiedy dodano opcję include_internal (#2627). Nowy kod przywraca więc dawne zachowanie, a nie wprowadza nowej reguły. Sprawdzenie jest teraz w jednym miejscu, w UrlMatch::match_entity(), więc obejmuje wszystkie 23 procedury obsługi encji. Na ESP8266 kosztuje 48 bajtów pamięci flash i ani bajtu RAM.
Według zasad ESPHome to nie luka
Autor zaznacza, że w modelu zagrożeń ESPHome nie jest to luka bezpieczeństwa, bo serwer WWW bez auth: z założenia jest otwartym API. Poprawka sprawia za to, że internal znaczy w serwerze WWW to samo co w natywnym API i w MQTT, które już stosują tę regułę.
Co sprawdzić przed aktualizacją
Jeśli skrypt, panel albo inne urządzenie wywołuje ukrytą encję przez adres serwera WWW, po aktualizacji do 2026.11 dostanie błąd 404. Są dwa wyjścia: ustawić include_internal: true w sekcji web_server: (wtedy ukryte encje pojawią się też na stronie) albo usunąć internal: true z tej encji. Odpowiednia zmiana w dokumentacji na esphome.io (#7756) 17 października wciąż czekała na scalenie.
Jeśli serwer WWW działa bez auth:, warto przy okazji ustawić nazwę użytkownika i hasło. Poprawka zawęża tylko to, do czego dostanie się klient bez logowania, ale go nie odcina.