
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.