rzawadzk/ai-supply-chain-auditor
GitHub: rzawadzk/ai-supply-chain-auditor
一款用于审计AI供应链风险的智能体工具,覆盖库存、来源、完整性、合规性与行为五个维度。
Stars: 0 | Forks: 0
# AI供应链审计师
一个智能体AI工具,用于在5个维度上审计软件项目的供应链风险:**库存、来源、完整性、合规性、行为**。将其指向一个目录,即可获得一份带有修复步骤的优先级风险报告。
如果你不知道你的AI堆栈里有什么,你就无法理解自己的风险画像。这个工具会照亮它。
## 它能发现什么
一份非穷尽的列表,列出了审计器将捕获的内容:
- 源代码中的硬编码API密钥(`sk-`、`sk-ant-`、`hf_`)
- 没有 `weights_only=True` 的 `pickle.load()` 或 `torch.load()` —— 任意代码执行风险
- 包含危险操作码(`GLOBAL`、`REDUCE`、`INST`、`BUILD`)的Pickle模型文件
- 未固定版本的依赖,可能在你毫无察觉下被悄悄替换
- 没有组织前缀的HuggingFace模型(命名空间劫持风险)
- 来自匿名或未验证作者的模型
- 你的使用场景(商业/研究/内部/开源)与组件许可证之间的冲突
- 没有校验和验证的远程数据下载
- `exec()` / `eval()` 与字符串插值
- 缺少 `MODEL_CARD.md` / `LICENSE` 文档
- 模型加载代码中的后门指示和可疑网络模式
## 快速开始
```
# 克隆
git clone https://github.com/rzawadzk/ai-supply-chain-auditor.git
cd ai-supply-chain-auditor
# 安装
pip install -r requirements.txt
# 确保您已登录 Claude Code
# (该工具使用 Claude Agent SDK — 无需 API 密钥)
# 运行包含的演示审计
python main.py
```
默认运行会审计 `sample_project/` —— 一个故意植入8个以上问题的演示项目 —— 这样你可以在指向真实项目之前看到输出形态。
要审计你自己的项目:
```
python main.py /path/to/your/project
```
添加 `--verbose` 以观察智能体的推理、工具选择和迭代过程:
```
python main.py /path/to/your/project --verbose
```
### 使用不同的LLM
该审计器与模型无关。使用 `--backend` 选择任何受支持的后端:
```
# Claude(默认,使用 Claude Code 登录 — 无需 API 密钥)
python main.py --backend claude
# OpenAI(需要 OPENAI_API_KEY)
OPENAI_API_KEY=sk-... python main.py --backend openai
# Groq — 默认快速,使用 Llama 3.3 70B(需要 GROQ_API_KEY)
GROQ_API_KEY=gsk_... python main.py --backend groq
# Together AI(需要 TOGETHER_API_KEY)
TOGETHER_API_KEY=... python main.py --backend together
# OpenRouter — 统一访问多种模型(需要 OPENROUTER_API_KEY)
OPENROUTER_API_KEY=... python main.py --backend openrouter
# Ollama — 完全本地,完全私有。需要运行 `ollama serve`
ollama pull llama3.1
python main.py --backend ollama
```
通过 `OPENAI_MODEL=...` 覆盖每个后端的默认模型。指向一个
自定义的OpenAI兼容端点(例如本地vLLM)使用 `OPENAI_BASE_URL=...`。
**关于Ollama和开源模型的说明:** 工具使用质量因模型而异。
Llama 3.1/3.2/3.3、Qwen 2.5 和 Mistral-Nemo 工作可靠;
较小的模型往往无法完成完整的审计循环。该适配器会先检查Ollama服务器健康状态,并验证请求模型是否已拉取,同时会对不支持工具的模型发出警告。
## 三种运行方式
### 1. CLI(自包含)
该工具运行自己的智能体循环并打印完整报告。适用于定时审计和CI/CD。
```
python main.py /path/to/project
```
### 2. 在任意 Claude Code 会话中(MCP 模式)
注册一次审计器,即可在任意 Claude Code 对话中调用它。适用于需要调用会话上下文进行交互式调查的场景。
**项目范围**(打开此仓库时自动加载)—— 本仓库中的 `.mcp.json` 已配置好。
**全局范围** —— 添加到 `~/.claude.json` 以便随处可用:
```
{
"mcpServers": {
"ai-supply-chain-auditor": {
"command": "python",
"args": ["/absolute/path/to/ai-supply-chain-auditor/mcp_server.py"]
}
}
}
```
然后在任何 Claude Code 会话中:
五个工具将变为可用:`scan_inventory`、`check_provenance`、`verify_integrity`、`audit_compliance`、`probe_behavior`。调用会话负责编排它们。
### 跟踪审计历史
使用 `--db` 将每次工具调用持久化到 SQLite 数据库。然后使用
`findings_cli.py` 比较不同运行 —— 有助于发现新引入的依赖或代码变更带来的风险。
```
# 首次审计 — 记录到 audits.db
python main.py --db audits.db
# 后续(代码更改后) — 记录新审计
python main.py --db audits.db
# 查看所有已记录审计
python findings_cli.py list
# 比较两次审计
python findings_cli.py diff 1 2
# 详细检查一次审计
python findings_cli.py show 2 --full
```
存储的内容:每个工具的结构化 JSON 输出(库存、来源、完整性、合规性、行为)。**不存储**:LLM的散文报告 —— 它是非确定性的,不适合用于差异对比。CLI 会通过哈希值比较工具输出,并总结结构性变化(新增/移除的发现、列表长度变化)。
### 3. 确定性扫描(无LLM —— 专为CI设计)
按固定顺序运行所有工具,将结构化 JSON 写入 findings
DB,在达到严重性阈值时以非零状态退出。不使用LLM、不需要API密钥、无随机性。
```
# 一次性扫描
python scan.py /path/to/project
# CI 风格:对 CRITICAL 设门限,持久化到数据库
python scan.py /path/to/project --db audit.db --fail-on CRITICAL
echo $? # 0 = passed, 1 = CRITICAL found
```
一个开箱即用的 GitHub Actions 工作流位于 `.github/workflows/audit.yml`。
它会在 PR 分支与基础分支之间扫描,粘贴差异注释,并在发现任何 CRITICAL 问题时失败 —— 全程无需 API 密钥。
你也可以直接调用底层工具以用于自定义流水线:
```
from tools.inventory import run_inventory
import json
inv = json.loads(run_inventory({"project_path": "./my-repo"}))
for mf in inv["model_files"]:
print(f"{mf['path']}: {mf['risk']}")
```
## 输入格式
仅提供一个目录路径。不需要配置文件,也不需要清单。该工具会遍历目录树并识别如何读取:
| 文件类型 | 提取内容 |
|---|---|
| `requirements.txt`、`pyproject.toml`、`Pipfile`、`setup.py` | Python ML 依赖及其版本锁定 |
| `package.json` | Node ML 依赖 |
| `.py`、`.js`、`.ts`、`.jsx`、`.tsx` | API 调用、模型加载、硬编码密钥、风险模式 |
| `.yaml`、`.yml`、`.json`、`.toml` | 模型名称、API 端点 |
| `.pt`、`.pth`、`.pkl`、`.safetensors`、`.onnx`、`.bin`、`.gguf`、`.h5` | 格式安全性、Pickle操作码检查、文件哈希 |
| `LICENSE*` | 项目许可证 |
它**不会**从网络下载任何内容 —— 仅检查引用,不检查内容。并且会自动跳过 `node_modules/` 和 `.venv/`。
## 5个审计维度
1. **库存** —— *堆栈中有什么AI组件?* 发现ML库、模型文件、AI API、数据集引用。
2. **来源** —— *每个组件来自哪里?* 检查模型卡片、作者身份、可信来源、版本锁定。
3. **完整性** —— *是否被篡改?* 检查模型文件是否存在不安全的序列化、危险的Pickle操作码、嵌入的可疑模式。
4. **合规性** —— *许可证是否匹配使用场景?* 将项目许可证与商业/研究/内部/开源用途进行交叉比对。
5. **行为** —— *代码是否在执行可疑操作?* 匹配不安全加载、网络外传、凭证泄露、后门指示等模式。
## 示例:输出长什么样
在 `sample_project/` 上运行会生成一份报告,包含执行摘要、整体风险评分(CRITICAL / HIGH / MEDIUM / LOW)、按维度分组的优先级发现,以及三级修复计划(立即/短期/中期)。在演示项目上,它会暴露16个发现 —— 其中6个是 CRITICAL —— 包括一个可执行的Pickle文件、硬编码的API密钥,以及从未经验证的作者加载的模型。
请参考 [`sample_project/app.py`](sample_project/app.py) 获取故意设计为存在漏洞的演示代码。
## 架构
```
main.py CLI entry point
agent.py Dispatcher — picks adapter, delegates audit
mcp_server.py Standalone MCP server (stdio, exposes tools to any CC session)
.mcp.json Claude Code auto-registration
adapters/ Model-agnostic layer
base.py AgentAdapter Protocol + shared system prompt
claude_sdk.py Claude adapter (SDK-managed loop)
openai_compat.py Unified adapter for OpenAI/Groq/Together/OpenRouter
tools/
inventory.py Scan for AI components
provenance.py Check origins and sources
integrity.py Verify file safety (pickle scanning, hashes)
compliance.py License matrix and conflict detection
behavior.py Pattern-match risky code
sample_project/ Deliberately vulnerable demo
```
设计原则:**你编写工具,智能体编写策略。** 工具是确定性的、独立可用的。LLM负责组合、优先级排序和叙述。
## 要求
- Python 3.10+
- [Claude Code](https://claude.com/claude-code) 已安装并登录(智能体SDK通过它进行认证 —— 无需 `ANTHROPIC_API_KEY`)
- `requirements.txt` 中的依赖:`claude-agent-sdk`、`anyio`
## 诚实的局限性
- **模式匹配不是证明。** 一个发现只是一个调查信号,而非最终判决。审计器会标记 `torch.load()` 而没有 `weights_only=True`;但它无法告诉你正在加载的文件是否真的恶意。
- **不进行网络检查。** 如果你的代码在运行时下载模型,我们只能看到URL,无法看到载荷。
- **模型质量影响结果。** 智能体报告的深度取决于所依赖的模型。Claude Opus 4.6 是默认模型;较小模型会生成更浅的审计。
- **不是SAST工具。** 这是专门针对AI供应链的,不会捕获SQL注入或XSS。请将其与传统安全扫描器配合使用。
## 贡献
欢迎提交PR。值得添加的内容包括:
- 用于GitHub代码扫描的SARIF输出
- 与SBOM格式(CycleoneDX、SPDX)的集成
- 更多语言支持(Rust、Go、Java的ML框架)
- 更丰富的差异功能(`findings_cli.py`,例如具体是哪个被添加)
- 能力基准测试:在 `sample_project/` 上运行所有后端并报告哪些模型能真正完成审计
如果你在阅读此代码的同时学习智能体AI模式,建议从 [`CLAUDE.md`](CLAUDE.md) 开始 —— 它被编写为教学示例。
## 许可证
MIT。
标签:Agentic AI, AI供应链审计, AI组件清单, eval注入, exec注入, HuggingFace模型, SEO: AI供应链审计, SEO: AI组件审计, SEO: 影子AI风险, 依赖项审计, 反序列化安全, 影子AI, 技术栈: Claude Agent SDK, 技术栈: Python, 文档缺失, 模型后门检测, 模型完整性, 硬编码密钥, 网络异常检测, 许可证合规, 软件安全审计, 远程下载校验, 逆向工具, 风险报告