
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.
dog_model.enc) ist verschlüsselt.dog_model.enc direkt in PyTorch ladenEs ist weiterhin nicht an eine Hardware-Vertrauenswurzel gebunden, und ein versierter Reverse Engineer kann das Modell letztlich rekonstruieren, aber die Hürde ist deutlich höher als in Schritt 1.
Dieser PoC konzentriert sich auf:
Es erhebt nicht den Anspruch:
Typischer Ablauf:
Schritt 0 – Baseline
Schritt 1 – Paketierung (Nuitka Onefile)
attacker/ verwenden, um zu demonstrieren, wie leicht das Modell immer noch gestohlen werden kann.Schritt 2 – Verschlüsseltes ONNX
dog_model.enc nicht mehr ausreicht.Anschließend kannst du weitere zukünftige Stufen besprechen (hier noch nicht implementiert):
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.