
CAWODOG é um projeto de prova de conceito que demonstra como proteger modelos de IA baseados em Python implantados em máquinas industriais offline. Ao longo de três etapas progressivas (0 → 2), o projeto mostra: * como um aplicativo Python de IA ingênuo pode ser trivialmente submetido a engenharia reversa, * como atacantes podem extrair modelos de binários empacotados, e * como reforçar uma implantação de IA usando conversão ONNX, criptografia de modelos e um mecanismo de execução separado. O PoC usa um modelo lúdico de detecção de cães (o “Cat World Dominance Group”) para ilustrar conceitos reais de proteção de propriedade intelectual industrial que se aplicam a sistemas de controle orientados por IA, como a plataforma StarX da Starlinger. Ele serve como uma implementação de referência para o whitepaper que o acompanha, “Hardening Python IP for Offline Industrial AI Deployments.
CAWODOG (Cat World Dominance Group) é uma prova de conceito lúdica, porém realista, para proteger modelos de IA baseados em Python implantados em máquinas industriais offline.
A ideia central:
Pegue um pequeno classificador de imagens que detecta cães (o “inimigo” da CAWODOG), envolva-o em um aplicativo simples e, em seguida, endureça progressivamente a implantação contra roubo de IP.
O PoC foi projetado como complemento a um whitepaper interno sobre:
Endurecimento de IP em Python para Implantações de IA Industrial Offline
Este repositório demonstra, passo a passo:
.
├── 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 e familiaridade básica com a linha de comandoA maioria das etapas exige:
pip install -r requirements.txt
Pasta: 0/
Objetivo: Um aplicativo Python simples com um modelo treinado e uma IU web simples. Sem proteção.
dog vs not_dogmodel_training.py) que:
data/dog e data/not_dog em treino/validaçãomodel/models/dog_model.ptmodel_inference.py) que:
dog_model.ptapp/gradio_app.py) que:
A partir da raiz do repositório:
cd 0
python -m venv .venv
source .venv/bin/activate # on Windows: .venv\Scripts\activate
pip install -r requirements.txt
Prepare os dados:
0/data/
dog/
<dog images>.jpg
not_dog/
<non-dog images>.jpg
Treine o modelo:
python -m model.model_training
Isso criará algo como:
model/models/dog_model.pt
Execute o aplicativo Gradio:
python -m app.gradio_app
Abra a URL exibida (padrão http://127.0.0.1:7860) e teste com imagens.
.pt).Este é o cenário “antes”.
Pasta: 1/
Objetivo: Empacotar o aplicativo em um executável único usando Nuitka.
Efeito de segurança: Faz com que pareça um produto, mas não protege o IP.
app/main.py ou cawodog_app.py)build.sh) que:
--standalone e --onefiledog_model.pt)cawodog_step1_nuitka).cd 1
source .venv/bin/activate
./build.sh
Após o build, você obtém algo como:
./cawodog_step1_nuitka
Executá-lo iniciará a IU Gradio como antes, mas agora a partir de um único executável.
attacker/)A pasta attacker mostra como um atacante pode:
$TMPDIRdog_model.pt para fora desse diretóriouse_stolen_model.py para executar previsões fora do aplicativoConclusão principal: O Nível 1 não é uma proteção significativa. É empacotamento, não segurança.
Pasta: 2/
Objetivo: Introduzir proteção real de IP no nível do modelo.
Efeito de segurança: Concorrentes não podem usar o modelo simplesmente copiando um arquivo.
Conversão de formato do modelo
dog_model.pt → dog_model.onnx usando a exportação ONNX do PyTorch.Criptografia do modelo
dog_model.onnx com AES-GCM para dog_model.enchardening/dev_model.key (para fins de PoC)Abstração do mecanismo (engine)
engine/core.py que:
dog_model.enc em tempo de execuçãopredict_is_dog() e enemy_score()IU como orquestradora
app/gradio_app.py não vê mais arquivos brutos do modelo ou detalhes internos.cd 2
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Treine (ou reutilize) o modelo (igual à Etapa 0, mas dentro de 2/):
python -m model.model_training
Exporte para ONNX:
python -m model.export_to_onnx
# produces model/models/dog_model.onnx
Criptografe o modelo ONNX:
python -m hardening.encrypt_model
# produces model/models/dog_model.enc and hardening/dev_model.key
Faça o build com Nuitka (via build.sh):
./build.sh
Uma chave será exibida ao final. Você precisa definir a variável de ambiente CAWODOG_MODEL_KEY_HEX com essa chave para que o programa carregue o modelo criptografado. Qualquer chave diferente resultará em erro.
Execute o binário onefile resultante. A IU deve se comportar da mesma forma que antes.