
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 в этот ключ, чтобы программа могла загрузить зашифрованную модель. Любой другой ключ приведет к ошибке.
Запустите полученный однофайловый бинарник. Интерфейс должен вести себя так же, как и раньше.