在部署之前保护你的 AI 模型。 静态扫描器,可检测 ML 模型文件中的恶意代码、潜在后门指标和安全漏洞——而无需加载或执行它们。
模型从未受信任的注册表下载,经过 CI,最终在生产环境中运行。传统的 SAST 工具不会检查 pickle 操作码、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
I'm ready to translate the provided content, but the INPUT section appears to be empty. Please provide the actual chunk 3 content so I can translate it.```
$ 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 extra(包括 modelaudit[all] 中的 ONNX 部分)适用于 Python 3.10-3.12。
包含 PyTorch 的 extra 需要 Python 3.10-3.12 或标准(启用 GIL 的)CPython 3.13;修补版 PyTorch 2.13
wheel 不支持 free-threaded CPython 3.13t。请使用标准 CPython,因为 ModelAudit 的原生 pickle 扫描器同样
不支持 CPython 3.13t。在 Apple Silicon 上,包含 PyTorch 的 extra 需要 macOS 14 或更高版本,因为这些 wheel
以 macosx_14_0_arm64 为目标;仅核心安装仍可用于在 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 会在安全时按所选扫描器扩展名缩小下载范围。基于内容的重命名包装器路由在获取后应用;当存储库文件名可能被有意误导时,请扫描直接文件 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 中,用于与 Promptfoo 进行跨工具关联,并且每个遥测会话都使用新的会话标识符。升级后首次运行时,会迁移 ~/.modelaudit/user_config.json 中的现有 ID。该文件中的旧版电子邮件值(如果存在)可能会附加到分析用户配置文件中。通过以下任一环境变量显式选择退出:```bash export PROMPTFOO_DISABLE_TELEMETRY=1
export NO_ANALYTICS=1
要在可编辑/开发安装期间选择加入:```bash
export MODELAUDIT_TELEMETRY_DEV=1
modelaudit model.pkl --format json --output results.json
modelaudit model.pkl --format sarif --output results.sarif
## Troubleshooting
- 运行 `modelaudit doctor --show-failed` 列出不可用的扫描器及缺失的可选依赖。
- 运行 `modelaudit debug --json` 收集环境/配置诊断信息,用于提交 bug 报告。
- 使用 `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/
## Documentation
- **[完整文档](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/操作系统版本及维护政策
- **[安全模型与局限性](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` 检查扫描器的可用性
## Related Packages
- **[`modelaudit-picklescan`](https://pypi.org/project/modelaudit-picklescan/)** — 由 Rust 驱动的独立 pickle 扫描器,被 ModelAudit 的 pickle、PyTorch、ExecuTorch 和 PyTorch-ZIP 扫描器所使用。如果你只需要 pickle 分析(作为库,而非 CLI),并且不需要完整的扫描器套件,可以直接安装它。
## Reporting Vulnerabilities
对于疑似漏洞,请勿创建公开 issue。请参阅 [SECURITY.md](https://github.com/promptfoo/modelaudit/blob/main/SECURITY.md) 了解协调披露流程。
## Contributing
欢迎提交 issue、功能请求和 PR。请参阅 [CONTRIBUTING.md](https://github.com/promptfoo/modelaudit/blob/main/CONTRIBUTING.md)。
## License
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 序列化 | .rds, .rda, .rdata、签名验证通过的重命名工作区工件 | 高 |
| TensorFlow | .pb, .meta、SavedModel 目录 | 中 |
| Keras | .h5, .hdf5, .keras | 中 |
| ONNX | .onnx | 中 |
| CoreML | .mlmodel、结构有效的重命名工件 | 低 |
| MXNet | *-symbol.json, *-NNNN.params、结构有效的重命名符号 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 | 低 |
| 压缩封装 | .gz, .bz2, .xz, .lz4, .zlib | 中 |