Пароль на балконный инвертор Hoymiles – это его собственный серийный номер. Не отдельный секрет, не PIN-код, а маркировка, которая и так напечатана на корпусе устройства. Разработчики рассудили просто: инвертор не передаёт ничего в эфир, пока не получит входящий запрос, а значит узнать его серийник со стороны неоткуда. На этом единственном допущении держалась вся защита протокола DTU – беспроводного канала, которым Hoymiles управляет микроинверторами серий HM, HMS и HMT. Таких стоит не одна сотня тысяч – только в Германии в 2025 году на крышах и балконах появилось около полумиллиона новых солнечных станций, а сам Hoymiles занимает почти пятую часть европейского рынка микроинверторов.
Независимый исследователь Benedikt Heinz, в комьюнити известный как Hunz, нашёл в переведённой документации протокола недокументированную broadcast-команду Search ID (в оригинале – Gongfa). Один пакет в эфир – и каждый инвертор поблизости сдаёт серийник открытым текстом, никого не спрашивая. Единственный барьер испаряется по требованию атакующего, а дальше открывается полный набор команд DTU: включение и отключение, изменение мощности, перезапись параметров сети и, хуже всего, заливка произвольной прошивки без единой проверки подлинности.
Комьюнити реверсеров разбирает DTU с 2021 года – сначала просто чтобы снять зависимость от облака Hoymiles, отсюда выросли открытые прошивки вроде OpenDTU и AhoyDTU. Криптографии в протоколе не нашли никакой. Но долгое время брешь считали не опасной: раз инвертор не отвечает, пока к нему не обратились напрямую по известному серийнику, узнать этот серийник со стороны неоткуда.
Hunz решил проверить это руками, а не на бумаге. Для HMS-серии (868 МГц) хватило простого broadcast-запроса на адрес 00 00 00 00 – инвертор сам отвечает моделью и последними восемью цифрами серийника в BCD. С HM-серией (2,4 ГГц, протокол Nordic Enhanced ShockBurst) так просто не вышло: приёмник в ESB отбрасывает пакеты, если адрес назначения не совпадает с адресом получателя, а слать команду без знания серийника – бессмысленно по определению протокола. Значит, должен существовать второй, общий для всех адрес прослушивания.
Hunz вскрыл радиомодуль HM-400, снял RF-экран и через SWD-порт чипа Nordic nRF51802 – отладочный доступ на нём никто не заблокировал – выкачал содержимое регистров RADIO. Внутри обнаружился второй ESB-адрес, прошитый в прошивку на заводе одинаковым для всей линейки:
05 64 64 64 64
Настроить самодельный приёмник на этот адрес – и любой HM-инвертор в радиусе действия отвечает на команду 0x02 своим PID и серийником, будто его специально об этом попросили. Дальность в тестах – около 350 метров при мощности передатчика 100 мВт и обычной всенаправленной антенне; комплектующие для такого передатчика стоят несколько евро.
Дальше Hunz собрал портативный сканер: nRF24L01+ на микроконтроллере с антенной, вместо экрана – смартфон по USB. Прошивка перебирает каналы, шлёт 0x02 (Search ID) и 0x06 (штатная команда сбора данных о самом RF-модуле – она тоже спокойно отдаёт серийник даже без Search ID, судя по всему из-за отдельного бага в прошивке радиомодуля) и логирует всё, что откликнулось. За двадцать минут прогулки по кварталу устройство насканировало 24 чужих инвертора с моделями и серийниками. Позже, уже в Аугсбурге, за час набралось 42 работающих балконных станции – и все с открытым эфирным доступом.
Список моделей, которые откликнулись, впечатляет размахом: HM-300/350/400, HM-600/700/800, HM-1000/1200/1500, вся линейка HMS/HMT на 868 МГц, ребрендированные HERF (бренд E-Star), Solenso и TSUN. Практически весь модельный ряд Hoymiles без Wi-Fi построен на одном протоколе с одной и той же дырой.
Дальше начинается настоящий разбор. Протокол DTU умеет не только опрашивать статус. Командой 0x0e (Download Firmware) можно залить на инвертор новую прошивку целиком, в формате Intel HEX, конвертированном в бинарник. Единственная проверка целостности – CRC, ни цифровой подписи, ни подтверждения владельца. Hunz написал тестовую прошивку на ассемблере DSP-ядра TI C28x, которая мигает статусными светодиодами и щёлкает реле сетевой защиты, собрал корректный заголовок с валидными CRC – и залил её по воздуху на тестовый HM-400:
# write firmware header to flash
TX: 0e 85034022 80187265 01 20 80 00 00 00 3e 80 10 00 3e 80 2d 32 91 80 80 5a
TX: 0e 85034022 80187265 02 27 1e 07 e5 04 b9 04 de 10 10 00 00 ff ff ff ff db
TX: 0e 85034022 80187265 83 ff ff ff ff 2c f7 3d
RX: 8e 85034022 85034022 81 20 80 00 00 00 00 a5 06 0c
Бутлоадер проверил чек-суммы, принял прошивку и запустил её – без единого запроса подтверждения от владельца. С той же лёгкостью можно вообще не писать полезную нагрузку, а просто стереть сектора флеша, включая сектор с самим бутлоадером. После такой команды инвертор мёртв необратимо: вернуть его к жизни можно только вскрытием корпуса и перепрошивкой через JTAG заново.
Отдельная команда даёт доступ к Grid Profile – параметрам сети, по которым инвертор определяет, синхронизирован он с электросетью или уже отрезан от неё (Islanding Detection). Тот же трюк: серийник вместо пароля, CRC-16 вместо подписи, никакой аутентификации. Hunz продемонстрировал это, поменяв один бит в профиле:
00 05 20 00 00 00 30 03 02 58 09 e2 07 a3 13 9c
^----- Islanding Detection disabled here (01 -> 00)
С отключённым Islanding Detection инвертор продолжает выдавать напряжение в линию даже тогда, когда сеть обесточена штатно, – ровно та ситуация, в которой электрик на линии рассчитывает на мёртвый провод. А поскольку та же прошивка даёт атакующему произвольный контроль над AC-выходом, ограниченный только физикой самого инвертора и доступной DC-мощностью с панелей, комбинация «снять защиту + разогнать выход» – не гипотетический риск, а прямое описание того, как удалённо довести электронику до перегрева и возгорания. Сам Hunz формулирует это сдержанно, инженерным языком: серьёзный риск поражения током и пожара. Для разгона по кварталу этого более чем достаточно.
Отсутствие криптографии в DTU не новость – реверсеры писали об этом ещё в 2021-м на профильных форумах. Просто вплоть до этого лета общее мнение было: раз устройство не передаёт данные без входящего запроса на свой серийник, риск теоретический. Broadcast-команда Search ID и секретный ESB-адрес ломают именно это допущение – теперь достаточно проехать по улице.
Hunz уведомил Hoymiles, немецкий CERT-Bund и Bundesnetzagentur ещё в марте. Ответа не было, пока к делу не подключился BSI через китайский CNCERT, – только тогда, в конце июня, вендор пообещал прошивку с усиленным шифрованием к середине октября. CVE на момент публикации не присвоен. Chaos Computer Club высказался без обиняков: устройство, принимающее прошивку по радио без аутентификации, не должно получать доступ на рынок ЕС.
Здесь любопытна не сама дыра – дырявые радиопротоколы в IoT давно никого не удивляют, – а то, чем её взломали. Комьюнити OpenDTU и AhoyDTU реверсило DTU не из хакерского азарта, а чтобы просто не платить Hoymiles за доступ к собственной же электростанции. Именно эта открытая, добытая энтузиастами документация протокола и стала картой для Hunz. Decentralized-энергетика в теории должна снижать зависимость от единой точки отказа – но пока производитель проектирует протокол в расчёте на то, что его никто не станет слушать, точкой отказа становится сам эфир. А слушать его можно с обочины, за несколько евро, без единого разрешения от кого бы то ни было.
Автор: hacker@shifry.local