«Однажды у нашей старенькой стиралки где-то нарушилась логика, и она решила, что отжим нам не нужен. Вопреки нашим ожиданиям, вместо полусухих вещей мы получили мокрые». 

С этой поломки началось исследование Северина фон Внук-Липински и Хайо Нёренберга, в ходе которого им удалось восстановить работу диагностического протокола стиральной машины Miele, получить доступ к скрытым функциям и извлечь прошивку платы управления.

В этой статье разберем их доклад Hacking Washing Machines с конференции 39C3 и проследим, как мелкая бытовая неисправность привела к полноценному реверсу стиралки, а затем — к созданию свободной утилиты, которая заменяет закрытый фирменный софт для ремонта техники Miele.

Доклад получился объемным, поэтому для удобства читателей мы разделили обзор на две статьи. В этой статье поговорим про опыт исследования техники Miele, а во второй части — про шину D-Bus как универсальную отмычку к экосистеме бренда BSH.

Предостережения на пути исследования бытовой техники

1. Высокое напряжение!

Авторы исследования предупреждают: в подобных устройствах многие цепи находятся под высоким напряжением и зачастую без изоляции.

Иногда встречаются и низковольтные цепи, но даже они могут не иметь гальванической развязки от сети. Поэтому при работе с такой техникой нужно использовать средства изоляции: оптроны, изолирующие трансформаторы. И главное: никогда не подключайте компьютер напрямую к прибору. Это не фигура речи. Можно погибнуть. 

2. Вода, пар и механика

В бытовой технике есть вода. Она нагревается, образует пар, всё это вибрирует, трясется и вращается. Авторы исследования предупреждают: если отключить все биты защиты в прошивке стиральной машины, можно запросто затопить дом. 

Рис. 1. Если после отключения защитных битов открыть крышку машинки, вода предсказуемо хлынет наружу 
Рис. 1. Если после отключения защитных битов открыть крышку машинки, вода предсказуемо хлынет наружу 

3. Техникой пользуется семья

Наконец, третье, самое важное предупреждение: эксперименты с реверс-инжинирингом бытовой техники могут привести к конфликтам в семье. Домочадцы вряд ли разделят ваш исследовательский энтузиазм, узнав, что стиральная машина внезапно «погибла во имя науки». Намного разумнее собрать тестовый стенд из запчастей от устройств, которые уже списаны в утиль. 

Именно так и поступили авторы исследования. Для работы со стиральной машиной они использовали отдельную плату, подключенную к ноутбуку. А для экспериментов с посудомойкой (о них во второй части статьи) полностью вынесли из корпуса электронику и собрали в виде отдельного стенда — «посудомойки в коробке». В этой «коробке» собраны все ключевые электронные компоненты посудомоечной машины: проводка, силовые модули и так далее. 

Рис. 2. Лабораторный стенд: в разобранном виде (слева), в собранном виде — «посудомойка в коробке» (справа)
Рис. 2. Лабораторный стенд: в разобранном виде (слева), в собранном виде — «посудомойка в коробке» (справа)

Реверс-инжиниринг диагностического интерфейса Miele: от оптического порта до дампа прошивки

Итак, предупрежден — значит, вооружен. Теперь можно со спокойной совестью перейти к самому интересному — исследованию техники. Начнем с Miele W 2446 — той самой стиралки, которая неизменно останавливалась перед финальным циклом отжима.

Вскрываем стиралку

Первый шаг в реверсе любой железки — получить доступ ко внутренностям. Тут всё просто: откручиваем два винта, снимаем верхнюю крышку и смотрим, как всё устроено (рис. 3).

Рис. 3. Спереди расположен модуль дисплея, а справа — так называемый силовой модуль. Также внутри много кабелей и механики
Рис. 3. Спереди расположен модуль дисплея, а справа — так называемый силовой модуль. Также внутри много кабелей и механики

Знакомимся с проприетарным миром Miele Diagnostic Utility (MDU)

Так почему же в машинке сбоил отжим? Поискав информацию в сети, исследователи выяснили, что внутри машины есть небольшой датчик уровня воды (рис. 4). Если он дает неверные показания, отжим не запускается.

Рис. 4. Датчик воды в стиральной машине
Рис. 4. Датчик воды в стиральной машине

