
AI/ML 모델 파일용 보안 스캐너입니다. 배포 전에 악성 코드, 백도어 및 취약점을 탐지합니다.
배포 전에 AI 모델을 보호하세요. ML 모델 파일에서 악성 코드, 잠재적 백도어 지표, 보안 취약점을 탐지하는 정적 스캐너입니다. 모델을 로드하거나 실행하지 않습니다.
모델은 신뢰할 수 없는 레지스트리에서 다운로드되고, CI를 거쳐 프로덕션에서 실행됩니다. 기존 SAST 도구는 pickle opcode, HDF5 그룹 레이아웃, ONNX proto 그래프, TensorFlow SavedModel 서명을 검사하지 않지만 ModelAudit은 검사합니다:
비교 도구: picklescan (pickle 전용, Python 기반), fickling (pickle 전용, AST 기반), modelscan (pickle + TensorFlow + Keras 하위 집합). ModelAudit은 더 넓은 범위를 지원하며 동반 패키지 modelaudit-picklescan을 통해 네이티브 Rust pickle 엔진을 제공합니다.
Python 3.10-3.13 필요```bash pip install "modelaudit[all]"
modelaudit model.pkl modelaudit ./models/
modelaudit model.pkl --format json --output results.json
입력된 콘텐츠가 없습니다.```
$ modelaudit suspicious_model.pkl
Files scanned: 1 | Issues found: 2 critical, 1 warning
1. suspicious_model.pkl (pos 28): [CRITICAL] Malicious code execution attempt
Why: Contains os.system() call that could run arbitrary commands
2. suspicious_model.pkl (pos 52): [WARNING] Dangerous pickle deserialization
Why: Could execute code when the model loads
ModelAudit에는 모델, 아카이브 및 구성 형식을 포괄하는 45개의 등록된 스캐너가 포함되어 있습니다:
또한 ZIP, TAR, 7-Zip, OCI 레이어, Jinja2 템플릿, JSON/YAML 메타데이터, 매니페스트, 모델 카드, 텍스트 파일 및 RAR 인식을 위한 스캐너도 포함됩니다. RAR 아카이브는 건너뛰지 않고 지원되지 않음/fail-closed로 보고됩니다.
구조적으로 유효한 TensorFlow SavedModel 및 MetaGraph protobuf는 비모델 접미사로 이름이 변경된 경우에도 인식됩니다.
CoreML 모델은 이름이 변경된 경우에도 인식될 수 있으며, 불완전한 적용 범위는 명시적으로 보고됩니다.
크기가 과대하지만 그럴듯한 프레이밍을 가진 SafeTensors 파일은 .jpg와 같이 달리 사용되지 않는 접미사 아래에서 제한적이고 결론이 나지 않는 분석을 위해 유지됩니다.
구조적으로 타당한 Flax/JAX MessagePack 체크포인트도 비모델 접미사로 이름이 변경된 경우 인식됩니다. 완전히 분류할 수 없는 이름 변경 구조는 불완전 적용 범위로 보고됩니다.
구조화된 JAX/Orbax JSON 체크포인트 메타데이터도 이름이 변경된 경우 인식됩니다. 크기가 과대한 모호한 후보는 불완전 적용 범위로 보고되며, 제한된 검사 접두사에서 관찰 가능한 보안 패턴은 여전히 보수적으로 보고될 수 있습니다.
원격 레지스트리 및 클라우드 스토리지에서 모델을 직접 스캔하세요:```bash
modelaudit https://huggingface.co/gpt2 modelaudit hf://microsoft/DialoGPT-medium
modelaudit s3://bucket/model.pt modelaudit gs://bucket/models/
modelaudit models:/MyModel/Production
modelaudit https://company.jfrog.io/artifactory/repo/model.pt modelaudit https://company.jfrog.io/artifactory/repo/models/
modelaudit model.dvc
### 인증 환경 변수
- `HF_TOKEN` - 비공개 Hugging Face 저장소용
- `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` (및 선택적으로 `AWS_SESSION_TOKEN`) - S3용
- `GOOGLE_APPLICATION_CREDENTIALS` - GCS용
- `MLFLOW_TRACKING_URI` - MLflow 레지스트리 접근용
- `MODELAUDIT_MLFLOW_ALLOWED_ARTIFACT_URIS` - 비로컬 MLflow 아티팩트 루트용 (쉼표로 구분된 URI 접두사)
- `s3://bucket/prefix`와 같은 구체적인 백엔드 루트를 사용하세요. 논리적 `models:/` 또는 `runs:/` URI와 퍼센트 인코딩된 원격 경로는 거부됩니다.
- `JFROG_API_TOKEN` 또는 `JFROG_ACCESS_TOKEN` - JFrog Artifactory용
- `MODELAUDIT_JFROG_ALLOWED_HOSTS` - 자격 증명을 받을 수 있는 쉼표로 구분된 사용자 지정 JFrog 호스트 이름용
- `MODELAUDIT_JFROG_ALLOWED_REDIRECT_HOSTS` - 자격 증명 없이 다운로드할 수 있는 쉼표로 구분된 외부 리디렉션 호스트 이름용
- 자격 증명은 환경 변수 또는 시크릿 관리자에 저장하고, 토큰/키를 커밋하지 마세요.
## 설치```bash
# Broad scanner coverage (recommended; excludes the TensorFlow runtime and platform-specific TensorRT)
pip install "modelaudit[all]"
# Core only (static scanners, pickle, NumPy, archives, manifests, metadata)
pip install modelaudit
# Specific frameworks (TensorFlow installs on Python 3.11-3.12; ONNX installs on Python 3.10-3.12)
pip install "modelaudit[tensorflow,pytorch,h5,onnx,safetensors]"
# CI/CD environments
pip install "modelaudit[all-ci]"
# On Python 3.11-3.12, add TensorFlow only when you need runtime-dependent checkpoint or weight analysis
pip install "modelaudit[all,tensorflow]"
# Docker
docker run --rm -v "$(pwd)":/app ghcr.io/promptfoo/modelaudit:latest model.pkl
ONNX 엑스트라(modelaudit[all]의 ONNX 부분 포함)는 Python 3.10-3.12용으로 패키징되어 있습니다.
PyTorch를 포함하는 엑스트라는 Python 3.10-3.12 또는 표준(GIL 활성화) CPython 3.13이 필요합니다. 패치된 PyTorch 2.13
휠은 free-threaded CPython 3.13t를 지원하지 않습니다. ModelAudit의 네이티브 pickle 스캐너도 CPython 3.13t를 지원하지 않으므로 표준 CPython을 사용하세요.
Apple Silicon에서 PyTorch를 포함하는 엑스트라는 휠이 macosx_14_0_arm64를 대상으로 하므로 macOS 14 이상이 필요합니다. 코어 전용 설치는 macOS 11-13에서 정적 스캐닝용으로 계속 사용할 수 있습니다.
주요 명령:```bash modelaudit [PATHS...] # Default scan command modelaudit scan [OPTIONS] PATHS... # Explicit scan command modelaudit scan --list-scanners # List scanner IDs for targeted scans modelaudit metadata [OPTIONS] PATH # Extract model metadata safely (no deserialization by default) modelaudit doctor [--show-failed] # Diagnose scanner/dependency availability modelaudit debug [--json] [--verbose] # Environment and configuration diagnostics modelaudit cache [stats|clear|cleanup] [OPTIONS]
일반적인 스캔 옵션:```text
--format {text,json,sarif} Output format (default: auto-detected)
--output FILE Write results to file
--strict Fail on warnings, scan all file types, strict license validation
--sbom FILE Generate CycloneDX SBOM
--stream Process files one-by-one; remote downloads are deleted after scanning
--assume-shard-family Treat explicitly listed cross-directory shards as one model family
--max-size SIZE Size limit (e.g., 10GB)
--timeout SECONDS Override scan timeout
--dry-run Preview what would be scanned
--verbose / --quiet Control output detail
--blacklist PATTERN Additional patterns to flag
--no-cache Disable result caching
--cache-dir DIR Set cache directory for downloads and scan results
--progress Force progress display
--scanners LIST Only run selected scanners (IDs/classes; comma-separated or repeated)
--exclude-scanner NAME Exclude a scanner from the active set (comma-separated or repeated)
--list-scanners List scanner IDs, class names, extensions, and dependencies
대상 스캐너 선택:```bash
modelaudit scan --list-scanners modelaudit scan --list-scanners --format json
modelaudit scan ./models --scanners pickle,tf_savedmodel modelaudit scan ./model.pkl --scanners PickleScanner
modelaudit scan ./models --exclude-scanner weight_distribution
modelaudit scan ./archive.zip --scanners zip,pickle
`--scanners`는 명시적 허용 목록에서 시작합니다. `--exclude-scanner`는 해당 허용 목록 또는 기본 스캐너 세트에서 스캐너를 뺍니다. 스캐너 선택은 JSON 출력의 `scanner_selection` 아래에 반영됩니다.
원격 폴더의 경우 ModelAudit은 안전할 때 선택된 스캐너 확장자에 따라 다운로드를 제한합니다. 콘텐츠 기반 renamed-wrapper 라우팅은 획득 후 적용됩니다. 저장소 파일 이름이 의도적으로 오해를 불러일으킬 수 있는 경우 직접 파일 URL을 스캔하십시오.
## 메타데이터 추출```bash
# Human-readable summary (safe default: no model deserialization)
modelaudit metadata model.safetensors
# Machine-readable output
modelaudit metadata ./models --format json --output metadata.json
# Focus only on security-relevant metadata fields
modelaudit metadata model.onnx --security-only
--trust-loaders는 모델 콘텐츠를 역직렬화할 수 있는 스캐너 메타데이터 로더를 활성화합니다. 격리된 환경의 신뢰할 수 있는 아티팩트에서만 사용하세요.
0: 보안 문제가 감지되지 않음1: 보안 문제가 감지됨2: 스캔 오류ModelAudit는 제품 안정성 및 사용 분석을 위한 텔레메트리를 포함합니다.
CI=true 또는 IS_TESTING=true가 설정되면 텔레메트리가 자동으로 비활성화되며, MODELAUDIT_TELEMETRY_DEV=1이 아닌 경우 편집 가능한 개발 설치에서도 비활성화됩니다. 다른 CI 제공자(TeamCity, CodeBuild, Bitbucket Pipelines, Jenkins)에서 전송된 이벤트는 다운스트림에서 필터링할 수 있도록 isRunningInCi=true로 태그가 지정됩니다.~/.promptfoo/promptfoo.yaml에 저장되며, 각 텔레메트리 세션은 새로운 세션 식별자를 사용합니다. ~/.modelaudit/user_config.json의 기존 ID는 업그레이드 후 첫 실행 시 마이그레이션됩니다. 해당 파일에 레거시 이메일 값이 있는 경우 분석 사용자 프로필에 첨부될 수 있습니다.다음 환경 변수 중 하나로 명시적으로 옵트아웃하세요:```bash export PROMPTFOO_DISABLE_TELEMETRY=1
export NO_ANALYTICS=1
editable/개발 설치 중 옵트인하려면:```bash
export MODELAUDIT_TELEMETRY_DEV=1
modelaudit model.pkl --format json --output results.json
modelaudit model.pkl --format sarif --output results.sarif
## 문제 해결
- `modelaudit doctor --show-failed`를 실행하여 사용할 수 없는 스캐너와 누락된 선택적 종속성을 확인하세요.
- `modelaudit debug --json`를 실행하여 버그 보고용 환경/구성 진단 정보를 수집하세요.
- `modelaudit cache cleanup --max-age 30`을 사용하여 오래된 캐시 항목을 안전하게 제거하세요.
- `pip`이 이전 버전을 설치하는 경우 Python이 지원되는지 확인하세요 (`python --version`; ModelAudit은 Python 3.10-3.13을 지원합니다).
- 추가 문제 해결 및 클라우드 인증 지침은 다음을 참조하세요:
- https://www.promptfoo.dev/docs/model-audit/
- https://www.promptfoo.dev/docs/model-audit/usage/
## 문서
- **[전체 문서](https://www.promptfoo.dev/docs/model-audit/)** — 설정, 구성 및 고급 사용법
- **[사용 예제](https://www.promptfoo.dev/docs/model-audit/usage/)** — CI/CD 통합, 원격 스캔, SBOM 생성
- **[지원 형식](https://www.promptfoo.dev/docs/model-audit/scanners/)** — 상세 스캐너 문서
- **[지원 정책](https://github.com/promptfoo/modelaudit/blob/main/SUPPORT.md)** — 지원되는 Python/OS 버전 및 유지보수 정책
- **[보안 모델 및 제한 사항](https://github.com/promptfoo/modelaudit/blob/main/docs/user/security-model.md)** — ModelAudit이 보장하는 것과 보장하지 않는 것
- **[호환성 매트릭스](https://github.com/promptfoo/modelaudit/blob/main/docs/user/compatibility-matrix.md)** — 파일 형식 대 선택적 종속성
- **[스캐너 선택](https://github.com/promptfoo/modelaudit/blob/main/docs/user/scanner-selection.md)** — 대상 스캐너 허용 목록 및 제외
- **[메타데이터 추출 가이드](https://github.com/promptfoo/modelaudit/blob/main/docs/user/metadata-extraction.md)** — 안전한 메타데이터 워크플로 및 `--trust-loaders` 지침
- **[오프라인/에어갭 가이드](https://github.com/promptfoo/modelaudit/blob/main/docs/user/offline-air-gapped.md)** — 인터넷 접속 없이 안전한 운영
- **문제 해결** — `modelaudit doctor --show-failed`를 실행하여 스캐너 사용 가능 여부를 확인하세요
## 관련 패키지
- **[`modelaudit-picklescan`](https://pypi.org/project/modelaudit-picklescan/)** — ModelAudit의 pickle, PyTorch, ExecuTorch 및 PyTorch-ZIP 스캐너에서 사용되는 독립형 Rust 기반 pickle 스캐너입니다. 전체 스캐너 번들을 원하지 않고 pickle 분석만 필요하다면(CLI가 아닌 라이브러리로) 직접 설치하세요.
## 취약점 신고
의심되는 취약점에 대해 공개 이슈를 열지 마세요. 조정된 공개 절차는 [SECURITY.md](https://github.com/promptfoo/modelaudit/blob/main/SECURITY.md)를 참조하세요.
## 기여
이슈, 기능 요청 및 PR을 환영합니다. [CONTRIBUTING.md](https://github.com/promptfoo/modelaudit/blob/main/CONTRIBUTING.md)를 참조하세요.
## 라이선스
MIT 라이선스 — 자세한 내용은 [LICENSE](https://github.com/promptfoo/modelaudit/blob/main/LICENSE)를 참조하세요.
| 형식 | 확장자 | 위험도 |
|---|
| Pickle | .pkl, .pickle, .dill | 높음 |
| PyTorch | .pt, .pth, .ckpt, .bin | 높음 |
| Joblib | .joblib | 높음 |
| NumPy | .npy, .npz | 높음 |
| R Serialized | .rds, .rda, .rdata, 서명이 유효한 이름이 변경된 워크스페이스 아티팩트 | 높음 |
| TensorFlow | .pb, .meta, SavedModel 디렉터리 | 중간 |
| Keras | .h5, .hdf5, .keras | 중간 |
| ONNX | .onnx | 중간 |
| CoreML | .mlmodel, 구조적으로 유효한 이름이 변경된 아티팩트 | 낮음 |
| MXNet | *-symbol.json, *-NNNN.params, 구조적으로 유효한 이름이 변경된 symbol JSON | 낮음 |
| NeMo | .nemo, 루트 구성이 있는 이름이 변경된 아카이브 | 중간 |
| CNTK | .dnn, .cmf, 서명이 유효한 이름이 변경된 아티팩트 | 중간 |
| RKNN | .rknn, 충돌하지 않는 이름 변경 접미사 아래의 서명이 유효한 아티팩트 | 중간 |
| Torch7 | 직렬화된 아티팩트 (.t7, .th, .net 또는 이름 변경) | 높음 |
| CatBoost | .cbm | 중간 |
| XGBoost | .bst, .model, .json, .ubj, 확장자 없는 UBJSON | 중간 |
| LightGBM | .lgb, .lightgbm, .model, 서명이 유효한 이름이 변경된 아티팩트 | 중간 |
| Llamafile | 실행 가능한 래퍼 (.llamafile, .exe, 확장자 없음 또는 이름 변경) | 중간 |
| TorchServe | .mar | 높음 |
| SafeTensors | .safetensors | 낮음 |
| GGUF/GGML | .gguf, .ggml, .ggmf, .ggjt, .ggla, .ggsa, 서명이 유효한 이름이 변경된 아티팩트 | 낮음 |
| JAX/Flax | .msgpack, .flax, .orbax, .jax, .checkpoint, .orbax-checkpoint | 낮음 |
| TFLite | .tflite, 충돌하지 않는 이름 변경 접미사 아래의 서명이 유효한 아티팩트 | 낮음 |
| ExecuTorch | .ptl, .pte, 충돌하지 않는 이름 변경 접미사 아래의 서명이 유효한 독립형 아티팩트 | 낮음 |
| TensorRT | .engine, .plan, .trt | 낮음 |
| PaddlePaddle | .pdmodel, .pdiparams | 낮음 |
| OpenVINO | .xml | 낮음 |
| Skops | .skops | 높음 |
| PMML | .pmml | 낮음 |
| Compressed Wrappers | .gz, .bz2, .xz, .lz4, .zlib | 중간 |