
CAWODOG 是一个概念验证项目,演示如何保护部署在离线工业机器上的基于 Python 的 AI 模型。 该项目通过三个递进阶段(0 → 2)展示了: * 一个朴素的 Python AI 应用如何能被轻易地逆向工程, * 攻击者如何从打包的二进制文件中提取模型,以及 * 如何通过 ONNX 转换、模型加密和独立的运行时引擎来加固 AI 部署。 该 PoC 使用一个有趣的狗检测器模型(“猫世界统治集团”)来说明适用于 AI 驱动控制系统的真实工业知识产权保护概念,例如 Starlinger 的 StarX 平台。 它作为随附白皮书《为离线工业 AI 部署加固 Python 知识产权》的参考实现。
CAWODOG(猫世界统治集团)是一个趣味十足但贴近现实的概念验证,用于保护部署在离线工业机器上的基于 Python 的 AI 模型。
核心理念:
以一个能够识别狗(CAWODOG 的“敌人”)的小型图像分类器为例,将其封装到一个简单的应用中,然后逐步加固部署,以防止 IP 被窃取。
该 PoC 是作为一份内部白皮书的配套而设计的:
为离线工业 AI 部署加固 Python IP
本仓库逐步演示:
.
├── 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 以及基本的命令行操作大多数步骤需要:
pip install -r requirements.txt
文件夹: 0/
目标: 一个带有已训练模型和简单 Web UI 的普通 Python 应用。无任何保护。
dog(狗)与 not_dog(非狗)model_training.py),功能包括:
data/dog 和 data/not_dog 拆分为训练集/验证集model/models/dog_model.ptmodel_inference.py),功能包括:
dog_model.ptapp/gradio_app.py),功能包括:
从仓库根目录开始:
cd 0
python -m venv .venv
source .venv/bin/activate # on Windows: .venv\Scripts\activate
pip install -r requirements.txt
准备数据:
0/data/
dog/
<dog images>.jpg
not_dog/
<non-dog images>.jpg
训练模型:
python -m model.model_training
这将生成类似:
model/models/dog_model.pt
运行 Gradio 应用:
python -m app.gradio_app
打开打印的 URL(默认 http://127.0.0.1:7860)并用图片进行测试。
.pt 文件)形式存储。这就是“加固前”的样子。
文件夹: 1/
目标: 使用 Nuitka 将应用打包为单个可执行文件。
安全效果: 使其看起来像一个产品,但实际上无法保护 IP。
app/main.py 或 cawodog_app.py)build.sh),功能包括:
--standalone 和 --onefile 参数运行 Nuitkadog_model.pt)包含在打包产物中cawodog_step1_nuitka)。cd 1
source .venv/bin/activate
./build.sh
构建完成后,你会得到类似:
./cawodog_step1_nuitka
运行它将像之前一样启动 Gradio UI,只不过现在是从单个可执行文件启动。
attacker/)attacker 文件夹展示了攻击者如何:
$TMPDIR 下定位 Nuitka onefile 解包目录dog_model.ptuse_stolen_model.py 在应用之外运行预测要点: 第 1 级并非有意义的保护。它只是打包,不是安全。
文件夹: 2/
目标: 在模型层面引入真正的 IP 保护。
安全效果: 竞争对手无法通过简单地复制文件来使用该模型。
模型格式转换
dog_model.pt 转换为 dog_model.onnx。模型加密
dog_model.onnx 加密为 dog_model.enchardening/dev_model.key 中(仅用于 PoC 目的)引擎抽象
引入 engine/core.py,其功能包括:
dog_model.encpredict_is_dog() 和 enemy_score() 之类的函数UI 作为编排层
app/gradio_app.py 不再接触原始模型文件或内部实现。cd 2
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
训练(或复用)模型(与第 0 步相同,但在 2/ 目录内):
python -m model.model_training
导出为 ONNX:
python -m model.export_to_onnx
# produces model/models/dog_model.onnx
加密 ONNX 模型:
python -m hardening.encrypt_model
# produces model/models/dog_model.enc and hardening/dev_model.key
使用 Nuitka 构建(通过 build.sh):
./build.sh
构建完成后会打印一个密钥。你需要将环境变量 CAWODOG_MODEL_KEY_HEX 设置为该密钥,程序才能加载加密模型。任何不同的密钥都会导致错误。
运行生成的 onefile 二进制文件。 UI 的行为应与之前相同。
dog_model.enc)是加密的。dog_model.enc它仍然没有与硬件信任根绑定,熟练的逆向工程师最终仍然可以重建模型,但门槛已经比第 1 步高得多。
本 PoC 专注于:
它并不声称:
典型的叙述流程:
第 0 步 —— 基线
第 1 步 —— 打包(Nuitka onefile)
attacker/ 脚本演示模型仍然多么容易被窃取。第 2 步 —— 加密的 ONNX
dog_model.enc 已不再足够。然后你可以继续讨论未来的更高级别(此处尚未实现):
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.