Теоретически проблему можно было решить калибровкой датчика, но, к сожалению, в этой модели ее нельзя выполнить через встроенное сервисное меню. Для такой калибровки нужна проприетарная программа Miele Diagnostic Utility (сокращенно — MDU). Это ПО доступно только сотрудникам сервисных центров по специальной лицензии от Miele. Тем не менее авторы исследования смогли отыскать на одном из форумов любопытный скриншот, проливающий свет на некоторые возможности программы. 

Рис. 5. Скриншот из Miele Diagnostic Utility с диагностическими данными
Рис. 5. Скриншот из Miele Diagnostic Utility с диагностическими данными

Итак, к стиральной машине подключаются с определенным идентификатором ПО, после чего получают доступ ко множеству диагностических данных. В частности, можно посмотреть  уровень воды, температуру, скорость двигателя, а также их уставки. Оператор видит рабочее состояние машины, состояние реле, настройки программ. Кроме того, он может корректировать встроенные программы стирки и — для рассматриваемого случая самое главное — калибровать внутренние датчики. 

Ищем точку входа: оптический интерфейс

Как же работает MDU? Очевидно, на стиральной машине должен быть какой-то диагностический порт. Однако, как было сказано выше, электроника в такой технике зачастую не имеет гальванической развязки от сети. Miele решило эту проблему через так называемый оптический интерфейс. 

По сути, это двунаправленный оптический порт, и найти его можно не только в стиральных машинах, но и почти во всей технике Miele, выпущенной с 1996 года: в посудомойках, сушилках, плитах, кухонных вытяжках, холодильниках и — вот это сюрприз — даже в винных шкафах. 

На старых устройствах его найти довольно легко — он часто расположен рядом с небольшой маркировкой «PC» (Program Correction — «корректировка программ»). В рассматриваемой модели стиральной машины этот порт расположен на передней панели, рядом с индикатором ошибки подачи воды.

Рис. 6. Оптический интерфейс находится рядом с маркировкой "PC"
Рис. 6. Оптический интерфейс находится рядом с маркировкой "PC"

Что же касается поиска оптического интерфейса на новой технике — дело обстоит несколько сложнее (см. рис. 7).

Рис. 7. Авторы исследования шутят, что поиск оптического интерфейса на современных моделях напоминает нерешаемую капчу
Рис. 7. Авторы исследования шутят, что поиск оптического интерфейса на современных моделях напоминает нерешаемую капчу

Для связи с интерфейсом сервисным инженерам требуется не только специальное ПО, но и специальное оборудование. Оно состоит из интерфейсного блока (подключается к компьютеру через USB) и считывающей головки, которая крепится к передней панели машины с помощью небольшой присоски. Рядом с этой присоской расположен оптический приемопередатчик (рис. 8). 

Рис. 8. Оборудование для тестирования техники Miele, снятое с разных ракурсов
Рис. 8. Оборудование для тестирования техники Miele, снятое с разных ракурсов

В открытом доступе информации об оптическом интерфейсе было крайне мало, поэтому исследователи решили его «взломать». 

Собираем стенд: безопасная плата управления

Чтобы не ставить эксперименты на собственной технике (см. предостережение №3), исследователи решили создать тестовый стенд. Для этого они купили на Ebay плату управления от стиральной машины Miele начала 2000-х годов (рис. 9). После покупки выяснились две приятные особенности платы: 

  • силовая электроника вынесена на отдельный модуль, а значит, с ней довольно безопасно работать; 

  • в силу «древности» этой платы в сети можно было найти техническую документацию, а значит, и некоторые распиновки разъемов. 

    Рис. 9. Плата управления, купленная на Ebay
    Рис. 9. Плата управления, купленная на Ebay

Основные компоненты на этой плате — фирменный микроконтроллер Miele, который, как оказалось, на самом деле произведен Mitsubishi. Набор инструкций микроконтроллера очень похож на набор знаменитого MOS 6502 и его преемника 65c02.

Рис. 10. Фирменный микроконтроллер Miele
Рис. 10. Фирменный микроконтроллер Miele

В обычной ситуации можно было бы просто сделать дамп флеш-памяти и начать реверс с прошивки. Но поскольку этот чип из 1980-х, вместо флеш-памяти в нем используется масочное ПЗУ (mask ROM). Для доступа к такому ПЗУ пришлось бы физически вскрывать чип — а это крайне нежелательный вариант развития событий. Поэтому работу продолжили без доступа к прошивке.

