Pull to refresh

Защита моделей нейронных сетей при помощи аппаратных ключей SenseLock

Reading time4 min
Views3.2K

Нейронные сети помогают нам решать различные задачи в сфере AI и компьютерного зрения. Например, детектирование, классификация, сегментация, распознавание объектов и многие другие. Во многих случаях используются готовые предобученные модели, которые дообучаются по собственным данным разработчика для получения готового отраслевого решения. В этом случае ценность представляет как сам датасет (набор размеченных данных для дообучения), так и полученная модель. Если модель эксплуатируется у Заказчика, распространяется по лицензионной схеме и обладает достаточными для рынка показатеями точности, то она сама по себе представляет ценность, так как может быть скопирована и запущена в рамках сторонних решений.

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

Защита нейронной сети может быть физическая и юридическая. Юридическая защита обычно заключается в использовании «водяных знаков», и поможет доказать, что нейронная сеть используется не законно. Физическая защита сводится к блокировке защищенной модели. В данной статье мы рассмотрим физическую защиту на основе ключей SenseLock и фреймворка Intel OpenVINO.

Мы в своих решениях используем оптимизацию моделей и инференс (исполнение моделей) в фреймворке Intel OpenVINO. Это позволяет оптимизировать скорость исполнения нейронных сетей на всей линейке устройств Intel начиная от CPU, встроенной графики iGPU и заканчивая ускорителями VPU на базе Intel Movidius (MyriadX).

Фреймворк предлагает нам следующую концепцию реализации защиты:

Рисунок 1. Схема из документации по Intel OpenVINO, https://docs.openvinotoolkit.org/latest/openvino_docs_IE_DG_protecting_model_guide.html
Рисунок 1. Схема из документации по Intel OpenVINO, https://docs.openvinotoolkit.org/latest/openvino_docs_IE_DG_protecting_model_guide.html

Модель шифруется при оптимизации, но в процессе исполнения дешифруется, и в рамках OpenSource фреймворка может быть достаточно просто преобразована недобросовестным пользователем в исходную, доступную к копированию и тиражированию.

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

В качестве ключа мы выбрали решение одного из наших партнеров - SenseLock EL5-STD. Электронные ключи SenseLock серии EL5 построены на высокозащищенной линейке смарт-карт Infenion с процессором ARM SC300.

Основные параметры:

  • 32-битный высокозащищенный чип Infenion, сертифицированный по EAL5+;

  • 512 килобайтами памяти для кода и данных;

  • встроенная система лицензирования и удаленного обновления;

  • система автоматической защиты исполняемых файлов;

  • возможность написания и интеграции любых криптографических алгоритмов;

  • оперативная память 12 кб.

На момент постановки задачи основной исполняемый код траекторного анализа объектов по результатам детекции был реализован на Python. Первая попытка реализации заключалась в шифровании кода Python и модели, предварительно сконвертированной через Intel OpenVINO Optimizer. Попытка провалилась из-за необходимости шифрования не только самого кода, а в том числе  и интерпретатора, что даже удалось, но запуск отдельного инстанса интерпретатора позволял получить доступ к данным и модели уже в расшифрованном виде, в процессе ее исполнения. Были также предприняты попытки использования инструментов pyinstaller, nuitka, однако, Intel OpenVINO toolkit предоставляется в виде множества динамических библиотек, которые можно подменить и результатом получить исходную модель нейронной сети.

Вторым и основным направлением реализации защиты моделей стало партирование кода на C++ с компиляцией всей бизнес-логики, включая части OpenSource Intel OpenVINO toolkit, необходимые для исполнения, в виде единого бинарника, шифруемого аппаратным ключом.

Часть плагинов и библиотек в финальном релизе Intel OpenVINO подгружаются динамически и могут быть подменены злоумышленником для извлечения модели в процессе ее исполнения. Здесь нам очень сильно помог один из пулл-реквестов в основном репозитории, а именно https://github.com/openvinotoolkit/openvino/pull/3219. Его мы взяли в качестве основы для подключения всех динамических плагинов и модулей статически, чтобы скомпилировать продукт как единый бинарник со встроенной бизнес-логикой и шифрованием данных внутри, без возможности динамического изменения библиотек в процессе исполнения.  Итоговое решение представляет собой монолит inference engine OpenVINO для сборки продуктов в моделях stand-alone / portable.

Используя ключи  SenseLock можно обезопасить себя одним из двух способов:

  1. Использовать API, которое предоставляется производителем, и перенести ключевую логику работы на ключ.

  2. Воспользоваться программой Virbox Protector. Она анализирует выполняемый файл и предоставляет выбор доступных функций, которые можно защитить разными методами (Obfuscation, Virtualization, Snippet, Encryption). Естественно, использование множества защищённых функций может привести к снижению производительности программы, но при грамотном подходе это будут незначительные потери. Также в  Virbox Protector присутствует функция анти-дебаггера, предотвращающая отладку зашифрованной программы, а также дополнительная программа DS Protector, нацеленная на защиту файлов с данными (в нашем случае, модель нейронной сети) с используемой зашифрованной программой.

В нашем случае мы использовали Virbox Protector с DS Protector. Программы позволяют не тратить силы на разработку и внедрение собственных алгоритмов шифрования и защиты ПО. Так выглядит защита программ c помощью Virbox Protector:

Рисунок 2. Virbox Protector
Рисунок 2. Virbox Protector

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

Рисунок 3. Virbox Protector
Рисунок 3. Virbox Protector

При помощи VirboxProtector мы зашифровали полученный монолит, перенеся часть функций на ключ, и решили сразу несколько задач:

  1. Отсутствие доступа злоумышленника к модели

  2. Отсутствие возможности подмены динамически подгружаемых модулей OpenSource решения, исходные коды которых общедоступны

  3. Готовую систему лицензирования с проверкой наличия ключа и возможность прошивки сроков его использования локально или удаленно

  4. Переносимость решения между любыми исполнительными устройствами с жесткой привязкой к выдаваемому аппаратному ключу

  5. Простую и понятную систему деплоя без необходимости разворота окружения и зависимых пакетов

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

Tags:
Hubs:
+2
Comments0

Articles