
CAWODOGは、オフラインの産業用マシンにデプロイされたPythonベースのAIモデルを保護する方法を示す概念実証プロジェクトです。 3つの段階(0→2)を経て、以下のことを示します。 * 単純なPython AIアプリケーションが簡単にリバースエンジニアリングされてしまうこと、 * 攻撃者がパッケージ化されたバイナリからモデルを抽出する方法、 * ONNX変換、モデル暗号化、分離されたランタイムエンジンを使用してAIデプロイメントを強化する方法。 このPoCは、遊び心のある犬検出モデル("Cat World Dominance Group")を使用して、StarlingerのStarXプラットフォームのようなAI駆動型制御システムに適用される実際の産業IP保護コンセプトを説明しています。 これは、付随するホワイトペーパー「Hardening Python IP for Offline Industrial AI Deployments」の参照実装として機能します。
CAWODOG(Cat World Dominance Group)は、オフラインの産業用マシンに展開される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 vs not_dogmodel_training.py):
data/dogとdata/not_dogを自動的に訓練/検証に分割model/models/dog_model.pt)を保存model_inference.py):
dog_model.ptを読み込むapp/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フラグでNuitkaを実行dog_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.ptをコピーするuse_stolen_model.pyを使用してアプリ外で予測を実行する重要なポイント: レベル1は意味のある保護ではありません。パッケージ化であり、セキュリティではありません。
フォルダ: 2/
目標: モデルレベルで真のIP保護を導入。
セキュリティ効果: 競合他社はファイルをコピーするだけでモデルを使用できなくなります。
モデル形式の変換
dog_model.ptをdog_model.onnxに変換。モデルの暗号化
dog_model.onnxを暗号化してdog_model.encにhardening/dev_model.keyに保存(PoC目的)エンジンの抽象化
engine/core.pyを導入:
dog_model.encを復号predict_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をその鍵に設定する必要があります。異なる鍵を使用するとエラーになります。
結果の単一ファイルバイナリを実行します。UIは以前と同じように動作するはずです。
dog_model.enc)は暗号化されています。dog_model.encを直接PyTorchで読み込むまだハードウェアのルートオブトラストには結びついておらず、熟練したリバースエンジニアは最終的にモデルを再構築できるかもしれませんが、ハードルはステップ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.