Нейронные сети помогают нам решать различные задачи в сфере AI и компьютерного зрения. Например, детектирование, классификация, сегментация, распознавание объектов и многие другие. Во многих случаях используются готовые предобученные модели, которые дообучаются по собственным данным разработчика для получения готового отраслевого решения. В этом случае ценность представляет как сам датасет (набор размеченных данных для дообучения), так и полученная модель. Если модель эксплуатируется у Заказчика, распространяется по лицензионной схеме и обладает достаточными для рынка показатеями точности, то она сама по себе представляет ценность, так как может быть скопирована и запущена в рамках сторонних решений. Одной из задач, которая встает на этапе деплоймента готовых решений на базе нейронных сетей – это защита разработанных и предобученных моделей от несанкционированного использования с интеграцией системы лицензирования и лимитированием сроков в варианте срочных лицензий. Защита нейронной сети может быть физическая и юридическая. Юридическая защита обычно заключается в использовании «водяных знаков», и поможет доказать, что нейронная сеть используется не законно. Физическая защита сводится к блокировке защищенной модели. В данной статье мы рассмотрим физическую защиту на основе ключей SenseLock и фреймворка Intel OpenVINO. Мы в своих решениях используем оптимизацию моделей и инференс (исполнение моделей) в фреймворке Intel OpenVINO. Это позволяет оптимизировать скорость исполнения нейронных сетей на всей линейке устройств Intel начиная от CPU, встроенной графики iGPU и заканчивая ускорителями VPU на базе Intel Movidius (MyriadX). Фреймворк предлагает нам следующую концепцию реализации защиты: Модель шифруется при оптимизации, но в процессе исполнения дешифруется, и в рамках 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 можно обезопасить себя одним из двух способов: Использовать API, которое предоставляется производителем, и перенести ключевую логику работы на ключ. Воспользоваться программой Virbox Protector. Она анализирует выполняемый файл и предоставляет выбор доступных функций, которые можно защитить разными методами (Obfuscation, Virtualization, Snippet, Encryption). Естественно, использование множества защищённых функций может привести к снижению производительности программы, но при грамотном подходе это будут незначительные потери. Также в  Virbox Protector присутствует функция анти-дебаггера, предотвращающая отладку зашифрованной программы, а также дополнительная программа DS Protector, нацеленная на защиту файлов с данными (в нашем случае, модель нейронной сети) с используемой зашифрованной программой. В нашем случае мы использовали Virbox Protector с DS Protector. Программы позволяют не тратить силы на разработку и внедрение собственных алгоритмов шифрования и защиты ПО. Так выглядит защита программ c помощью Virbox Protector: Также с ключами предоставляется удобный контроль программы, а с помощью приложения производителя вы можете настраивать срок действия ключа и количество запусков программы. Ниже интерфейса утилиты: При помощи VirboxProtector мы зашифровали полученный монолит, перенеся часть функций на ключ, и решили сразу несколько задач: Отсутствие доступа злоумышленника к модели Отсутствие возможности подмены динамически подгружаемых модулей OpenSource решения, исходные коды которых общедоступны Готовую систему лицензирования с проверкой наличия ключа и возможность прошивки сроков его использования локально или удаленно Переносимость решения между любыми исполнительными устройствами с жесткой привязкой к выдаваемому аппаратному ключу Простую и понятную систему деплоя без необходимости разворота окружения и зависимых пакетов Стоит отметить, что нет программ или данных, которые невозможно взломать или похитить, но можно создать защиту, стоимость взлома которой, делает неправомерные действия бессмысленными. инженер-программист