allsmog/VolatilityAI
GitHub: allsmog/VolatilityAI
将 Volatility3 内存取证与 LLM 结合的 AI 驱动取证助手,支持自动化分类分析、证据依据验证和交互式调查聊天。
Stars: 0 | Forks: 0
# VolatilityAI
**AI 驱动的 Volatility3 内存取证助手**
VolatilityAI 将 [Volatility3](https://github.com/volatilityfoundation/volatility3) 内存取证与 LLM 相结合,以自动化分类分析并支持对内存转储的交互式调查。与普通的 LLM 封装器不同,VolAI 根据真实证据验证 LLM 输出,运行确定性检测规则,并持久化会话以便随时间推移进行比较。
## 功能特性
- **自动化分类** (`volai analyze`) — 并行运行 Volatility3 插件,将结果发送给 LLM,并生成结构化的 JSON 取证报告,其中包含发现、严重性评级、MITRE ATT&CK 映射和建议
- **依据与验证** — 每个 LLM 发现都会根据实际的插件数据(PID、进程名、IP、路径)进行检查,并根据静态查找表验证 MITRE ID。每个发现都会获得一个 `grounded` 标志和 `confidence` 分数,以便您了解哪些是真实的
- **行为检测规则** — 10 条内置确定性规则(可疑的 svchost 父进程、域名仿冒、C2 端口、malfind 命中、隐藏进程等),无论 LLM 质量如何都能可靠触发。规则发现会被输入到 LLM 提示中,并单独出现在报告中
- **交互式聊天** (`volai chat`) — 基于 REPL 的调查会话,您可以即时运行插件并与 AI 取证分析师讨论发现
- **会话持久化** — 分析和聊天会话保存到 SQLite。恢复聊天、比较报告、将会话导出为 JSON
- **时间线提取** (`volai timeline`) — 从插件数据(进程创建、网络连接、bash 命令)构建按时间顺序排列的事件视图,无需 LLM
- **报告差异比对** (`volai diff`) — 比较两个分类报告以查看变化:新增/已解决的发现、风险分数增量、新 PID、新网络连接
- **可插拔 LLM 后端** — Claude (Anthropic)、OpenAI 或任何 OpenAI 兼容端点(Ollama、vLLM、llama.cpp 等)。自注册:添加新的提供者类,它就会自动出现在 CLI 中
- **优雅降级** — 如果 LLM 失败或返回垃圾数据,行为规则仍然会产生可操作的发现并强制执行风险分数下限
## 安装
需要 **Python 3.11+**。
```
pip install .
```
用于开发:
```
pip install -e ".[dev]"
```
## 快速开始
### 自动化分类
```
# 使用 Claude
volai analyze memory.dmp --provider claude
# 使用 OpenAI
volai analyze memory.dmp --provider openai --model gpt-4o
# 使用本地模型 (Ollama)
volai analyze memory.dmp --provider local --model llama3
# 保存报告到文件
volai analyze memory.dmp --provider claude -o report.json
# 指定 OS 配置文件和自定义插件
volai analyze memory.dmp --provider openai --os-profile windows \
--plugins "windows.pslist.PsList,windows.netscan.NetScan,windows.malfind.Malfind"
# 禁用行为规则或会话保存
volai analyze memory.dmp --provider claude --no-rules --no-save
# 调整 LLM 参数
volai analyze memory.dmp --provider local --temperature 0.8 --max-tokens 8192
# 强制开启/关闭 JSON 模式(默认根据 Provider 自动检测)
volai analyze memory.dmp --provider claude --json-mode
```
### 交互式聊天
```
volai chat memory.dmp --provider claude
# 恢复之前的会话
volai chat memory.dmp --provider claude --resume abc12345
# 使用自定义 LLM 设置
volai chat memory.dmp --provider local --temperature 0.5 --max-tokens 16384
```
聊天命令:
| 命令 | 描述 |
|---|---|
| `/run ` | 运行 Volatility3 插件并将输出添加到上下文 |
| `/plugins` | 列出所有可用的 Volatility3 插件 |
| `/rules` | 对收集到的插件数据运行行为检测规则 |
| `/timeline` | 从收集到的插件数据中提取时间线 |
| `/report` | 生成当前会话的摘要报告 |
| `/sessions` | 显示当前会话 ID |
| `/save` | 手动保存会话检查点 |
| `/help` | 显示可用命令 |
| `/quit` | 退出聊天会话 |
### 时间线
```
volai timeline memory.dmp --provider local --model llama3 --format text
volai timeline memory.dmp --provider local --model llama3 --format json
volai timeline memory.dmp --provider local --model llama3 --format csv
```
### 会话管理
```
volai sessions list # List all saved sessions
volai sessions list --type triage # Filter by type
volai sessions show abc12345 # Show session detail
volai sessions show abc12345 --messages # Include chat history
volai sessions export abc12345 # Export as JSON to stdout
volai sessions export abc12345 -o session.json
volai sessions delete abc12345 --force
```
### 报告差异比对
```
volai diff
volai diff --format json
```
## 配置
### LLM 提供者(必需)
通过 CLI 标志或环境变量设置:
| 方法 | 示例 |
|---|---|
| CLI 标志 | `--provider claude` |
| 环境变量 | `VOLAI_PROVIDER=claude` |
### API Keys
密钥按以下顺序解析:`--api-key` 标志 > `VOLAI_API_KEY` 环境变量 > 提供者特定的环境变量。
| 提供者 | 提供者特定的环境变量 | 默认模型 |
|---|---|---|
| `claude` | `ANTHROPIC_API_KEY` | `claude-sonnet-4-20250514` |
| `openai` | `OPENAI_API_KEY` | `gpt-4o` |
| `local` | 不需要 | `llama3` |
### 本地模型
将 `--base-url` 指向任何 OpenAI 兼容端点:
```
# Ollama (默认: http://localhost:11434/v1)
volai analyze memory.dmp --provider local --model llama3
# 自定义端点
volai analyze memory.dmp --provider local \
--base-url http://localhost:8080/v1 --model my-model
```
### 所有环境变量
| 变量 | 描述 |
|---|---|
| `VOLAI_PROVIDER` | LLM 提供者 (`claude`, `openai`, `local`) |
| `VOLAI_MODEL` | 模型名称/ID |
| `VOLAI_API_KEY` | API 密钥(覆盖提供者特定的变量) |
| `VOLAI_BASE_URL` | 本地/自定义端点的基础 URL |
| `VOLAI_DB_PATH` | SQLite 数据库路径(默认:`~/.volai/volai.db`) |
### LLM 调优选项
| 标志 | 描述 | 默认值 |
|---|---|---|
| `--temperature` | 采样温度 | `0.2` |
| `--max-tokens` | LLM 响应中的最大 token 数 | `4096` |
| `--json-mode` / `--no-json-mode` | 强制 JSON 约束输出 | 根据提供者自动设置 |
省略时,每个提供者使用合理的默认值。JSON 模式对于支持它的提供者(OpenAI、local/Ollama)会自动启用,对于不支持的提供者则会禁用。
## 工作原理
### 分析流水线
```
Memory Dump
|
v
VolatilityRunner.run_plugins_async() -- plugins run in parallel
|
v
Plugin Results (structured dicts)
|
+---> Behavioral Rules Engine -- 10 deterministic checks
| |
| v
| Rule Findings (B001-B010)
|
+---> build_triage_prompt() -- plugin data + rule findings
|
v
LLM Backend.send() -- Claude / OpenAI / local
|
v
_parse_report() -- JSON parse with fallback
|
v
Grounding & Validation -- evidence vs. plugin data,
| MITRE ID validation
v
Risk Score Floor -- max(llm_score, rule_floor)
|
v
TriageReport (JSON) -- findings, rule_findings,
| grounding_summary, etc.
v
SessionStore.save() -- persisted to SQLite
```
### 行为检测规则
针对插件数据确定性触发的 10 条捆绑规则:
| ID | 规则 | 严重性 | MITRE |
|---|---|---|---|
| B001 | svchost.exe 父进程不是 services.exe | high | T1036.005 |
| B002 | 进程从 Temp 目录运行 | medium | T1204 |
| B003 | 进程名域名仿冒 (scvhost, csrsss 等) | high | T1036.005 |
| B004 | 隐藏进程 (在 pslist 但不在 pstree 中,反之亦然) | critical | T1564.001 |
| B005 | 常见 C2 端口上的连接 (4444, 5555, 1337 等) | medium | T1571 |
| B006 | Malfind 命中 (代码注入指示符) | high | T1055 |
| B007 | 具有异常父进程的 cmd.exe/powershell.exe | medium | T1059 |
| B008 | 从非 system32 路径加载的内核模块 | medium | T1547.006 |
| B009 | 3 个以上同名进程(不包括正常重复项) | low | T1055.012 |
| B010 | temp/user 目录中的服务二进制文件 | high | T1543.003 |
规则发现设定风险分数下限:critical=80, high=60, medium=40, low=20。
### 依据
每个 LLM 生成的发现都经过验证:
- **证据** 根据从插件输出中提取的实际 PID、进程名、IP 和文件路径进行检查
- **MITRE ATT&CK IDs** 会验证格式 (`T####.###`) 并对照约 130 个已知技术 ID 进行检查
- 计算一个 `confidence` 分数:`(grounded_evidence + valid_mitre) / total_checks`
- confidence < 0.5 的发现被标记为 `grounded: false`
### 报告结构
```
{
"dump_path": "/path/to/memory.dmp",
"analysis_timestamp": "2025-01-15T10:30:00Z",
"os_detected": "Windows 10 x64",
"llm_provider": "claude",
"llm_model": "claude-sonnet-4-20250514",
"summary": "Executive summary...",
"findings": [
{
"title": "Suspicious Process Injection",
"severity": "critical",
"description": "Detailed explanation...",
"evidence": ["PID 1234", "svchost.exe"],
"mitre_attack": ["T1055"],
"grounded": true,
"confidence": 1.0,
"grounding_details": {
"evidence": [
{"value": "PID 1234", "grounded": true, "match_type": "pid"}
],
"mitre": [
{"id": "T1055", "status": "valid"}
]
}
}
],
"rule_findings": [
{
"title": "[VOLAI-B001] Suspicious svchost parent",
"severity": "high",
"evidence": ["PID 2048", "PPID 1024"],
"mitre_attack": ["T1036.005"]
}
],
"risk_score": 85,
"grounding_summary": {
"total_findings": 4,
"grounded_findings": 3,
"ungrounded_findings": 1,
"grounding_rate": 0.75
},
"recommendations": ["Isolate the host"],
"plugin_outputs": [...],
"errors": [...]
}
```
## 项目结构
```
src/volai/
├── cli.py # Click CLI (analyze, chat, timeline, diff, sessions)
├── config.py # Configuration resolution
├── llm/
│ ├── base.py # LLMBackend ABC + self-registering backend registry
│ ├── claude.py # Anthropic SDK backend
│ ├── openai.py # OpenAI SDK backend
│ └── local.py # Generic OpenAI-compatible backend
├── volatility/
│ ├── runner.py # Plugin execution + async parallel
│ ├── plugins.py # Triage plugin sets per OS
│ └── formatter.py # TreeGrid -> dict conversion
├── analysis/
│ ├── triage.py # Automated triage orchestrator
│ ├── chat.py # Interactive chat REPL
│ ├── grounding.py # Evidence & MITRE validation
│ ├── mitre_data.py # Static MITRE ATT&CK technique IDs
│ ├── timeline.py # Timeline extraction
│ └── diff.py # Report diffing
├── rules/
│ ├── models.py # RuleFinding model
│ └── behavioral.py # Rule engine + 10 bundled rules
├── storage/
│ ├── database.py # SQLite schema + connection
│ └── store.py # SessionStore CRUD
├── prompts/
│ ├── system.py # System prompt constants
│ └── templates.py # Prompt formatting
└── report/
└── models.py # Pydantic models (report, timeline, diff)
```
## 默认分类插件
插件根据 OS 配置文件选择。如果未指定配置文件,则尝试所有插件(错误 OS 的失败会被优雅处理)。
**Windows:** `Info`, `PsList`, `PsTree`, `CmdLine`, `NetScan`, `Malfind`, `DllList`, `Handles`, `FileScan`, `SvcScan`, `Modules`
**Linux:** `PsList`, `PsTree`, `Bash`, `Lsof`, `Lsmod`, `Malfind`, `Sockstat`, `Elfs`, `Maps`
**macOS:** `PsList`, `PsTree`, `Bash`, `Lsof`, `Lsmod`, `Malfind`, `Netstat`, `Mount`
## 测试
```
# 运行所有测试 (235 项测试)
pytest tests/ -v
# Lint
ruff check src/ tests/
# 运行 E2E 功能演示(无需 LLM key — 使用 fake HTTP server)
python -m tests.demo_e2e_features
```
## 许可证
MIT
标签:AI风险缓解, Claude, Cloudflare, CVE检测, DAST, DLL 劫持, Incident Response, IP 地址批量处理, LLM, LLM评估, Memory Forensics, MITRE ATT&CK, Mr. Robot, Ollama, OpenAI, Python, SecList, SecOps, Threat Intelligence, Unmanaged PE, Volatility3, 主机取证, 云安全架构, 交互式聊天, 人工智能, 内存取证, 内存规避, 后渗透, 大语言模型, 安全报告生成, 安全运营, 库, 应急响应, 恶意软件分析, 扫描框架, 数字取证, 无后门, 用户模式Hook绕过, 网络安全, 网络安全审计, 自动化分析, 自动化脚本, 行为检测, 跨站脚本, 逆向工具, 隐私保护