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

0
3121

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

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

Объявленное 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

ВАКАНСИИ

PHP back-end developer
от 1500 USD до 2500 USD
Lead Go developer
Москва, от 230000 RUB до 270000 RUB
IOS developer
Москва, от 150000 RUB до 220000 RUB

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

BUG