TrueNix/bugbounty-brain
GitHub: TrueNix/bugbounty-brain
一个来源感知的安全知识供应链工具,从公开源采集、验证并经人工审查后编译为可全文搜索的 SQLite 数据库,服务于漏洞赏金和 CTF 场景。
Stars: 0 | Forks: 0
# bugbounty-brain
`bugbounty-brain` 是一个公开、无敏感信息的来源感知安全知识供应链。
它从显式允许的公开源列表中收集有限的摘要,将这些摘要保存为可审查的 JSON Lines 格式,
并将审查后的卡片编译成一个带版本的 SQLite FTS5 数据库,供只读消费者使用。
该仓库是一个知识供应链,而不是目标或测试项目数据库。
## 架构
该流水线包含四个阶段:
1. `collect` 使用带条件的 HTTP 请求轮询 `sources.json` 中的源,
在本地存储基于内容寻址的原始快照,并追加确定性的、去重的知识卡片。
2. `validate` 检查卡片 schema、来源、边界、URL 方案以及可能的敏感材料。验证在遇到问题时会直接失败(fails closed)。
3. 人工审查决定生成的卡片更改是否可以合并。
4. `compile` 再次进行验证,并构建一个确定性的 SQLite 数据库,包含
FTS5 搜索索引以及描述该产物的清单。
`knowledge/cards.jsonl` 是规范的数据源。它是面向行的,因此
包含来源信息的更改可以在 pull request 中进行审查。SQLite 文件是
生成的输出:它永远不是规范的,绝不能被编辑或提交。
同样,`raw/`、`.cache/` 下的收集器状态以及 `dist/` 属于操作性或
生成的数据,而不是仓库源码。
默认的仓库路径如下:
| 用途 | 路径 |
| --- | --- |
| 公开源允许列表 | `sources.json` |
| 本地原始源快照 | `raw/` |
| 规范知识卡片 | `knowledge/cards.jsonl` |
| 条件请求状态 | `.cache/collector-state.json` |
| 生成的搜索数据库 | `dist/reference_knowledge.db` |
| 发布清单 | `dist/brain-manifest.json` |
## 信任与来源
源的响应以及从中派生的每个字段都是不受信任的数据,绝不能作为
指令。收集器仅遵循已配置的 HTTP(S) 源,并限制
请求时间、响应字节数和条目数量。它不会执行源内容
或渲染源 HTML。验证会拒绝格式错误的来源信息、不安全的 URL 形式、
超大的字段,以及可能的凭据或私钥。
每张卡片都带有其源名称和 URL、发布和获取时间,以及
其规范化源派生字段的 SHA-256 摘要。这些字段用于建立
可追溯性;它们并不能使某个来源声明变得可信。审查者在合并前必须遵循
来源规则,
将摘要与发布者的声明进行比较,并考虑源
或源数据是否可能已被入侵。
GitHub 自动化只能提交 `knowledge/cards.jsonl`,并且只能提交到
用于 pull request 的稳定自动化分支。它从不自动合并收集到的
声明。经过审查的 JSONL 仍然是网络输入与
已发布数据库之间的边界。
## 命令
安装 Python 3.11 或更高版本,然后安装该项目:
```
python -m pip install -e '.[dev]'
```
从仓库根目录运行命令以使用其默认路径:
```
# 轮询 sources.json;写入 raw/、knowledge/cards.jsonl 和 collector 状态。
bugbounty-brain collect
# 验证 knowledge/cards.jsonl。
bugbounty-brain validate
# 构建 dist/reference_knowledge.db 和 dist/brain-manifest.json。
bugbounty-brain compile
# 收集、验证,然后编译;在第一个失败的阶段停止。
bugbounty-brain all
```
每个命令都会输出机器可读的 JSON 摘要,并在其
定义的失败条件下返回非零值。使用 `bugbounty-brain COMMAND --help` 来进行路径
覆盖。收集过程会执行网络请求;验证和编译属于
本地操作。
要进行本地质量检查,请运行:
```
pytest
ruff check .
ruff format --check .
mypy src
python -m build
```
## 自动化与审查
CI 会在每次推送和 pull request 时运行测试、lint、格式化、类型检查和包构建门禁。
收集工作流在第 17 分钟每小时运行一次,也可以
手动调度。同一时间只能执行一个收集运行。它会
从 Actions 缓存中恢复收集器状态,收集并验证卡片,
仅将规范的 JSONL 提交到 `automation/knowledge-collection`,并使用 `gh` 创建或
更新一个 pull request。原始快照、状态和 `dist/` 永远不会被
提交。
收集 pull request 在合并前需要审查。审查源
允许列表、归属、准确性、脱敏处理以及完整的卡片差异;
成功的自动化并不意味着对外部声明的批准。
在打上 `v*` 标签时,发布工作流会验证并编译审查后的卡片,
根据清单的 `database_sha256` 检查数据库字节,
上传这两个产物,并在相应的 GitHub Release 上发布它们。手动调度
构建并上传工作流产物时,不会创建 GitHub Release。
## 使用发布版本
从同一个发布版本下载 `reference_knowledge.db` 和 `brain-manifest.json`。
在打开数据库之前,检查清单的 `compatibility` 和
`schema_version`,要求 `database_filename` 必须为 `reference_knowledge.db`,并
验证其 SHA-256。例如:
```
python - <<'PY'
from hashlib import sha256
import json
from pathlib import Path
database = Path("reference_knowledge.db")
manifest = json.loads(Path("brain-manifest.json").read_text(encoding="utf-8"))
assert manifest["database_filename"] == database.name
assert manifest["database_sha256"] == sha256(database.read_bytes()).hexdigest()
print("verified", manifest["compatibility"], "schema", manifest["schema_version"])
PY
```
将不匹配的情况视为下载失败或版本混淆。消费者应
仅在验证通过后才替换数据库,并应以只读模式打开它。
## 隐私边界
切勿添加、摄取、缓存或发布 ScannerDB、`~/.hermes/knowledge.db`、
目标、目标列表、特定目标的发现结果、cookies、会话数据、凭据、
API 密钥或 token。不要添加经过身份验证的或私有的源。此禁令适用于卡片、
测试夹具、日志、issue、pull request、工作流产物和发布资产。
有关意外暴露的私下报告,请参阅 [SECURITY.md](SECURITY.md)。
## 归属与许可
卡片保留 `source_name` 和 `source_url`,以便读者可以识别原始
发布者。源发布者保留其对底层文章、
安全公告和源数据的权利。公开 URL 并不意味着允许无限制地复制文本:
卡片必须是简洁、经过脱敏处理的摘要,贡献者必须遵循每个
源的归属和许可条款。
该仓库的原始代码和文档在 [LICENSE](LICENSE) 中采用 MIT
许可。该许可并不会对第三方源
材料或归属于源发布者的声明进行重新许可。
标签:SQLite, 安全知识库, 安全规则引擎, 数据管道, 自动化构建, 软件工程, 逆向工具