staatik/fragchain-core
GitHub: staatik/fragchain-core
FragChain 是一个 LLM 辅助的漏洞检测工程工作台,通过结构化评估流程帮助安全分析师从单个漏洞产出经验证的 Sigma 规则及其他防御制品,并将结果沉淀为社区共享情报。
Stars: 0 | Forks: 0
# FragChain
**一个漏洞防御工程工作台:给定一个漏洞,研究出严谨的防御者能够切实检测、追踪、验证、记录、缓解或投入运营的方案——并产出相应的制品。**
FragChain 接收单个漏洞,并引导分析师完成一项
结构化的、由 LLM 辅助的评估:该漏洞的实际作用是什么、它在
遥测中留下了什么行为、是否真的切实可检测,
并且——只有在检测合理时——起草检测
制品(目前:Sigma 规则,以及缓解计划、遥测
契约和分析师研究任务)。经过验证的攻击链
会回馈到共享的**情报公共区**,这样下一个
遇到相同 CVE 的团队就不必从头开始了。
一个刻意的设计选择贯穿始终:**“不存在可靠的
检测”是一个有效且成功的结果。** FragChain 的构建旨在
产出*更少但更好*的防御制品,而不是为
每个 CVE 生成一条 Sigma 规则(无论是否真的需要)。

