
CAWODOG ist ein Proof-of-Concept-Projekt, das zeigt, wie Python-basierte KI-Modelle geschützt werden können, die auf Offline-Industriemaschinen eingesetzt werden. In drei aufeinander aufbauenden Schritten (0 → 2) zeigt das Projekt: * wie eine naive Python-KI-Anwendung trivial rückentwickelt werden kann, * wie Angreifer Modelle aus verpackten Binärdateien extrahieren können, und * wie eine KI-Bereitstellung mithilfe von ONNX-Konvertierung, Modellverschlüsselung und einer separaten Laufzeit-Engine abgesichert werden kann. Das PoC verwendet ein spielerisches Hundedetektor-Modell (die „Cat World Dominance Group“), um reale Konzepte zum Schutz von Industrie-IP zu veranschaulichen, die auf KI-gesteuerte Steuerungssysteme wie Starlingers StarX-Plattform zutreffen. Es dient als Referenzimplementierung für das begleitende Whitepaper „Hardening Python IP for Offline Industrial AI Deployments“.
CAWODOG (Cat World Dominance Group) ist ein spielerischer, aber realistischer Proof-of-Concept zum Schutz Python-basierter KI-Modelle, die auf offline betriebenen Industriemaschinen eingesetzt werden.
Die Kernidee:
Nimm einen kleinen Bildklassifikator, der Hunde erkennt (die „Feinde“ von CAWODOG), verpacke ihn in eine einfache App und härte die Bereitstellung dann schrittweise gegen IP-Diebstahl.
Der PoC ist als Begleitmaterial zu einem internen Whitepaper zu folgendem Thema konzipiert:
Härtung von Python-IP für Offline-Bereitstellungen industrieller KI
Dieses Repository demonstriert Schritt für Schritt:
.
├── 0/ # Step 0 – Unhardened baseline
│ ├── model/ # Training + inference code
│ ├── app/ # Gradio-based web UI
│ ├── requirements.txt
│ └── (optional) build / run helpers
│
├── 1/ # Step 1 – Packaged with Nuitka (Level 1)
│ ├── app/ # Same UI, adapted entrypoint
│ ├── model/ # Same model logic as step 0
│ ├── build.sh # Nuitka onefile build script
│ └── requirements.txt
│
├── 2/ # Step 2 – Encrypted ONNX model (Level 2)
│ ├── model/ # Training + ONNX export + encryption
│ ├── engine/ # Engine module (decryption + ONNX runtime + scoring)
│ ├── app/ # UI calling the engine only
│ ├── hardening/ # Encryption key + utilities (dev only)
│ ├── build.sh # Nuitka onefile build script
│ └── requirements.txt
│
└── attacker/ # Attacker tooling (optional, for demo)
├── run_and_extract.sh # Finds Nuitka temp dir and lists contents
├── steal_model.sh # Copies model file out of extracted payload
└── use_stolen_model.py# Uses stolen model in a separate script
python -m venv .venv)git, pip und grundlegende Kenntnisse der KommandozeileDie meisten Schritte erfordern:
pip install -r requirements.txt
Ordner: 0/
Ziel: Eine einfache Python-App mit einem trainierten Modell und einer simplen Weboberfläche. Kein Schutz.
dog vs. not_dogmodel_training.py), das:
data/dog und data/not_dog automatisch in Trainings-/Validierungsdaten aufteiltmodel/models/dog_model.ptmodel_inference.py), das:
dog_model.pt lädtapp/gradio_app.py), die:
Vom Repository-Stammverzeichnis aus:
cd 0
python -m venv .venv
source .venv/bin/activate # on Windows: .venv\Scripts\activate
pip install -r requirements.txt
Daten vorbereiten:
0/data/
dog/
<dog images>.jpg
not_dog/
<non-dog images>.jpg
Modell trainieren:
python -m model.model_training
Dies erzeugt etwa Folgendes:
model/models/dog_model.pt
Gradio-App ausführen:
python -m app.gradio_app
Die ausgegebene URL öffnen (standardmäßig http://127.0.0.1:7860) und mit Bildern testen.
.pt-Datei) gespeichert.Dies ist das „Vorher“-Bild.
Ordner: 1/
Ziel: Die App mit Nuitka in eine einzelne ausführbare Datei paketieren.
Sicherheitseffekt: Lässt es wie ein Produkt aussehen, schützt das geistige Eigentum jedoch nicht.
app/main.py oder cawodog_app.py)build.sh), das:
--standalone und --onefile ausführtdog_model.pt)cawodog_step1_nuitka).cd 1
source .venv/bin/activate
./build.sh
Nach dem Build erhältst du etwa Folgendes:
./cawodog_step1_nuitka
Beim Ausführen wird die Gradio-Oberfläche wie zuvor gestartet, nun jedoch aus einer einzigen ausführbaren Datei.
attacker/)Der Ordner attacker zeigt, wie ein Angreifer Folgendes tun kann:
$TMPDIR findendog_model.pt aus diesem Verzeichnis kopierenuse_stolen_model.py verwenden, um Vorhersagen außerhalb der App auszuführenWichtigste Erkenntnis: Härtungsstufe 1 ist kein echter Schutz. Es ist Paketierung, keine Sicherheit.
Ordner: 2/
Ziel: Echten IP-Schutz auf Modellebene einführen.
Sicherheitseffekt: Wettbewerber können das Modell nicht einfach durch Kopieren einer Datei nutzen.
Konvertierung des Modellformats
dog_model.pt mithilfe des ONNX-Exports von PyTorch in dog_model.onnx konvertieren.Modellverschlüsselung
dog_model.onnx mit AES-GCM zu dog_model.enc verschlüsselnhardening/dev_model.key speichern (für PoC-Zwecke)Engine-Abstraktion
engine/core.py einführen, das:
dog_model.enc zur Laufzeit entschlüsseltpredict_is_dog() und enemy_score() bereitstelltUI als Orchestrator
app/gradio_app.py sieht keine rohen Modelldateien oder Interna mehr.cd 2
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Das Modell trainieren (oder wiederverwenden) (wie in Schritt 0, aber innerhalb von 2/):
python -m model.model_training
Nach ONNX exportieren:
python -m model.export_to_onnx
# produces model/models/dog_model.onnx
Das ONNX-Modell verschlüsseln:
python -m hardening.encrypt_model
# produces model/models/dog_model.enc and hardening/dev_model.key
Mit Nuitka bauen (über build.sh):
./build.sh
Nach Abschluss wird ein Schlüssel ausgegeben. Du musst die Umgebungsvariable CAWODOG_MODEL_KEY_HEX auf diesen Schlüssel setzen, damit das Programm das verschlüsselte Modell laden kann. Jeder andere Schlüssel führt zu einem Fehler.
Die resultierende Onefile-Binärdatei ausführen.
Die Benutzeroberfläche sollte sich wie zuvor verhalten.