Реверс-инжиниринг привлекает любителей исследований. Окунитесь в детали разработки связи с инсулиновой помпой и узнайте о сложностях процесса.
Что побудило начать реверс-инжиниринг
Объявленное 3 года назад вознаграждение побудило разработчика взяться за реверс-инжиниринг связи с инсулиновой помпой. К тому же его дочь использовала систему Loop с помпой Medtronic, в обратной разработке которой он участвовал. Однако помпа Medtronic требовала отключения при занятиях спортом. Бескамерность помпы Omnipod подкупала, инструменты готовы, поэтому реверс-инжиниринг начался.
Реверс-инжиниринг и первые шаги
Система Omnipod включает маленькую одноразовую помпу – ПОД, и блок управления – PDM.
Так как PDM контролирует ПОД через беспроводное соединение по радио частоте, появилась идея полного объединения с Loop с помощью одного RileyLink либо модификации.
Программно определяемая радиосистема
ПОР – средство, которое визуализирует радиоволны.
Для поиска сообщений с требуемого девайса, воспользуемся информацией RBV-019. Он работает в диапазоне 433 МГц. Настраиваем программу ПОР на прослушивание в этом диапазоне, и когда PDM выдаёт статус, получаем сообщения:
Обнаруженные яркие полосы говорят о частотной манипуляции. Значит, частота сигнала зависит от информации, которая передаётся. 1 бит соответствует высокой частоте (верхняя полоса), для 0 бит частота ниже (нижняя полоса). Инструмент inspectrum помогает чётко показать 1 и 0. Многократное увеличение изображения первого сообщения выглядит так:
Разработчик написал скрипт на Python, чтобы извлечь эти биты и рассматривать как полный пакет.
Повторение шаблона оказалось частью преамбулы. Для экономии энергии приёмники переходят в спящий режим, откуда время от времени выходят для проверки сигнала. После получения преамбулы приёмник бодрствует в ожидании реальных данных.
Невозможно передавать информацию по радио, как первоначальные биты, поскольку приёмник применяет переходы, чтобы синхронизировать время ожидания следующего бита. При длинном наборе 1 или 0 синхронизация нарушается. Таким образом, радиосвязь использует кодирование, чтобы удостовериться в достаточном числе переходов. Omnipod использует манчестерское кодирование. Каждый бит шифруется двумя битами. 1 бит – как 10, а 0 бит – как 01.
В итоге Evariste Courjaud написал rtlomni, который использует RTL-SDR приёмник для прослушивания и расшифровки пакетов.
Расшифровка пакетов
Изучение изменения битов между ПОДами и командами помогло представить структуру пакета:
Радиопередача сопровождается помехами, и тогда приёмник получает 1 при отправке 0, и наоборот. Для фиксации этого факта протоколы используют нахождение контрольной суммы – CRC. При несовпадении CRC приёмника и передатчика первый выкидывает пакет и ожидает повторения передачи.
Протокол Omnipod пользовался стандартным 8-битовым CRC. Поэтому подумали, разгадка сообщений близко. И не подозревали.
Сообщения, CRC16
Чересчур большие сообщения не помещаются в один пакет и отправляются в виде нескольких пакетов. Когда собрали форматы сообщений, в конце обнаружили дополнительные биты, напоминающие 16-битовый CRC. Однако непонятный: без заполнения 5 из 16 битов. Расшифровка пока не удавалась.
После месяцев попыток, зимой 2016 года, @lorelai рассказала о начале преобразования инструкций чипа блока управления в доступный разработчику код с переменными и именами функций.
Одна неназванная подпрограмма выглядела как обыкновенная реализация табличного нахождения CRC. А таблица содержала значения для классического 16-битового CRC. Чтобы сравнить, разработчик реализовал вычисление с использованием таблицы:
У них оказалось иначе:
Найдёте отличие? Вместо оператора побитового сдвига влево – сдвиг вправо. И это неправильно.
Далее началась работа над расшифровкой сообщений, сохранением сессий из блока управления для доставки болюсов, приостановками и другим.
Однократно используемое число
Команды доставки инсулина начинались с 4-байтового блока данных, похожего на криптографию. Снова, в ходе бесконечных интерпретаций блока выяснилось, что это не CRC. Временами паттерн повторялся. Похоже на часть протокола для предупреждения повторного воспроизведения данных – однократно используемое число.
Последовала мысль создать базу данных сообщений для повтора этих команд. Даже при разнице адресов ПОДов теперь к копии увиденной раньше команды добавляется новый адрес и пересчитывается CRC. Но однократно используемое число мешало использовать эту стратегию. Для следующей команды поставки инсулина, независимо от того, какая команда отправлена, ПОД требовал лишь следующее число в последовательности. Никто не мог его сгенерировать.
Стоп! Можно же посмотреть в декомпилированной прошивке блока управления! При изучении прошивки блока управления отследили создание сообщений в коде и дошли до этих четырёх байтов. Однако получили не способ вычисления криптографического однократно используемого числа, а четыре знака «INS.». Это ещё что? Ладно, обновим эту часть позднее в конвейере.
На блоке управления располагался ещё один чип с номером SC9S08ER48. Увы, без документации и заблокированный, что не позволило сбросить прошивку.
Реверс-инжиниринг снова заходил в тупик.
Рентгеновские изображения
Чтобы разузнать больше о ER48, решили получить рентгеновские изображения, но это не привело к открытиям.
Общее рентгеновское изображение Детальное рентгеновское изображение
Реверс-инжиниринг в деле: вскрытие и визуализация
Разработчики обратились за помощью к исследователю доктору Сергею Скоробогатову из Университета Кембриджа в Великобритании. Джо Моран договорился с компанией Nanolab Technologies, специализирующейся в области вскрытия и визуализации чипов и помог финансами.
С помощью методов визуализации доктор Скоробогатов определял, можно ли снять защиту с помощью неинвазивных или полуинвазивных методов. Получил массу снимков. Это изображения кремниевой микросхемы с оптического микроскопа.
Вдобавок получены изображения областей микросхемы с помощью сканирующей электронной микроскопии.
Ячейки флэш-памяти под растровым электронным микроскопом. Не информативные данные.
К сожалению, изображения не позволили определить содержание флэш-памяти.
У доктора Скоробогатова оставался только запатентованный метод, для использования которого требовалось разрешение университета.
Далее фонд Nightscout заключил договор о неразглашении и поручился за предотвращение неразрешённого открытия методов и результатов.
В итоге получили невероятную работу доктора Сергея Скоробогатова и необработанные данные прошивки. Первоначальное извлечение прошивки содержало массу ошибок, и никто не справился с расшифровкой процессорных инструкций.
Дизассемлирование инструкции SC908
В июле доктор Скоробогатов извлёк прошивку повторно, сократив число ошибок. В конечном итоге Джо Моран и Кен Ширифф нашли функцию, отвечающую за вычисление однократно используемого числа, в сентябре 2017 года.
RileyLink и Loop
Когда разобрались с коммуникациями и обновили python сценарии openomni, настало время взяться за RileyLink + iOS. По этой причине началась работа с OmniKit и обновлением прошивки для RileyLink.
Стояла задача разработать новую прошивку для обработки модуляции и кодирования ПОДа. И переписать способ общения двух чипов, чтобы обрабатывать 0, поскольку 0 – специфическая метка окончания пакета Medtronic. Loop требовал переработки для поддержки нескольких помп и создания новых интерфейсов для соединения, отключения и управления ошибками. Спасибо Нейту Раклиефу за надёжное основание в Loop.
Тем временем осмысление формата команд продолжалось. Работа подробно документирована в openomni wiki. Джо, Эварист и Элке Джагер помногу декодировали сообщения и обновляли страницы.
Декодирование сопровождалось маленькими победами. В апреле 2018 года произошло соединение ПОДа с iPhone + RL, наполнение, введение канюли, настройка базального режима и болюса.
Прошивку 2.0 RL подготовили к июлю 2018 года, и партии товара обновились. Надеялись на использование этих плат с Loop и Omnipod, но антенна на 915 МГц не подходила для передачи в диапазоне 433 МГц.
Звуковой сигнал
Дальше разработчик подключил устройство к Loop и пробовал настроить автоматическую доставку временных базальных доз. В этот момент ПОД часто издавал звуковой сигнал, означающий появление проблемы и прекращение доставки инсулина.
Задача представлялась разрешимой, потому что находили небольшую разницу между отправкой данных с Loop и вручную с блока управления. Предполагали, что исправления остановят звуковой сигнал.
Использование результатов реверс-инжиниринга
3 октября 2018 года Джо прикрепил на себя контролируемый Loop ПОД и стал первым испытателем Loop Omnipod.
Через месяц, на ноябрьском хакатоне Nightscout 2018 года, нашлись и другие желающие попробовать устройство. Частная группа по тестированию включала больше 30 человек до обнародования.
К сожалению, ПОДы издавали звуковые сигналы ещё до окончания полных 3 дней применения. Шло скрупулёзное сравнение команд Loop с эталонными командами PDM. Боялись, что повышенная нагрузка на батарею из-за соединения каждые пять минут выведут ПОД из строя.
Разработчик провёл измерения напряжения ПОДа с использованием arduino, записал данные и сохранил в базе для отображения. Сравнение PDM и Loop.
Долговременная шкала напряжения пода
Увы, реверс-инжиниринг снова в тупике: с помощью блока управления и больших болюсов опускали напряжение ПОДа ниже показателей службы ПОДа с Loop, но звуковой сигнал не раздавался. Значит проблема не в напряжении, а в другом.
RileyLinks с антеннами 955 МГц (слева) и катушкой 433 МГц (справа)
Обнаружили, что при неудачном завершении обмена сообщениями ПОД иногда продолжал бесконечно отправлять пакеты. В логах также фиксировалось сбои, и поэтому начали эксперименты с антеннами. Обе эти проблемы решаются улучшением связи. Решили испытывать различные антенны и приобретали повсюду в сети. Однако по началу пробы откладывались.
Затем исследователь прикреплял пару гибких антенн с частотой 433 МГц к внутренней части блока RL. В одних сценариях они оправдывают себя, а здесь казались слишком ненадёжными. Антенна с катушкой показала производительность и в неожиданных диапазонах. Настала пора нового блока RileyLink.
Благодаря новой антенне и некоторым улучшениям, которые сократили количество обменов сообщениями и в то же время разрешали регулировку каждые 5 минут, частота появления звукового сигнала снизилась. Соизмеримо с применением ПОДа с блоком управления. За 7500 часов тестирования в реальном времени 94 % ПОДов работали без ошибок.
Тестирование и документация
Медленный рост группы тестирования вносил изменения в представление о системе и помогал осознать, какие части сбивают с толку. Эти тестировщики смирились с вопящими ПОДами и поучаствовали в улучшении работы Loop с Omnipod. В первую очередь, они делились отчётами о каждом ПОДе, удачном или нет.
Отчёты содержали журнал сообщений, который анализировали с помощью созданного инструмента. Это давало представление о наличии неверных отформатированных команд и помогало собирать статистику по конкретным частям взаимосвязи Loop с ПОДами.
Марион Баркер примкнула к тестировщикам и создала специальные отчёты и дополнительную статистику о ходе испытания. Благодаря её статистике успехов и неудач ПОДов, посмотрели на состояние тестирования с высокого уровня.
В итоге Кэти ДиСимоне вошла в группу тестировщиков и реструктурировала loopdocs.org, чтобы предоставить документацию для использования Loop с несколькими устройствами. Ажиотаж вокруг новой версии Loop для связи с Omnipod нарастал, и без подробной документации одни и те же вопросы появлялись бы без конца.
Что нового привнёс реверс-инжиниринг в Loop
Интегрирование Omnipod предполагало пересмотр части интерфейса и создание новых средств контроля. ПОД не показывает заряд батареи, ведь пользователь ничего не поделает с понижением заряда, если такое случится. Поэтому в виджете уровня заряда батареи нет надобности. К тому же, на помпе нет пользовательского интерфейса, а значит нужна функция срочной отмены болюса. Иконка ёмкости выглядела, как ёмкость Medtronic, следовательно требовала переработки. Благодаря Полу Форджоне, новый знак ПОДа отображает уровень ёмкости.