
CAWODOG — это проект proof-of-concept, демонстрирующий, как защитить модели ИИ на Python, развёрнутые на офлайн-промышленных машинах. На трёх последовательных этапах (0 → 2) проект показывает: * как наивное Python-приложение с ИИ может быть тривиально подвергнуто обратной разработке, * как злоумышленники могут извлечь модели из упакованных бинарных файлов, * как усилить защиту развёртывания ИИ с помощью конвертации в ONNX, шифрования модели и отдельного движка выполнения. PoC использует игривую модель детектора собак («Группа господства кошачьего мира») для иллюстрации реальных концепций защиты интеллектуальной собственности, применимых к системам управления на базе ИИ, таким как платформа StarX от компании Starlinger. Он служит эталонной реализацией для сопровождающего технического документа «Hardening Python IP for Offline Industrial AI Deployments».
CAWODOG (Cat World Dominance Group) — это игровая, но реалистичная демонстрация концепции защиты моделей AI на Python, развертываемых на офлайн промышленных машинах.
Основная идея: взять небольшой классификатор изображений, распознающий собак («врага» CAWODOG), обернуть его в простое приложение, а затем постепенно укреплять развертывание против кражи ИС.
Данный PoC создан как дополнение к внутреннему техническому документу на тему:
Укрепление защиты интеллектуальной собственности на Python для офлайн промышленных развертываний AI
Этот репозиторий демонстрирует пошагово:
.
├── 0/ # Шаг 0 – Незащищенная базовая версия
│ ├── model/ # Код обучения и инференса
│ ├── app/ # Веб-интерфейс на Gradio
│ ├── requirements.txt
│ └── (optional) build / run helpers
│
├── 1/ # Шаг 1 – Упаковано с Nuitka (Уровень 1)
│ ├── app/ # Тот же UI, адаптированная точка входа
│ ├── model/ # Та же логика модели, что и на шаге 0
│ ├── build.sh # Скрипт сборки Nuitka onefile
│ └── requirements.txt
│
├── 2/ # Шаг 2 – Зашифрованная модель ONNX (Уровень 2)
│ ├── model/ # Обучение + экспорт в ONNX + шифрование
│ ├── engine/ # Модуль движка (расшифровка + среда выполнения ONNX + оценка)
│ ├── app/ # UI, вызывающий только движок
│ ├── hardening/ # Ключ шифрования + утилиты (только для разработки)
│ ├── build.sh # Скрипт сборки Nuitka onefile
│ └── requirements.txt
│
└── attacker/ # Инструменты атакующего (опционально, для демонстрации)
├── run_and_extract.sh # Находит временную папку Nuitka и выводит содержимое
├── steal_model.sh # Копирует файл модели из извлеченной полезной нагрузки
└── use_stolen_model.py# Использует украденную модель в отдельном скрипте
python -m venv .venv)git, pip и базовыми командами командной строкиБольшинство шагов требуют:
pip install -r requirements.txt
Папка: 0/
Цель: Простое Python-приложение с обученной моделью и простым веб-интерфейсом. Без защиты.
dog против not_dogmodel_training.py), который:
data/dog и data/not_dog на обучающую и проверочную выборкиmodel/models/dog_model.ptmodel_inference.py), который:
dog_model.ptapp/gradio_app.py), которое:
Из корня репозитория:
cd 0
python -m venv .venv
source .venv/bin/activate # on Windows: .venv\Scripts\activate
pip install -r requirements.txt
Подготовьте данные:
0/data/
dog/
<dog images>.jpg
not_dog/
<non-dog images>.jpg
Обучите модель:
python -m model.model_training
Это создаст что-то вроде:
model/models/dog_model.pt
Запустите приложение Gradio:
python -m app.gradio_app
Откройте напечатанный URL (по умолчанию http://127.0.0.1:7860) и протестируйте с изображениями.
.pt).Это картина «до».
Папка: 1/
Цель: Упаковать приложение в один исполняемый файл с помощью Nuitka.
Эффект безопасности: Заставляет приложение выглядеть как продукт, но не защищает ИС.
app/main.py или cawodog_app.py)build.sh), который:
--standalone и --onefiledog_model.pt)cawodog_step1_nuitka).cd 1
source .venv/bin/activate
./build.sh
После сборки вы получите что-то вроде:
./cawodog_step1_nuitka
Запуск запустит интерфейс Gradio, как и раньше, но теперь из одного исполняемого файла.
attacker/)Папка attacker показывает, как атакующий может:
$TMPDIRdog_model.pt из этого каталогаuse_stolen_model.py для выполнения предсказаний вне приложенияКлючевой вывод: Уровень 1 — не значимая защита. Это упаковка, а не безопасность.
Папка: 2/
Цель: Ввести реальную защиту ИС на уровне модели.
Эффект безопасности: Конкуренты не смогут использовать модель, просто скопировав файл.
dog_model.pt → dog_model.onnx с помощью экспорта PyTorch в ONNX.dog_model.onnx с помощью AES-GCM в dog_model.enchardening/dev_model.key (для целей PoC)engine/core.py, который:
dog_model.enc во время выполненияpredict_is_dog() и enemy_score()app/gradio_app.py больше не видит сырые файлы модели или внутренности.cd 2
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Обучите (или повторно используйте) модель (так же, как на шаге 0, но внутри 2/):
python -m model.model_training
Экспортируйте в ONNX:
python -m model.export_to_onnx
# produces model/models/dog_model.onnx
Зашифруйте модель ONNX:
python -m hardening.encrypt_model
# produces model/models/dog_model.enc and hardening/dev_model.key
Соберите с Nuitka (через build.sh):
./build.sh
Ключ будет напечатан по завершении. Вам нужно установить переменную окружения CAWODOG_MODEL_KEY_HEX в этот ключ, чтобы программа могла загрузить зашифрованную модель. Любой другой ключ приведет к ошибке.
Запустите полученный однофайловый бинарник. Интерфейс должен вести себя так же, как и раньше.
dog_model.enc) зашифрован.dog_model.enc напрямую в PyTorchОн всё ещё не привязан к аппаратному корню доверия, и квалифицированный реверс-инженер может в конечном итоге восстановить модель, но планка значительно выше, чем на шаге 1.
Этот PoC фокусируется на:
Он не претендует на:
Типичный порядок повествования:
attacker/, чтобы продемонстрировать, как легко модель всё ещё можно украсть.dog_model.enc больше не достаточно.Затем можно обсудить дальнейшие будущие уровни (здесь пока не реализованы):
MIT License
Copyright (c) 2025 Daniel Eder
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.