
CAWODOG는 오프라인 산업용 기계에 배포된 Python 기반 AI 모델을 보호하는 방법을 시연하는 개념 증명 프로젝트입니다. 세 가지 점진적 단계(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/
목표: 훈련된 모델과 간단한 웹 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 파일)로 저장됩니다.*이것이 "before" 그림입니다.
폴더: 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를 AES-GCM으로 암호화하여 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를 해당 키로 설정해야 합니다. 다른 키를 사용하면 오류가 발생합니다.
결과 onefile 바이너리 실행. UI는 이전과 동일하게 동작해야 합니다.
dog_model.enc)은 암호화되어 있습니다.dog_model.enc 로드이 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.