Для этого нужно было опять вернуться к оптическому интерфейсу. На рис. 11 этот интерфейс расположен в правом нижнем углу, рядом с одним из обычных светодиодных индикаторов.

Рис. 11. Система с оптическим интерфейсом и микроконтроллером
Рис. 11. Система с оптическим интерфейсом и микроконтроллером

Этот оптический интерфейс обменивается данными с микроконтроллером по UART, однако сам по себе ничего не передает. Это означает, что по пассивному наблюдению невозможно определить ни скорость передачи данных (baud rate), ни используемый протокол. Более того, исследователи выяснили, что до них эту систему никто не реверсил.

В такой ситуации логично поискать разборы похожих интерфейсов — они могут подсказать общую структуру команд. Дальнейшие поиски привели к, казалось бы, стороннему проекту — Miele@home, официальному решению для удаленного управления техникой. Оно использует коммуникационный модуль, который так же подключается к устройству по UART. Эту систему еще в 2013 году независимо исследовал другой реверс-инженер.

Из этого разбора следовало, что протокол Miele@home использует простые пятибайтовые кадры: байт команды, два байта параметров, длину и контрольную сумму. UART настроен на 2400 бод без контроля четности. Исследователи предположили, что именно этот протокол (или его близкая версия) может использоваться и в диагностическом интерфейсе. Однако попытка отправить такой кадр на плату ответа не дала.

После продолжения экспериментов с настройками UART обнаружилось, что требуется контроль четности. Добавив его, исследователи отправили команду 0x11 и получили от платы ответ с идентификатором ПО. Теперь, когда им была известна общая структура кадров, можно было просто перебрать все доступные команды и посмотреть, на какие из них отреагирует плата.

Первый ключ к разгадке: атака по времени

Итак, исследователи уже выяснили, что команда 0x11 запрашивает идентификатор ПО. Опытным путем они установили, что сразу после нее можно отправить другую команду — 0x20. Это напоминало механизм разблокировки: сначала нужно представиться, чтобы затем получить доступ к расширенным диагностическим функциям. Аналогичная схема используется в автомобильных сервисных протоколах, где для доступа ко всем функциям диагностики нужно ввести ключ безопасности. 

Далее исследователи установили, что в то время как команда 0x20 разблокирует интерфейс, 0x10 его блокирует. Оставалось подобрать корректный набор параметров для разблокировки.

Поскольку доступа к прошивке не было, следующим шагом стала попытка найти побочный канал в самом микроконтроллере. Оказалось, что у микроконтроллера есть несколько дополнительных выводов для так называемого «микропроцессорного режима» с внешней памятью. Эти выводы не задействовались, но оставались активными. Особое внимание привлек вывод SYNC (рис. 12) — на нем устанавливался высокий уровень каждый раз, когда микроконтроллер извлекал инструкцию из внутреннего ПЗУ.

Рис. 12. Красным выделены незадействованные, но активные выводы, один из которых — SYNC
Рис. 12. Красным выделены незадействованные, но активные выводы, один из которых — SYNC

Этот вывод можно было использовать для атаки по времени. Для этого исследователи изучили, как выглядит сигнал на выводе SYNC при отправке корректной и некорректной диагностических команд. Оказалось, что   длительность ответного сигнала на валидную и неизвестную диагностические команды различается (рис. 13).

Рис. 13. Разная длительность ответного сигнала при получении валидной (сверху) и неизвестной (снизу) диагностических команд
Рис. 13. Разная длительность ответного сигнала при получении валидной (сверху) и неизвестной (снизу) диагностических команд

Исследователи предположили, что команда разблокировки в прошивке реализована следующим образом: речь идет о 8-битном микроконтроллере, а значит, два параметра команды проверяются последовательно. Если правильно подобрать первый параметр, время выполнения этой подпрограммы изменяется. Вот эту разницу во времени выполнения и можно измерить, наблюдая за сигналом на выводе SYNC.

Еще одно преимущество этой атаки по времени заключается в том, что для подбора ключа из двух 8-битных параметров требуется не более 512 итераций. Именно это и сделали исследователи: написали небольшой скрипт на Python, который перебирает все возможные значения первого параметра. 