## 它的实际情况:
FragChain 处于 **1.0 版本之前**,并非一个已完成的生产级安全产品。README
首先展示了平台正在构建的方向;本节是
关于目前什么是、什么不是事实的直接版本。
**目前端到端可用的功能:**
- 一个分析师驱动的**评估工作区**,它通过
分析师粘贴的来源,运行三循环
内容引擎(漏洞分析 → 威胁情报 → 检测
工程)。
- 在 Loop 2 和 Loop 3 之间设有**确定性可检测性闸口**,当
证据太薄弱而无法进行工程化检测时,会
停止合成。
- **由 LLM 合成的攻击链**映射到 MITRE ATT&CK,并附带
来源引用和逐步骤的检测机会。
- **Sigma 规则生成**由 pySigma 验证,并具有强制性的
人工审查队列以及可配置的到 PR 路由,可指向一个或多个 Sigma 仓库。
- 一个**以 embedding 为先的覆盖映射器**,可区分“通过
ATT&CK 标签匹配”和“实际由语义相似的规则覆盖”。
- 一个 **5 分类可检测性分类器**和一个**制品路由器**,在
每次评估后运行。
- **按需生成**三种非 Sigma 制品类型:缓解
计划、遥测契约和分析研究报告任务。
**咨询性质/分阶段功能(诚实的注意事项):**
- 可检测性分类器是**咨询性质**的——它记录其结论
和推荐制品,但**尚不作为任何操作的闸口**。
- 制品路由器以**兼容模式**运行——它会生成
计划并记录现实与之偏离的地方,但默认情况下 Loop 3 仍
会生成 Sigma。该计划目前无法控制任何东西。
- 非 Sigma 制品生成是**按需的且不受**
计划限制——分析师只需点击“生成”。
- 更广泛的制品词汇表(在
[`AGENTS.md`](AGENTS.md) 中)(Splunk SPL、Sentinel KQL、Elastic、YARA-L、
EDR 追踪、WAF 模式等)**已规划,但尚未发布**。目前存在的只有 Sigma
以及上述三种制品。
- 最初的连接器驱动推送流水线**保留在代码树中,但处于**
休眠状态——详见 [`CLAUDE.md`](CLAUDE.md) §12 / §12.2。
从 CVE 到 Sigma 生成器转变为工作台的分阶段采用计划记录在
[`ADR-0004`](docs/architecture/adr/ADR-0004-staged-defense-engineering-adoption.md);
范围边界(FragChain 拥有什么与明确不拥有什么)在
[`docs/architecture/000-fragchain-scope.md`](docs/architecture/000-fragchain-scope.md)。
## 为什么会有这个项目
今天的检测工程就像在跑步机上:
- 一个 CVE 发布了。有人阅读了它。另一个人阅读了 PoC。第三个人
检查现有的 Sigma 库中是否有类似的内容。
一半的时间,他们重新推导出与另外十个
团队刚刚推导出的相同的攻击链。
- 本能反应是写一条规则——即使诚实的回答是“使用我们现有的遥测无法可靠地检测到它”,或者“这里的正确
做法是缓解,而不是检测。”这种本能反应会产生
嘈杂、低价值的规则,并掩盖了那些实际上需要追踪、
更改遥测或进行更多研究的情况。
FragChain 押注于三件事来改变这项工作的形态:
1. **在生成前进行结构化推理。** 将各个阶段分开——漏洞
机制、行为指标、可检测性分类、
制品路由——将“阅读三篇博客并猜测技术”转变为
可审查的内容,并在每一步都提供引用来源。
2. **合理的“否定”结果。** 分类器和路由器可以得出结论,认为检测是
依赖于环境的、仅限控制的,或者仅仅是
证据不足——并如实说明,而不是强制生成规则。
3. **共享的、版本化的公共资源。** 链、ATT&CK 映射和 EPSS
快照,这样新的部署就可以从预先验证的内容中进行引导,
而不是从冷启动开始运行昂贵的 LLM 合成。
介于两者之间的所有内容都是为了让这些操作变得安全而设置的管道:TLP 传播、
每个规则的出处、在任何规则进入
Sigma 仓库之前的强制性人工闸口、多目标路由,以及异步循环执行,这样缓慢的 LLM
工作就永远不会阻塞请求路径。
## 界面展示
### 寻找评估目标
CVE 浏览器列出了已知的漏洞,并提供日期
范围、CVSS、仅限 KEV、处理状态和来源的过滤器。这是分析师在
打开评估之前选择目标的地方。
(OpenAI-compat)"| LL["LiteLLM · Server 1"] W -->|"chat + embeddings"| LL LL --> LLMs["Operator's LLMs
Anthropic · OpenAI · Bedrock · Ollama"] UI -.optional.-> OCTI["OpenCTI · Server 2"] W <-->|"sync + contribute"| COM[("Intelligence commons
git, default: public")] W -->|"approved-rule PRs"| SIG[("Sigma target repos")] ``` **工作流。** 在 FragChain 内部,评估通过 可检测性闸口运行三个循环,对可检测性进行分类,路由 制品,将 Sigma 规则放入审查队列中,并且(在人工闸口之后)向配置的 Sigma 目标开启 PR: ``` ┌─────────────────────┐ ┌────────────────────────┐ │ Analyst opens │ │ Intelligence commons │ │ assessment (vuln) │◀───────│ (chains, mappings, │ └──────────┬──────────┘ │ EPSS snapshots) │ │ └────────────▲────────────┘ ▼ │ ┌──────────────────────────┐ │ │ Loop 1 → Loop 2 → gate │ │ │ → detectability class │ │ │ → artifact routing │ │ │ → chain bridge → │ │ │ Loop 3 (Sigma drafts) │ │ └──────────┬───────────────┘ │ ▼ │ ┌──────────────────────────┐ │ │ Review queue │ │ │ (priority-scored, │ │ │ TLP-tagged) │ │ └──────────┬───────────────┘ │ ▼ │ ┌──────────────────────────┐ │ │ Human approve / edit / │ │ │ reject → PR to Sigma │ │ │ target repo(s) │ │ └──────────┬───────────────┘ │ ▼ │ ┌──────────────────────────┐ │ │ Validated chain │────────────────┘ │ contributes back │ └──────────────────────────┘ ``` 最初的推送驱动流水线(连接器 → 丰富 → 合成 → 覆盖 → 规则)保留在代码树中,但**根据设计处于休眠状态**——当连接器生态系统(OpenCTI、AttackerKB、供应商 PSIRT 等)足够密集以支持它时,它会回归。有关休眠允许列表,请参见 [`CLAUDE.md`](CLAUDE.md) §12 / §12.2。 ### 阅读指南 - **[`CLAUDE.md`](CLAUDE.md)** — 操作契约。架构、 schema、TLP 传播规则、禁止事项清单、 休眠允许列表。在接触代码之前阅读此文档。 - **[`AGENTS.md`](AGENTS.md)** — 防御工程产品 方向、目标流水线和制品词汇表(在 两者重叠时,以 `CLAUDE.md` 为准)。 - **[`docs/architecture/`](docs/architecture/)** — 活跃的设计文档: 以评估为中心的架构、可检测性分类器 ([`004`](docs/architecture/004-detectability-classifier.md))、 制品路由器([`005`](docs/architecture/005-artifact-router.md))、 覆盖验证和分阶段采用的 ADR。 - **[`docs/superpowers/plans/`](docs/superpowers/plans/)** — 针对正在进行的 功能进行 TDD 任务列表。 - **[`docs/historical/`](docs/historical/)** — M1–M24 构建日志和 最初的转型前设计语料库,为提供背景而保留(非活跃 范围)。 ## 快速开始 FragChain 作为 Docker Compose 堆栈运行在单个主机上(即 下文的“服务器 3”角色)。你需要自行提供 LLM(服务器 1,通过 [LiteLLM](https://github.com/BerriAI/litellm));OpenCTI(服务器 2)是 可选的。 ### 前置条件 - Docker 24+ 带有 Compose v2 插件 - 一个可访问的 **LiteLLM** 端点(URL + API key)— 见下文 - `openssl`,用于一次性生成自签名 TLS 证书 - ~4 GB 可用 RAM ### 1. 启动LLM 代理(服务器 1) FragChain 通过兼容 OpenAI 的 API 与单个 LiteLLM 端点通信。将它指向你想要的任何 chat + embedding 模型——Anthropic、 OpenAI、Bedrock、Azure 或本地 Ollama。 推荐组合:**Claude Sonnet 用于 chat + 在 Ollama 上使用 nomic-embed-text 用于 embedding**(开源,768-d,与 Qdrant 完全匹配)。 ``` # Server 1 上的 litellm_config.yaml model_list: - model_name: claude-sonnet litellm_params: model: anthropic/claude-sonnet-4-6 api_key: os.environ/ANTHROPIC_API_KEY - model_name: nomic-embed-text litellm_params: model: ollama/nomic-embed-text api_base: http://ollama.internal:11434 ``` ``` ollama pull nomic-embed-text # one-time litellm --config litellm_config.yaml --port 4000 ``` 有关针对 OpenAI、Bedrock 和本地 Ollama 的实际示例,请参见 [`docs/litellm-setup.md`](docs/litellm-setup.md)。 ### 2. 配置 FragChain ``` cp .env.example .env # 至少设置: # APP_SECRET_KEY, JWT_SECRET (32+ 字节随机字符) # POSTGRES_PASSWORD, REDIS_PASSWORD, MINIO_ROOT_PASSWORD, QDRANT_API_KEY # LITELLM_BASE_URL, LITELLM_API_KEY # LITELLM_CHAT_MODEL, LITELLM_EMBEDDING_MODEL # ADMIN_PASSWORD (admin/admin 在启动时会被拒绝) ``` 生成高强度密钥: ``` python -c "import secrets; print(secrets.token_urlsafe(48))" ``` ### 3. 生成自签名 TLS 证书 nginx 仅提供 HTTPS 服务。 ``` mkdir -p nginx/certs openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 \ -keyout nginx/certs/fragchain.key \ -out nginx/certs/fragchain.crt \ -subj "/CN=localhost" \ -addext "subjectAltName=DNS:localhost,IP:127.0.0.1" chmod 600 nginx/certs/fragchain.key ``` 对于生产环境,请替换为真实的证书。文件名必须保持为 `fragchain.crt` / `fragchain.key`。 ### 4. 启动堆栈 ``` docker compose up --build -d docker compose ps # wait for healthy ./setup.sh # seed prompts, profiles, presets, ATT&CK ./setup.sh --with-fixture # optionally also import Dirty Frag (CVE-2026-43284) ``` 种子脚本是幂等的,并会通过 LiteLLM 运行 ATT&CK 技术 embedding(约 700 行),因此在运行之前请确保你的 API 容器可以访问你的 embedding 模型。 ### 5. 验证 ``` curl -k https://localhost/api/v1/readyz # public curl -k https://localhost/api/v1/version | jq curl -k -X POST https://localhost/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":""}' | jq
```
然后在浏览器中打开 (接受自签名证书
警告)。
## 运维参考
### 服务布局
| 服务 | 端口 (内部) | 通过 nginx 暴露 | 用途 |
|---|---|---|---|
| nginx | 80 / 443 | 是 — 仅有公共端口 | 终止 TLS,代理 API + UI |
| fragchain-api | 8000 | `/api/`, `/ws/` | FastAPI |
| fragchain-ui | 3000 | `/` | 通过 `nginxinc/nginx-unprivileged` 提供静态 SPA bundle |
| fragchain-worker | — | 否 | Celery worker |
| fragchain-beat | — | 否 | Celery beat 调度器 |
| flower | 5555 | 否 | Celery 监控 (内部) |
| postgres | 5432 | 否 | 应用数据库 |
| redis | 6379 | 否 | Broker + 缓存 + 事件桥接 pub/sub |
| minio | 9000 / 9001 | 否 | 对象存储 (LLM I/O + 制品) |
| qdrant | 6333 | 否 | 向量存储 (服务器 3 本地) |
仅 nginx 会发布端口。其他所有服务都保留在内部
Docker 网络上。
### 常用命令
```
docker compose logs -f # tail all services
docker compose exec fragchain-api alembic upgrade head
docker compose exec fragchain-api python # API shell
docker compose down -v # DEV ONLY — destroys all data
```
### 本地前端开发
```
cd frontend
npm install
npm run dev # Vite dev server on http://localhost:3000
npm run build # Production build → frontend/dist/
npm run lint # tsc --noEmit
```
## 状态、安全、许可
**状态。** 1.0 之前版本,私人概念验证 / 参考项目 — 并非
已完成的生产安全产品。评估工作区和
三循环内容引擎是活跃的工作流;可检测性
分类器和制品路由器以咨询/兼容模式运行;推送驱动
流水线保留在代码树中,但处于休眠状态,等待更密集的
连接器生态系统。
**安全态势。** 在此仓库开放之前,完成了 F-001..F-008 公开前强化阶段——生产环境密钥验证、评估的
逐行授权、一次性 WebSocket 票据、在生产环境中禁用 `/docs` 和
`/openapi.json`、非 root 前端镜像、强化的
nginx + CSP。完整的安全态势和剩余风险记录在:
- [`SECURITY.md`](SECURITY.md) — 报告流程
- [`docs/threat-model.md`](docs/threat-model.md) — 参与者、信任边界、STRIDE 表格
- [`docs/security-review-2026-05-20.md`](docs/security-review-2026-05-20.md) — 发现清单 + 方法论
- [`docs/remediation-log.md`](docs/remediation-log.md) — 包含测试覆盖率的每个发现的补救措施
**许可。** 引擎 + 连接器采用 Apache 2.0 许可。情报
公共数据采用 CC0 1.0 许可(一旦公共区发布)。
**披露。** 通过此仓库的 GitHub Security Advisories 报告安全
问题。请参见 [`SECURITY.md`](SECURITY.md)。
## 项目布局
```
fragchain/ Python package (API, workers, db, modules)
frontend/ React + TypeScript + Vite + DarkOps v3
nginx/ Reverse-proxy config + TLS certs (not committed)
chains/ Ground-truth attack chain fixtures
prompts/ Seed prompts (loaded into DB by setup.sh)
scripts/ Setup + seed scripts
benchmarks/ Coverage benchmark ground-truth
tests/ Pytest suite (unit + integration)
docs/
├── architecture/ Active design notes + ADRs
├── reviews/ Independent security/architecture reviews
├── superpowers/ In-flight plans
├── historical/ M1–M24 build log + original design corpus
├── images/ README screenshots
├── threat-model.md
├── security-review-2026-05-20.md
├── remediation-log.md
└── public-readiness-checklist.md
```
规范的 Python / 前端目录树请参见 [`CLAUDE.md`](CLAUDE.md) §17。
(OpenAI-compat)"| LL["LiteLLM · Server 1"] W -->|"chat + embeddings"| LL LL --> LLMs["Operator's LLMs
Anthropic · OpenAI · Bedrock · Ollama"] UI -.optional.-> OCTI["OpenCTI · Server 2"] W <-->|"sync + contribute"| COM[("Intelligence commons
git, default: public")] W -->|"approved-rule PRs"| SIG[("Sigma target repos")] ``` **工作流。** 在 FragChain 内部,评估通过 可检测性闸口运行三个循环,对可检测性进行分类,路由 制品,将 Sigma 规则放入审查队列中,并且(在人工闸口之后)向配置的 Sigma 目标开启 PR: ``` ┌─────────────────────┐ ┌────────────────────────┐ │ Analyst opens │ │ Intelligence commons │ │ assessment (vuln) │◀───────│ (chains, mappings, │ └──────────┬──────────┘ │ EPSS snapshots) │ │ └────────────▲────────────┘ ▼ │ ┌──────────────────────────┐ │ │ Loop 1 → Loop 2 → gate │ │ │ → detectability class │ │ │ → artifact routing │ │ │ → chain bridge → │ │ │ Loop 3 (Sigma drafts) │ │ └──────────┬───────────────┘ │ ▼ │ ┌──────────────────────────┐ │ │ Review queue │ │ │ (priority-scored, │ │ │ TLP-tagged) │ │ └──────────┬───────────────┘ │ ▼ │ ┌──────────────────────────┐ │ │ Human approve / edit / │ │ │ reject → PR to Sigma │ │ │ target repo(s) │ │ └──────────┬───────────────┘ │ ▼ │ ┌──────────────────────────┐ │ │ Validated chain │────────────────┘ │ contributes back │ └──────────────────────────┘ ``` 最初的推送驱动流水线(连接器 → 丰富 → 合成 → 覆盖 → 规则)保留在代码树中,但**根据设计处于休眠状态**——当连接器生态系统(OpenCTI、AttackerKB、供应商 PSIRT 等)足够密集以支持它时,它会回归。有关休眠允许列表,请参见 [`CLAUDE.md`](CLAUDE.md) §12 / §12.2。 ### 阅读指南 - **[`CLAUDE.md`](CLAUDE.md)** — 操作契约。架构、 schema、TLP 传播规则、禁止事项清单、 休眠允许列表。在接触代码之前阅读此文档。 - **[`AGENTS.md`](AGENTS.md)** — 防御工程产品 方向、目标流水线和制品词汇表(在 两者重叠时,以 `CLAUDE.md` 为准)。 - **[`docs/architecture/`](docs/architecture/)** — 活跃的设计文档: 以评估为中心的架构、可检测性分类器 ([`004`](docs/architecture/004-detectability-classifier.md))、 制品路由器([`005`](docs/architecture/005-artifact-router.md))、 覆盖验证和分阶段采用的 ADR。 - **[`docs/superpowers/plans/`](docs/superpowers/plans/)** — 针对正在进行的 功能进行 TDD 任务列表。 - **[`docs/historical/`](docs/historical/)** — M1–M24 构建日志和 最初的转型前设计语料库,为提供背景而保留(非活跃 范围)。 ## 快速开始 FragChain 作为 Docker Compose 堆栈运行在单个主机上(即 下文的“服务器 3”角色)。你需要自行提供 LLM(服务器 1,通过 [LiteLLM](https://github.com/BerriAI/litellm));OpenCTI(服务器 2)是 可选的。 ### 前置条件 - Docker 24+ 带有 Compose v2 插件 - 一个可访问的 **LiteLLM** 端点(URL + API key)— 见下文 - `openssl`,用于一次性生成自签名 TLS 证书 - ~4 GB 可用 RAM ### 1. 启动LLM 代理(服务器 1) FragChain 通过兼容 OpenAI 的 API 与单个 LiteLLM 端点通信。将它指向你想要的任何 chat + embedding 模型——Anthropic、 OpenAI、Bedrock、Azure 或本地 Ollama。 推荐组合:**Claude Sonnet 用于 chat + 在 Ollama 上使用 nomic-embed-text 用于 embedding**(开源,768-d,与 Qdrant 完全匹配)。 ``` # Server 1 上的 litellm_config.yaml model_list: - model_name: claude-sonnet litellm_params: model: anthropic/claude-sonnet-4-6 api_key: os.environ/ANTHROPIC_API_KEY - model_name: nomic-embed-text litellm_params: model: ollama/nomic-embed-text api_base: http://ollama.internal:11434 ``` ``` ollama pull nomic-embed-text # one-time litellm --config litellm_config.yaml --port 4000 ``` 有关针对 OpenAI、Bedrock 和本地 Ollama 的实际示例,请参见 [`docs/litellm-setup.md`](docs/litellm-setup.md)。 ### 2. 配置 FragChain ``` cp .env.example .env # 至少设置: # APP_SECRET_KEY, JWT_SECRET (32+ 字节随机字符) # POSTGRES_PASSWORD, REDIS_PASSWORD, MINIO_ROOT_PASSWORD, QDRANT_API_KEY # LITELLM_BASE_URL, LITELLM_API_KEY # LITELLM_CHAT_MODEL, LITELLM_EMBEDDING_MODEL # ADMIN_PASSWORD (admin/admin 在启动时会被拒绝) ``` 生成高强度密钥: ``` python -c "import secrets; print(secrets.token_urlsafe(48))" ``` ### 3. 生成自签名 TLS 证书 nginx 仅提供 HTTPS 服务。 ``` mkdir -p nginx/certs openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 \ -keyout nginx/certs/fragchain.key \ -out nginx/certs/fragchain.crt \ -subj "/CN=localhost" \ -addext "subjectAltName=DNS:localhost,IP:127.0.0.1" chmod 600 nginx/certs/fragchain.key ``` 对于生产环境,请替换为真实的证书。文件名必须保持为 `fragchain.crt` / `fragchain.key`。 ### 4. 启动堆栈 ``` docker compose up --build -d docker compose ps # wait for healthy ./setup.sh # seed prompts, profiles, presets, ATT&CK ./setup.sh --with-fixture # optionally also import Dirty Frag (CVE-2026-43284) ``` 种子脚本是幂等的,并会通过 LiteLLM 运行 ATT&CK 技术 embedding(约 700 行),因此在运行之前请确保你的 API 容器可以访问你的 embedding 模型。 ### 5. 验证 ``` curl -k https://localhost/api/v1/readyz # public curl -k https://localhost/api/v1/version | jq curl -k -X POST https://localhost/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"
标签:威胁情报, 开发者工具, 搜索引擎查询, 检测规则生成, 漏洞分析, 路径探测, 逆向工具, 防御工程