
CAWODOG est un projet de preuve de concept démontrant comment protéger les modèles d'IA basés sur Python déployés sur des machines industrielles hors ligne. À travers trois étapes progressives (0 → 2), le projet montre : * comment une application d'IA Python naïve peut être trivialement rétro-conçue, * comment les attaquants peuvent extraire des modèles à partir de binaires packagés, et * comment durcir un déploiement d'IA en utilisant la conversion ONNX, le chiffrement de modèle et un moteur d'exécution séparé. Le PoC utilise un modèle ludique de détection de chiens (le « Cat World Dominance Group ») pour illustrer des concepts réels de protection de propriété intellectuelle industrielle qui s'appliquent aux systèmes de contrôle pilotés par IA, tels que la plateforme StarX de Starlinger. Il sert d'implémentation de référence pour le livre blanc accompagnant « Hardening Python IP for Offline Industrial AI Deployments. »
CAWODOG (Cat World Dominance Group) est une preuve de concept ludique mais réaliste pour protéger les modèles d'IA basés sur Python déployés sur des machines industrielles hors ligne.
L'idée principale :
Prendre un petit classifieur d'images qui détecte les chiens (l'« ennemi » de CAWODOG), l'envelopper dans une application simple, puis durcir progressivement le déploiement contre le vol de propriété intellectuelle.
La POC est conçue comme un compagnon d'un livre blanc interne sur :
Durcissement de la propriété intellectuelle Python pour les déploiements d'IA industriels hors ligne
Ce dépôt démontre, étape par étape :
.
├── 0/ # Étape 0 – Référence non durcie
│ ├── model/ # Code d'entraînement + inférence
│ ├── app/ # Interface utilisateur web basée sur Gradio
│ ├── requirements.txt
│ └── (optionnel) aides à la construction / exécution
│
├── 1/ # Étape 1 – Empaqueté avec Nuitka (Niveau 1)
│ ├── app/ # Même interface utilisateur, point d'entrée adapté
│ ├── model/ # Même logique de modèle qu'à l'étape 0
│ ├── build.sh # Script de construction onefile Nuitka
│ └── requirements.txt
│
├── 2/ # Étape 2 – Modèle ONNX chiffré (Niveau 2)
│ ├── model/ # Entraînement + export ONNX + chiffrement
│ ├── engine/ # Module moteur (déchiffrement + runtime ONNX + scoring)
│ ├── app/ # Interface utilisateur appelant uniquement le moteur
│ ├── hardening/ # Clé de chiffrement + utilitaires (développement uniquement)
│ ├── build.sh # Script de construction onefile Nuitka
│ └── requirements.txt
│
└── attacker/ # Outillage attaquant (optionnel, pour démonstration)
├── run_and_extract.sh # Trouve le répertoire temporaire de Nuitka et liste le contenu
├── steal_model.sh # Copie le fichier modèle à partir de la charge utile extraite
└── use_stolen_model.py# Utilise le modèle volé dans un script séparé
python -m venv .venv)git, pip, et une familiarité de base avec la ligne de commandeLa plupart des étapes nécessitent :
pip install -r requirements.txt
Dossier : 0/
Objectif : Une application Python simple avec un modèle entraîné et une interface utilisateur web basique. Aucune protection.
dog vs not_dogmodel_training.py) qui :
data/dog et data/not_dog en ensembles d'entraînement/validationmodel/models/dog_model.ptmodel_inference.py) qui :
dog_model.ptapp/gradio_app.py) qui :
Depuis la racine du dépôt :
cd 0
python -m venv .venv
source .venv/bin/activate # sur Windows : .venv\Scripts\activate
pip install -r requirements.txt
Préparer les données :
0/data/
dog/
<images de chien>.jpg
not_dog/
<images non-chien>.jpg
Entraîner le modèle :
python -m model.model_training
Cela créera quelque chose comme :
model/models/dog_model.pt
Exécuter l'application Gradio :
python -m app.gradio_app
Ouvrir l'URL affichée (par défaut http://127.0.0.1:7860) et tester avec des images.
.pt).C'est l'image « avant ».
Dossier : 1/
Objectif : Empaqueter l'application en un seul exécutable en utilisant Nuitka.
Effet de sécurité : Le fait de ressembler à un produit, mais ne protège pas la propriété intellectuelle.
app/main.py ou cawodog_app.py)build.sh) qui :
--standalone et --onefiledog_model.pt)cawodog_step1_nuitka).cd 1
source .venv/bin/activate
./build.sh
Après la construction, vous obtenez quelque chose comme :
./cawodog_step1_nuitka
L'exécution démarrera l'interface utilisateur Gradio comme auparavant, mais maintenant à partir d'un seul exécutable.
attacker/)Le dossier attacker montre comment un attaquant peut :
$TMPDIRdog_model.pt à partir de ce répertoireuse_stolen_model.py pour exécuter des prédictions en dehors de l'applicationPoint clé : Le niveau 1 n'est pas une protection significative. C'est de l'empaquetage, pas de la sécurité.
Dossier : 2/
Objectif : Introduire une véritable protection de la propriété intellectuelle au niveau du modèle.
Effet de sécurité : Les concurrents ne peuvent pas utiliser le modèle en copiant simplement un fichier.
Conversion de format du modèle
dog_model.pt → dog_model.onnx en utilisant l'export ONNX de PyTorch.Chiffrement du modèle
dog_model.onnx avec AES-GCM vers dog_model.enchardening/dev_model.key (à des fins de POC)Abstraction du moteur
Introduire engine/core.py qui :
dog_model.enc à l'exécutionpredict_is_dog() et enemy_score()Interface utilisateur comme orchestrateur
app/gradio_app.py ne voit plus les fichiers modèles bruts ni les détails internes.cd 2
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Entraîner (ou réutiliser) le modèle (identique à l'étape 0, mais dans 2/):
python -m model.model_training
Exporter vers ONNX :
python -m model.export_to_onnx
# produit model/models/dog_model.onnx
Chiffrer le modèle ONNX :
python -m hardening.encrypt_model
# produit model/models/dog_model.enc et hardening/dev_model.key
Construire avec Nuitka (via build.sh) :
./build.sh
Une clé sera affichée à la fin. Vous devez définir la variable d'environnement CAWODOG_MODEL_KEY_HEX avec cette clé pour que le programme charge le modèle chiffré. Toute autre clé entraînera une erreur.
Exécuter le binaire onefile résultant. L'interface utilisateur doit se comporter comme avant.
dog_model.enc) est chiffré.dog_model.enc directement dans PyTorchCe n'est toujours pas lié à une racine de confiance matérielle, et un ingénieur inverse expérimenté peut éventuellement reconstruire le modèle, mais la barre est nettement plus haute qu'à l'étape 1.
Cette POC se concentre sur :
Elle ne prétend pas :
Flux narratif typique :
Étape 0 – Référence
Étape 1 – Empaquetage (onefile Nuitka)
attacker/ pour démontrer à quel point le modèle est encore facilement volé.Étape 2 – ONNX chiffré
dog_model.enc n'est plus suffisant.Vous pouvez ensuite discuter des futurs niveaux possibles (non implémentés ici) :
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.