fn cmd_unlock(param1: u8, param2: u8) {
    if param1 != SECRET_KEY1 {
        return;
    }

    if param2 != SECRET_KEY2 {
        return;
    }

    unlock_interface();
}

Как видно из рис. 14, ответный сигнал для 0x20 на выводе SYNC почти во всех случаях идентичен, и только в одном случае оказывается немного длиннее. Это и есть искомое значение параметра — 0xee.

Рис. 14. Только при значении 0xee ответный сигнал длиннее 
Рис. 14. Только при значении 0xee ответный сигнал длиннее 

Исследователи подставили 0x20ee и повторили ту же процедуру для второго параметра — им стал 0xeeb4 (рис.15). Таким образом, они получили искомую последовательность параметров для разблокировки диагностического интерфейса, для удобства назвав ее «диагностическим ключом».  

Рис. 15. Повторная процедура дает параметр 0xb4
Рис. 15. Повторная процедура дает параметр 0xb4

Получение полного доступа: чтение памяти, обход второго уровня защиты, сборка адаптера

Разблокировав интерфейс, исследователи получили доступ к двум новым командам: 0x31 используется для чтения из EEPROM, 0x30 — для чтения из памяти.  Обе принимают 16-битный адрес. Оказалось, что команда чтения памяти дает доступ не только к ОЗУ, но и масочному ПЗУ, а значит, можно полностью считать прошивку с устройства. 

Сказано — сделано: после подключения адаптера USB-UART его светодиоды весело замигали (рис. 16). Примерно через 30 минут исследователи завершили извлечение всей прошивки. 

Рис. 16. При подключении адаптера USB-UART его светодиоды начинают весело мигать
Рис. 16. При подключении адаптера USB-UART его светодиоды начинают весело мигать

Теперь, имея на руках прошивку, можно изучить полный набор диагностических команд. Оказывается, в нем есть не один, а целых два уровня безопасности. Второй уровень можно разблокировать другой командой и с другим ключом (см. рис. 17). Оттуда открывается доступ к новому набору команд, которые можно использовать, например, для записи в память или EEPROM. Исследователям удалось выполнять произвольные подпрограммы, зацикливать работу устройства командой halt и увеличивать скорость передачи данных. По сути, этот интерфейс предоставил им полноценные возможности для отладки.

Рис. 17. Уровни диагностических команд и безопасности
Рис. 17. Уровни диагностических команд и безопасности

Опробовав этот метод на пробной плате, исследователи решили посмотреть, как алгоритм сработает на реальной бытовой технике. Для этого им понадобился оптический адаптер связи. Собирается он легко, потребовались: 

  • контроллер ESP32-С6;

  • оптический трансивер OSRAM SFH 7250;

  • 2 резистора, соединенные по схеме на рис. 18. 

Рис. 18. Схема соединения резисторов
Рис. 18. Схема соединения резисторов

В итоге получился вот такой адаптер стоимостью менее 10 евро (рис. 19). Исследователи сразу подключили его к стиральной машине — той самой, которая отказывалась запускать отжим. 

Рис. 19. Самодельный оптический адаптер связи
Рис. 19. Самодельный оптический адаптер связи

Первым делом требовалось найти диагностические ключи для этого устройства, поскольку для каждой модели они свои. Однако исследователи уже знали протокол и простым перебором примерно за 30 минут нашли оба ключа. Далее они попробовали извлечь прошивку, но потерпели неудачу — процесс чтения неизменно прерывался на одном и том же адресе. Видимо, именно с этого адреса и начинается область памяти с прошивкой. Это означало, что в системе реализована защита от чтения ROM.

Обход защиты от чтения ROM

Обойти эту защиту оказалось несложно. Диагностический протокол предоставляет доступ к памяти на чтение, запись и исполнение, а значит, можно записать и выполнить собственную подпрограмму дампа.

Алгоритм выглядел так.

  1. Остановить выполнение основной прошивки.

  2. Записать подпрограмму в неиспользуемую область RAM.

  3. Передать ей управление.

  4. Подпрограмма последовательно проходит по памяти и передает ее содержимое через UART.

  5. UART подключен к оптическому интерфейсу => получаем полный дамп прошивки.

