Sphinx-AxIS/EvidenceLab
GitHub: Sphinx-AxIS/EvidenceLab
一个证据驱动的应急响应调查平台,将多源取证 artifacts 标准化后提供结构化分析视图与可复现的调查流程。
Stars: 0 | Forks: 0
# EvidenceLab
一个基于插件的应急响应调查平台,结合了自动化的证据解析与可选的 LLM 驱动分析。EvidenceLab 摄取 PCAP 捕获文件、Windows 事件日志和内存取证输出,将所有内容存储在 PostgreSQL 中,并为分析师提供一个 Web 仪表板,用于调查事件证据、编写签名并根据摄取的证据对其进行测试。如果在配置中启用,AI 功能可供分析师使用。AI 并非平台及其核心功能运行的必需条件。
## 架构
三容器 Docker Compose 技术栈:
| Container | Role | Network Access |
|-----------|------|----------------|
| **api** | FastAPI web server (port 8000) | Internal + external |
| **repl** | Sandboxed Python REPL for LLM code execution | Internal only (no internet) |
| **db** | PostgreSQL 16 with pgvector | Internal only (no internet) |
LLM 推理通过主机上的 [LM Studio](https://lmstudio.ai/)(OpenAI 兼容 API)运行。REPL 容器通过主机网络调用 LLM —— 无需 API 密钥或云服务。
## 功能
- **证据摄取** -- 上传 PCAP、Windows 事件日志 (.evtx) 或 Volatility3 JSON 输出。确定性解析器将结构化记录提取到 PostgreSQL 中,同时在可用时保留源事件时间戳,包括 Security、PowerShell、Sysmon、Task Scheduler、WMI、Defender、Firewall、AppLocker、WinRM、RDP、SMB、LAPS、Application 和 System Windows 频道。所有摄取模式现在都支持可选的开始/结束日期时间过滤,以便分析师可以在插入记录之前将证据限制在事件窗口内。
- **实时摄取可见性** -- 摄取页面现在为每种摄取模式显示表单级的上传进度条,且 JSON、EVTX 和 PCAP 上传都可以轮询服务器端的摄取任务,而不仅仅依赖浏览器上传状态。当总数已知时,摄取页面和仪表板还会显示后台摄取任务及其已处理与总数的计数,包括激活时间窗口过滤器时的跳过计数。
- **简洁的摄取 UI** -- 高级摄取处理程序名称默认保持折叠状态,以便页面专注于上传模式、任务进度和案件记录计数。
- **Suricata + Zeek + tshark** -- PCAP 文件在摄取期间会自动由这三个工具处理。
- **检测规则** -- 通过 Web UI 导入、创建、编辑和部署 Suricata 和 Sigma 规则。LLM 也可以根据调查发现生成规则。
- **确定性规则辅助** -- 显示合并的检测上下文表,包含签名优先级、字段/值锚点以及案件本地计数,以帮助分析师在无需 AI 的情况下构建 Sigma 和 Suricata 规则。
- **RLM 调查循环** -- 有步骤限制的推理循环,LLM 在沙箱化的 REPL 中编写并执行 Python 代码以调查证据。
- **仪表板与分析** -- 交互式狩猎工作区,配备受 ATT&CK 启发的 Windows 入门过滤器、预计算的 SQL 分析、误报感知实体提取和记录浏览。
- **可配置记录列** -- 记录页面现在允许分析师选择表中显示的证据字段,以便无需打开每条记录即可显示有用的值,例如 `EventRecordID`、任务名称、用户名、镜像路径或其他高信号字段。
- **固定记录滚动条** -- 当记录表比视口宽时,底部会保留一个固定的水平滚动条,以便分析师无需先滚动到表格底部即可在各列之间移动。
- **Windows 事件分析字段** -- 分析功能现在公开嵌套的 Windows 事件路径,例如 `EventData.TargetUserName`、`EventData.Image` 和 `System.TimeCreated.SystemTime`,以便分析师可以直接查询源自 EVTX 的数据而无需编写 SQL。
- **时间戳感知分析过滤器** -- 分析页面可以直接过滤原生的 `ts` 时间戳字段,包括带有 `contains` 运算符的部分时间戳文本搜索,例如 `2025-09-02 11:2`。
- **安全的分析渲染** -- 诸如嵌套 Windows `EventData` JSON 之类的大字段值在分析结果中呈现为转义的文本,即使单元格可点击以添加过滤器。
- **固定分析滚动条** -- 当分析结果比视口宽时,底部会保留一个固定的水平滚动条,以便分析师无需先滚动到表格底部即可在结果列之间移动。
- **分析请求保护** -- 如果您在前一个查询完成之前切换选项卡或启动新的分析查询,过时的结果将被忽略,因此较旧的 Correlate 响应不会覆盖较新的 Browse 搜索。
- **Windows ATT&CK 映射过滤器** -- 分析页面可以从捆绑的 Windows ATT&CK 映射数据集中加载战术、技术和 EventID 入门过滤器。
- **插件系统** -- 证据类型由插件(`pcap`、`winevt`、`memory`、`threat-hunter`)处理,每个插件都有自己的摄取处理程序、分析和提示词。
- **RBAC** -- 基于角色的访问控制(admin、case_manager、analyst),采用 JWT 认证。管理员可以从管理页面管理用户、删除证据、案件、单个任务和检测规则。
- **报告生成** -- 包含证据引用和 MITRE ATT&CK 映射的结构化报告。
- **用户手册** -- 可从侧边栏访问的可搜索应用内用户手册,涵盖每个页面和功能。
## 快速开始
### 前置条件
- Docker 和 Docker Compose
- 在主机上运行并加载了模型(例如 `qwen2.5-coder-32b-instruct`)的 [LM Studio](https://lmstudio.ai/)
### 设置
1. 克隆仓库:
git clone https://github.com/Sphinx-AxIS/EvidenceLab.git
cd EvidenceLab
2. 创建您的环境文件:
cp .env.example .env
# 编辑 .env — 至少更改 POSTGRES_PASSWORD 和 JWT_SECRET
3. 启动技术栈:
cd docker
docker compose up --build -d
4. 在 `http://localhost:8000` 打开 Web UI
### 首次调查
1. 从 **Cases** 页面创建一个案件
2. 导航到 **Ingest** 并上传 PCAP、EVTX 或 Volatility JSON 文件
3. 使用可点击的记录类型卡片或 Windows ATT&CK 入门过滤器从 **Analytics** 页面进行狩猎
4. 在 **Records** 中打开特定结果以检查事件上下文并决定其是否值得检测
5. 从该检查的事件或数据包切入引导式的 Sigma 或 Suricata 规则构建器
6. 从 **Tasks** 页面创建调查任务
7. 审查 LLM 发现并生成报告
Suricata 构建器现在引导分析师完成无 AI 工作流程:审查规范化流、选择检测策略、选取内容匹配样式、点击高/中/低候选原子,并观察规则预览自动更新,同时完整源记录 JSON 保持可见。负载预览显示为转义的 JSON 样式字符串,JSON 窗格呈现为转义文本,对于行为/服务样式的草稿,默认忽略高端临时端口,候选内容原子现在会指出它们是在单个帧中看到还是仅在流重组后看到。在可能的情况下,预览还从所选锚点的实际帧来源派生报头方向和 `to_server`/`to_client` 流提示,而不是仅依赖流范围的端口摘要。由于 tshark 流摘要仅捕获流中第一个承载负载的数据包,新的 `tshark_stream` 记录现在还存储从服务端口推断出的规范客户端/服务器角色,以便构建器可以显示原始流方向和更稳定的客户端/服务器解释。当 EvidenceLab 可以将内容锚点绑定到特定的承载负载的帧时,显示的源/目标端点锚点将遵循该锚点帧上下文,而不是粗略的流摘要,并且显式的 `flow:to_server` / `flow:to_client` 卡片现在使用相同的活动锚点上下文。IP 和端口的端点卡片现在可以覆盖,因此当初始方向需要修正时,分析师可以在卡片内直接交换 `src`/`dst` 并从观察到的端点值中进行选择。流卡片现在也可以覆盖,带有常见 Suricata `flow` 关键字的下拉菜单和单独的流范围控制,以便分析师可以选择确切的流约束以带入草稿。显式流选择现在覆盖构建器推断的方向,并且不再静默自动添加 `only_stream` / `no_stream`。在推荐模式下,依赖重组的字符串通常呈现为弹性 Token 序列 PCRE,但如果构建器可以证明强子 Token 完全在一个承载负载的帧内看到,它会优先使用该数据包范围的文本,并对卡片和预览使用相同的回退锚点上下文。单数据包文本锚点也避免自动添加 `flow` 关键字,因为这些约束可能会过度限制规则,并且默认复选框选择现在从保守开始,而不是预选弱端口或流锚点。当分析师显式选中 IP、端口或流锚点时,该选择会带入实时草稿,而不是被推断的默认值静默覆盖。如果未选择内容锚点且未选择端口锚点,预览现在将报头保留为 `any any -> any any`,而不是静默回填来自流摘要数据的服务端口。
Sigma 构建器现在为 Windows 事件规则镜像了同样的无 AI 工作流程:审查源事件和案件范围的支持上下文,选择确定性 Sigma 原子(如 `EventID`、`logsource.service` 和稳定的 `EventData.*` 字段),在需要时直接在每个卡片内覆盖字段/运算符/值,并观察 Sigma YAML 预览实时更新。手动 Sigma 规则表单现在可以在保存或部署草稿规则之前,针对当前案件的 Windows 事件记录对其进行测试,并显示样本匹配记录和用于验证的编译 SQL。同一个块(如 `selection`)内的 Sigma 选择器字段现在使用正确的 AND 语义进行验证,因此当 `EventID` 和 `Channel` 一起出现在同一个选择器中时,它们必须同时匹配。
如果 Sigma 草稿返回零匹配,手动测试器现在还会运行确定性探测变体,以显示未命中是否由 `Channel`、`EventID`、`logsource.service` 或多 Token `|contains` 子句等选择器过于严格引起。
分析页面现在还包括一个 `Rule Matches` 选项卡。分析师可以从当前案件/全局规则库中选择检测规则,并按需针对当前案件运行它。Sigma 规则重用其编译的 SQL 路径,而 Suricata 规则通过 SID 映射到托管的 `suricata_alert` 记录。该选项卡支持规则标题/类型、匹配记录 ID、时间戳、频道和 EventID/SID 的过滤器,每行都包含到记录详情和规则审查的直接跳转。
在手动 Suricata 规则表单上,分析师还可以在保存或部署草稿规则之前,针对当前案件最新上传的 PCAP 对其进行测试。上传的 PCAP 会被保留,因此在摄取之后此重放路径仍然可用。如果主规则返回零匹配,EvidenceLab 现在会显示自动探测变体,以帮助诊断未命中是否由方向、源与目标服务端口位置、流关键字、仅流匹配、所选内容模式或更广泛的测试路径问题引起。
## Suricata 规则
自定义检测规则位于 `data/suricata-rules/` 中。Suricata 自动从此目录加载所有 `*.rules` 文件。
**捆绑规则:**
- `rlm-post-compromise.rules` -- 自定义 LOTL(Living-off-the-land)攻击后检测规则
**添加 ET Open 规则:**
```
# 在有互联网访问权限的机器上:
sudo apt install suricata-update
cd data/suricata-rules
suricata-update --output . --suricata-version 7.0.10
```
规则也可以通过 **Admin: Data** 页面导入数据库,以便通过 Web UI 进行编辑和生命周期管理。
## 项目结构
```
EvidenceLab/
├── config/
│ └── suricata/ # Suricata config (offline PCAP mode)
├── data/
│ └── suricata-rules/ # Active Suricata rule files
├── docker/
│ ├── Dockerfile # API container
│ ├── Dockerfile.repl # REPL sandbox (Suricata, Zeek, tshark)
│ └── docker-compose.yml
├── docs/
│ ├── plans/ # Design documents
│ └── user_manual.md # Searchable user manual (also served in-app)
├── sample_data/ # Example evidence files for testing
├── sql/ # Database migrations (run at startup)
├── src/
│ └── sphinx/
│ ├── core/ # Platform core (API, auth, RLM loop, UI)
│ └── plugins/ # Evidence type plugins
├── tests/
├── .env.example
├── pyproject.toml
└── requirements.txt
```
## 配置
关键环境变量(见 `.env.example`):
| Variable | Description | Default |
|----------|-------------|---------|
| `POSTGRES_PASSWORD` | Database password (API container) | `changeme` |
| `REPL_DB_PASSWORD` | Database password (REPL container, restricted role) | `repl_changeme` |
PCAP 转换在隔离的 REPL 容器内运行,但派生的 Suricata、Zeek 和 tshark 记录通过专用的内部摄取连接写回。交互式 REPL 会话保留在受限制的 `sphinx_repl` 角色上。
| `JWT_SECRET` | Secret for signing auth tokens | `changeme-...` |
| `LM_STUDIO_URL` | LM Studio API endpoint | `http://localhost:1234/v1` |
| `LLM_MODEL` | Model name for LM Studio | `qwen2.5-coder-32b-instruct` |
| `RLM_MAX_STEPS` | Max steps per investigation task | `15` |
| `SPHINX_PORT` | Host port for the web UI | `8000` |
## 安全模型
### 网络隔离
- **REPL** 容器(LLM 生成的代码执行处)**没有互联网访问权限** —— 它只能访问数据库并通过 Unix socket 与 API 通信。
- **数据库**没有**互联网访问权限** —— 只有 API 和 REPL 容器可以连接。
- 只有 **API** 容器暴露给主机网络。
### 数据库角色分离
-API** 容器以 `sphinx`(完全访问权限)身份连接,用于迁移、用户管理和摄取。
- **REPL** 容器以 `sphinx_repl` 身份连接,这是一个受限的 PostgreSQL 角色,对证据表只有 SELECT 权限,且无权访问管理表(`users`、`case_assignments` 等)。
### 行级安全 (RLS)
PostgreSQL RLS 策略在数据库层面强制执行案件范围划分。REPL 在连接时设置 `app.readable_case_ids`,数据库确保 LLM 生成的查询仅返回来自授权案件的数据。
### LLM 认证
启动时会自动创建一个 `llm_agent` 服务账户。当任务运行时,会生成一个短生命周期的 JWT(30 分钟过期),其范围限定于任务的案件(调查员模式)或源案件(关联器模式)。
## 许可证
私有仓库。保留所有权利。
标签:AI 辅助分析, AV绕过, DLL 劫持, DNS 反向解析, Docker, Docker Compose, EVTX 解析, FastAPI, Incident Response, LLM, Metaprompt, PCAP 分析, pgvector, PostgreSQL, Python, SecList, SIEM 替代, SOC 工具, Unmanaged PE, Volatility3, Web 仪表盘, Windows 事件日志, 人工智能, 内存取证, 取证平台, 取证解析, 可复现调查, 大语言模型, 子域名变形, 安全运营, 安全防御评估, 扫描框架, 插件化架构, 数字取证, 无后门, 测试用例, 用户模式Hook绕过, 结构化数据, 网络安全, 网络流量分析, 自动化脚本, 蜜罐分析, 证据摄入, 请求拦截, 调试插件, 逆向工具, 隐私保护