
CAWODOG es un proyecto de prueba de concepto que demuestra cómo proteger modelos de IA basados en Python desplegados en máquinas industriales sin conexión. A través de tres pasos progresivos (0 → 2), el proyecto muestra: * cómo una aplicación ingenua de IA en Python puede ser trivialmente sometida a ingeniería inversa, * cómo los atacantes pueden extraer modelos de binarios empaquetados, y * cómo endurecer un despliegue de IA utilizando conversión ONNX, cifrado de modelos y un motor de ejecución separado. La PoC utiliza un modelo lúdico de detector de perros (el "Grupo de Dominio del Mundo de los Gatos") para ilustrar conceptos reales de protección de propiedad intelectual industrial que se aplican a sistemas de control basados en IA, como la plataforma StarX de Starlinger. Sirve como implementación de referencia para el documento técnico adjunto "Endurecimiento de IP de Python para despliegues de IA industrial sin conexión".
CAWODOG (Cat World Dominance Group) es una prueba de concepto lúdica pero realista para proteger modelos de IA basados en Python desplegados en máquinas industriales sin conexión.
La idea central:
Tomar un pequeño clasificador de imágenes que detecta perros (el "enemigo" de CAWODOG), envolverlo en una aplicación simple y luego endurecer progresivamente la implementación contra el robo de propiedad intelectual.
El PoC está diseñado como acompañante de un documento técnico interno sobre:
Endurecimiento de IP en Python para Implementaciones de IA Industrial Sin Conexión
Este repositorio demuestra, paso a paso:
.
├── 0/ # Paso 0 – Línea base sin endurecer
│ ├── model/ # Código de entrenamiento + inferencia
│ ├── app/ # Interfaz web basada en Gradio
│ ├── requirements.txt
│ └── (opcional) helpers de compilación / ejecución
│
├── 1/ # Paso 1 – Empaquetado con Nuitka (Nivel 1)
│ ├── app/ # Misma UI, punto de entrada adaptado
│ ├── model/ # Misma lógica de modelo que el paso 0
│ ├── build.sh # Script de compilación onefile de Nuitka
│ └── requirements.txt
│
├── 2/ # Paso 2 – Modelo ONNX cifrado (Nivel 2)
│ ├── model/ # Entrenamiento + exportación ONNX + cifrado
│ ├── engine/ # Módulo motor (descifrado + runtime ONNX + puntuación)
│ ├── app/ # UI que solo llama al motor
│ ├── hardening/ # Clave de cifrado + utilidades (solo desarrollo)
│ ├── build.sh # Script de compilación onefile de Nuitka
│ └── requirements.txt
│
└── attacker/ # Herramientas del atacante (opcional, para demo)
├── run_and_extract.sh # Encuentra el directorio temporal de Nuitka y lista contenidos
├── steal_model.sh # Copia el archivo del modelo del payload extraído
└── use_stolen_model.py# Usa el modelo robado en un script separado
python -m venv .venv)git, pip y familiaridad básica con la línea de comandosLa mayoría de los pasos requieren:
pip install -r requirements.txt
Carpeta: 0/
Objetivo: Una aplicación Python simple con un modelo entrenado y una interfaz web sencilla. Sin protección.
dog vs not_dogmodel_training.py) que:
data/dog y data/not_dog en entrenamiento/validaciónmodel/models/dog_model.ptmodel_inference.py) que:
dog_model.ptapp/gradio_app.py) que:
Desde la raíz del repositorio:
cd 0
python -m venv .venv
source .venv/bin/activate # en Windows: .venv\Scripts\activate
pip install -r requirements.txt
Preparar datos:
0/data/
dog/
<imágenes de perros>.jpg
not_dog/
<imágenes que no son perros>.jpg
Entrenar el modelo:
python -m model.model_training
Esto creará algo como:
model/models/dog_model.pt
Ejecutar la aplicación Gradio:
python -m app.gradio_app
Abrir la URL impresa (por defecto http://127.0.0.1:7860) y probar con imágenes.
.pt).Esta es la imagen del "antes".
Carpeta: 1/
Objetivo: Empaquetar la aplicación en un ejecutable único usando Nuitka.
Efecto de seguridad: Hace que parezca un producto, pero no protege la IP.
app/main.py o cawodog_app.py)build.sh) que:
--standalone y --onefiledog_model.pt)cawodog_step1_nuitka).cd 1
source .venv/bin/activate
./build.sh
Después de compilar, obtienes algo como:
./cawodog_step1_nuitka
Ejecutarlo iniciará la interfaz Gradio como antes, pero ahora desde un único ejecutable.
attacker/)La carpeta attacker muestra cómo un atacante puede:
$TMPDIRdog_model.pt de ese directoriouse_stolen_model.py para ejecutar predicciones fuera de la aplicaciónConclusión clave: El Nivel 1 no es una protección significativa. Es empaquetado, no seguridad.
Carpeta: 2/
Objetivo: Introducir protección real de IP a nivel del modelo.
Efecto de seguridad: Los competidores no pueden usar el modelo simplemente copiando un archivo.
Conversión de formato del modelo
dog_model.pt → dog_model.onnx usando la exportación ONNX de PyTorch.Cifrado del modelo
dog_model.onnx con AES-GCM a dog_model.enchardening/dev_model.key (para fines del PoC)Abstracción del motor
Introducir engine/core.py que:
dog_model.enc en tiempo de ejecuciónpredict_is_dog() y enemy_score()UI como orquestador
app/gradio_app.py ya no ve archivos de modelo sin procesar ni detalles internos.cd 2
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Entrenar (o reutilizar) el modelo (igual que en el Paso 0, pero dentro de 2/):
python -m model.model_training
Exportar a ONNX:
python -m model.export_to_onnx
# produce model/models/dog_model.onnx
Cifrar el modelo ONNX:
python -m hardening.encrypt_model
# produce model/models/dog_model.enc y hardening/dev_model.key
Compilar con Nuitka (mediante build.sh):
./build.sh
Al finalizar se imprimirá una clave. Debes establecer la variable de entorno CAWODOG_MODEL_KEY_HEX con esa clave para que el programa pueda cargar el modelo cifrado. Cualquier clave diferente resultará en un error.
Ejecutar el binario onefile resultante. La interfaz debería comportarse igual que antes.
dog_model.enc) está cifrado.dog_model.enc directamente en PyTorchTodavía no está vinculado a una raíz de confianza de hardware, y un ingeniero inverso experto puede eventualmente reconstruir el modelo, pero la barrera es significativamente mayor que en el Paso 1.
Este PoC se centra en:
No pretende:
Flujo narrativo típico:
Paso 0 – Línea Base
Paso 1 – Empaquetado (Nuitka onefile)
attacker/ para demostrar con qué facilidad se sigue robando el modelo.Paso 2 – ONNX Cifrado
dog_model.enc ya no es suficiente.Luego se pueden discutir futuros niveles adicionales (aún no implementados aquí):
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.