0
2496

Погружаемся в реверс-инжиниринг инсулиновой помпы

Реверс-инжиниринг привлекает любителей исследований. Окунитесь в детали разработки связи с инсулиновой помпой и узнайте о сложностях процесса.

Что побудило начать реверс-инжиниринг

Объявленное 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 приёмник для прослушивания и расшифровки пакетов.

Расшифровка пакетов

Изучение изменения битов между ПОДами и командами помогло представить структуру пакета:

реверс-инжиниринг

CRC8

Радиопередача сопровождается помехами, и тогда приёмник получает 1 при отправке 0, и наоборот. Для фиксации этого факта протоколы используют нахождение контрольной суммы – CRC. При несовпадении CRC приёмника и передатчика первый выкидывает пакет и ожидает повторения передачи.

Протокол Omnipod пользовался стандартным 8-битовым CRC. Поэтому подумали, разгадка сообщений близко. И не подозревали...

Сообщения, CRC16

Чересчур большие сообщения не помещаются в один пакет и отправляются в виде нескольких пакетов. Когда собрали форматы сообщений, в конце обнаружили дополнительные биты, напоминающие 16-битовый CRC. Однако непонятный: без заполнения 5 из 16 битов. Расшифровка пока не удавалась.

После месяцев попыток, зимой 2016 года, @lorelai рассказала о начале преобразования инструкций чипа блока управления в доступный разработчику код с переменными и именами функций.

Одна неназванная подпрограмма выглядела как обыкновенная реализация табличного нахождения CRC. А таблица содержала значения для классического 16-битового CRC. Чтобы сравнить, разработчик реализовал вычисление с использованием таблицы:

while (len--) {
  crc = (crc << 8) ^ crctable[((crc >> 8) ^ *c++)];
}

У них оказалось иначе:

while (len--) {
  crc = (crc >> 8) ^ crctable[((crc >> 8) ^ *c++)];
}

Найдёте отличие? Вместо оператора побитового сдвига влево – сдвиг вправо. И это неправильно.

Далее началась работа над расшифровкой сообщений, сохранением сессий из блока управления для доставки болюсов, приостановками и другим.

Однократно используемое число

Команды доставки инсулина начинались с 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, следовательно требовала переработки. Благодаря Полу Форджоне, новый знак ПОДа отображает уровень ёмкости.

Погружаемся в реверс-инжиниринг инсулиновой помпы

А вы применяли реверс-инжиниринг?

Если только планируете попробовать, смотрите подборку книг по теме.

Комментарии 0

BUG