dump:
bbc 0,SIO1STS,dump
lda [ADDR],y
sta TB
inc ADDR
bne dump
lda ADDR+1
cmp END
beq done
inc ADDR+1
bra dump
done:
rts

После получения дампа стало возможным посмотреть, как именно реализована защита от чтения.

Она оказалась достаточно простой: при обработке команды чтения прошивка проверяет адрес. Однако перед этой проверкой анализируется специальный флаг PROTECTION_DISABLED

check_mem_read:
lda PROTECTION_DISABLED
bbs 0,a,done
lda ADDR+1
cmp #0x50
bcc done
ldm #0x00,LEN
done:
rts

Если установлен нулевой бит переменной PROTECTION_DISABLED, проверка диапазона пропускается. В противном случае чтение из защищенной области блокируется.

Таким образом, защита отключается установкой соответствующего бита. После этого память можно считывать обычной диагностической командой.

Интеграция в «умный дом»

Исследователи решили превратить результаты своего реверса в открытый диагностический инструмент для бытовой техники Miele под названием FreeMDU. По сути, FreeMDU — это набор из нескольких утилит: 

  • библиотека для работы с протоколом, 

  • приложение с терминальным интерфейсом, 

  • несколько экспериментальных наработок для интеграции техники Miele в систему «умного дома». 

Библиотека FreeMDU представляет собой простую реализацию диагностического протокола с удобными «обертками» для разных моделей стиральных машин. 

Чтобы считывать диагностические параметры — текущую фазу программы, уровень воды, температуру и прочее  — нужна карта памяти. Она необходима, чтобы знать, по каким адресам хранятся эти данные (см. рис. 20), ведь их расположение отличается у разных моделей устройств Miele. 

Рис. 20. Карта памяти: в разных моделях Miele одни и те же параметры хранятся по разным адресам
Рис. 20. Карта памяти: в разных моделях Miele одни и те же параметры хранятся по разным адресам

Используя вышеупомянутую библиотеку, можно создать простое терминальное приложение (см. рис. 21). Оно кросс-платформенное и предоставляет почти те же возможности, что и официальное ПО Miele Diagnostic Utility: можно просматривать состояние датчиков, информацию о сбоях, режим работы, а также инициировать различные действия на устройстве.

Рис. 21. Простое самописное терминальное приложение с возможностями официального Miele Diagnostic Utility
Рис. 21. Простое самописное терминальное приложение с возможностями официального Miele Diagnostic Utility

Исследователи также написали экспериментальную и простую в использовании интеграцию с системой умного дома на базе контроллера ESP32. Она практически не требует настройки, поскольку поддерживает протокол Home Assistant Discovery Protocol, для автоматического обнаружения устройств, как следует из его названия. Ее можно легко интегрировать свою стиральную или посудомоечную машину в систему Home Assistant, после чего получить доступ ко всем рабочим параметрам устройства и запускать различные действия, например, программы стирки (рис. 22). 

Рис. 22. Интеграция стиральной машины в систему Home Assistant
Рис. 22. Интеграция стиральной машины в систему Home Assistant

Подводя итог, стоит отметить, что в современных моделях ситуация стала немного сложнее. По словам авторов исследования, эти устройства, несмотря на тот же самый оптический интерфейс, используют другой (по всей видимости, обновленный) диагностический протокол. В этом протоколе применяется аутентификация «запрос-ответ» с операцией XOR и одинаковым для всей техники Miele статическим ключом.

Корректировку программ исследователи еще не реализовали, но продолжают вести работу в этом направлении. В частности, в устройствах Miele есть таблица с температурными режимами для конкретных программ, которая «зашита» в прошивку. Авторы исследования предполагают, что заданное значение в системе контроля температуры можно изменить, чтобы машина нагревала воду, скажем, до 120 градусов. А вот откалибровать проблемный датчик уровня воды, с которого всё начиналось, у них пока не вышло.

На этом первую часть исследования можно считать завершенной. Во второй части — посудомойка фирмы BSH и эксперимент, который юристы обоих брендов точно бы не одобрили.


PURP — Telegram-канал, где кибербезопасность раскрывается с обеих сторон баррикад

t.me/purp_sec — инсайды и инсайты из мира этичного хакинга и бизнес-ориентированной защиты от специалистов Бастиона

Комментарии (25)