sebastianspicker/rootstock

GitHub: sebastianspicker/rootstock

Rootstock 是一款 macOS 安全分析工具套件,通过收集主机安全证据并导入 Neo4j 进行攻击路径建模与分析,辅助安全评估与应急响应。

Stars: 0 | Forks: 0

# Rootstock [![Build](https://static.pigsec.cn/wp-content/uploads/repos/cas/09/097271ca091990be630ef6043309cc48240faa054413384202036fa2efedb2d2.svg)](https://github.com/sebastianspicker/rootstock/actions) [![Codacy](https://app.codacy.com/project/badge/Grade/8b8c55c173964e039f5b1e7629cca6b2)](https://app.codacy.com/gh/sebastianspicker/rootstock/dashboard) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13235/badge)](https://www.bestpractices.dev/projects/13235) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/sebastianspicker/rootstock/badge)](https://scorecard.dev/viewer/?uri=github.com/sebastianspicker/rootstock) Rootstock 是一个 macOS 安全分析工具的代码库。其核心工作流会将本地安全元数据收集到 JSON 制品中,将该制品导入 Neo4j,推导出安全关系,并提供查询、报告和本地图查看器。 该代码库还包含独立构建的 Red 和 Blue 包。它们与核心共享 macOS 安全词汇表,但使用独立的制品,除非操作员运行明确的桥接命令,否则不会输入到核心图中。 ## 当前功能 | 组件 | 已实现的角色 | 主要制品 | |---|---| | 核心收集器 | 读取本地 TCC、entitlement、代码签名、持久化、Keychain 元数据、XPC、MDM、身份及相关主机证据 | `scan.json` | | 核心图 | 验证并导入扫描,推导关系,运行 Cypher 查询,编写报告,并提供仅限回环且经过身份验证的查看器 API | Neo4j 数据、报告或查看器 HTML | | cve-scan | 收集明确范围内的包、服务、Web、TLS 和 IaC 证据,并可写入图桥接制品 | `rootstock-export.json` | | Rootstock Red | 执行只读主机评估并写入结构化发现结果;其独立的实验室可执行文件包含受授权控制、默认为 dry-run 的验证操作 | JSON、JSONL、SARIF 或 Markdown 格式的发现结果 | | Rootstock Blue | 将离线 macOS 制品解析为事件响应案例、时间线、检测和报告;可选的实时 Endpoint Security 功能具有额外的平台要求 | `.rsbcase` 案例包 | 有关制品边界和可选的互操作命令,请参阅[产品系列](docs/FAMILY.md)。 ## 已知限制 - 核心收集仅限 macOS,且表示的是某一时间点的主机快照。 - 如果没有完全磁盘访问权限,收集器返回的 TCC 数据可能不完整。 - 图导入、推理、查询、报告和 API 行为需要 Neo4j 5.x。 - 在此 alpha 版本中,核心 API 及其 Neo4j 连接特意设计为仅限回环访问。 - 推导出的攻击路径描述的是建模的先决条件。它们并不能证明漏洞利用一定会成功。 - Red Lab 仅能通过其独立的可执行文件和明确的授权控制来修改系统状态。它不属于默认的评估二进制文件。 - Blue 实时 Endpoint Security 操作需要签名、entitlement 和系统批准。离线 fixture 支持的行为比实时扩展路径具有更广泛的测试覆盖率。 - 在 `0.1.0-alpha.1` 核心发布程序中,Red 和 Blue 保留独立的版本标签,并且是仅包含源代码的组件。 ## 要求 | 表面 | 要求 | |---|---| | 核心收集器 | macOS 14 或更高版本;Xcode 26.6 中的 Swift 6.3 | | Rootstock Red | macOS 13 或更高版本;Swift 6.2 或更高版本 | | Rootstock Blue | macOS 14 或更高版本;Swift 6.2 或更高版本 | | RootstockMacFacts | macOS 13 或更高版本;与 Swift tools 6.0 兼容的工具链 | | 核心图 | Python 3.10 或更高版本;`uv`;Neo4j 5.x | | cve-scan | Python 3.11 或更高版本;用于锁定开发环境的 `uv` | | 查看器开发 | `.node-version` 中指定的 Node.js;npm 11.17.0 | | Neo4j 集成测试 | Docker 或其他可访问的 Neo4j 5.26 社区版实例 | 收集器清单需要 Swift tools 6.3。Swift 6.2 工具链无法构建它。 ## 安装和构建 ### 核心收集器 ``` cd collector swift build -c release cd .. ``` 发布的可执行文件是 `collector/.build/release/RootstockCLI`。 ### 核心图环境 ``` uv sync --project graph --locked --all-extras ``` ### cve-scan 环境 ``` uv sync --project modules/cve-scan --locked --all-extras ``` ### 查看器开发环境 ``` npm ci --no-audit --no-fund --ignore-scripts npx --no-install playwright install chromium ``` ## 配置 核心图使用这些环境变量: - `NEO4J_URI`,默认为本地 Bolt endpoint - `NEO4J_USER` - `NEO4J_PASSWORD` - `ROOTSTOCK_API_TOKEN`,`/api/*` 路由必需,且至少为 32 字节 使用以下命令生成临时查看器 API token: ``` export ROOTSTOCK_API_TOKEN="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')" ``` 已提交的 `.env.example` 仅作为公开示例。请勿提交包含具体内容的环境文件。CVE 刷新和范围内的网络证据是可选的;核心收集器本身没有网络收集路径。 ## 核心用法 运行扫描: ``` collector/.build/release/RootstockCLI --output scan.json ``` 当仅需较小范围的扫描时,选择模块: ``` collector/.build/release/RootstockCLI --output scan.json --modules tcc collector/.build/release/RootstockCLI \ --output scan.json --modules entitlements,codesigning ``` 验证制品: ``` uv run --project graph --locked \ python scripts/validate-scan.py scan.json ``` 启动 Neo4j 并运行图 pipeline: ``` (cd graph && NEO4J_AUTH=neo4j/CHANGE_ME docker compose up -d) NEO4J_PASSWORD=CHANGE_ME uv run --project graph --locked \ bash graph/pipeline.sh scan.json ``` 启动经过身份验证的本地查看器 API: ``` NEO4J_PASSWORD=CHANGE_ME uv run --project graph --locked \ bash graph/pipeline.sh scan.json --serve 8000 ``` 停止 Compose 服务而不删除图数据: ``` (cd graph && NEO4J_AUTH=neo4j/CHANGE_ME docker compose down) ``` Neo4j 将数据库和日志数据存储在 `graph/docker-compose.yml` 声明的命名卷中。`docker compose down` 会保留这些卷。 要删除本地数据库和日志,请在确认 Compose 项目不包含您需要的数据后,使用以下破坏性命令: ``` (cd graph && NEO4J_AUTH=neo4j/CHANGE_ME docker compose down --volumes) ``` 在同一次 pipeline 运行中导入现有的 cve-scan 桥接: ``` NEO4J_PASSWORD=CHANGE_ME uv run --project graph --locked \ bash graph/pipeline.sh scan.json \ --cve-scan-export modules/cve-scan/runs/local/rootstock-export.json ``` 无需收集真实主机即可使用[合成示例](examples/README.md)。报告和查看器文件属于被忽略的输出目录。 ## 界面截图 这些图像是所维护的 Graphite Laboratory 查看器在使用公开的七节点合成 fixture 时的 Playwright 捕获。它们在不读取真实扫描的情况下测试了生产模板、样式表、bundle、证据档案、路径构建器和图过滤器。它们并不证明实时 Neo4j 或 API 的行为。 选择截图以打开全尺寸捕获。 | 概览 | 证据档案 | |---|---| | [![Synthetic Paths workspace overview](https://static.pigsec.cn/wp-content/uploads/repos/cas/38/383c4900210670818a504c4bf47383a31995e781ed7681cce7320998b8817591.png)](docs/screenshots/viewer-overview.png) | [![Synthetic Full Disk Access evidence dossier](https://static.pigsec.cn/wp-content/uploads/repos/cas/31/31036508c3c244da68949092069fd749a1fbcee958a49c656973ad7a6eb41668.png)](docs/screenshots/viewer-node-inspector.png) | | 建模路径 | 风险过滤器 | |---|---| | [![Synthetic two-hop modeled path](https://static.pigsec.cn/wp-content/uploads/repos/cas/5d/5db9ca165649630ed3ceeb915c4251139eed7544c5bb0f7bec5a0ed107a5a852.png)](docs/screenshots/viewer-attack-path.png) | [![Synthetic attack-path and vulnerability filters](https://static.pigsec.cn/wp-content/uploads/repos/cas/9d/9d93187a5c01129fda3ef048183dea9fc919f104b82e34a5f48f24e3160dd14e.png)](docs/screenshots/viewer-risk-filter.png) | 捕获说明和隐私规则在 [docs/screenshots/README.md](docs/screenshots/README.md) 中。 ## 开发和验证 运行受更改影响的组件检查。完整的本地候选集为: ``` # Core collector,需要 Swift 6.3 (cd collector && \ swift build -Xswiftc -strict-concurrency=complete -Xswiftc -warnings-as-errors && \ swift test --parallel \ -Xswiftc -strict-concurrency=complete -Xswiftc -warnings-as-errors) # 共享与家庭 Swift packages (cd packages/RootstockMacFacts && swift build && swift test) (cd rootstock-red && swift build --product rootstock-red && swift test) (cd rootstock-blue && \ swift build --product rootstock-blue && swift test && \ make content-validate && make check-non-goals) # Core graph 和 contracts uv run --project graph --locked ruff check graph/ scripts/ examples/ docs/ \ --exclude docs/archive --exclude docs/private uv run --project graph --locked pytest graph/tests python3 scripts/check-scan-contract-fields.py python3 scripts/check-technique-catalog.py uv run --project graph --locked \ python scripts/validate-scan.py examples/demo-scan.json # cve-scan (cd modules/cve-scan && uv run --locked ruff check . && uv run --locked pytest) # Viewer npm run typecheck npm run bundle npm run test:viewer:unit npm run test:viewer:bundle npm run test:viewer:performance npm run test:browser # Script contracts bash tests/scripts/test_benchmark.sh # Release 结构 python3 scripts/check-release.py ``` 需要 Neo4j 的流程是独立的: ``` (cd graph && ROOTSTOCK_REQUIRE_NEO4J=1 NEO4J_PASSWORD=CHANGE_ME \ uv run --locked pytest tests -v --tb=short) NEO4J_PASSWORD=CHANGE_ME uv run --project graph --locked \ bash tests/integration/test_full_pipeline.sh ``` 如果此流程未运行,请勿将快速测试概括为实时图验证。请参阅[质量门禁](docs/QUALITY.md) 和[发布程序](docs/RELEASING.md)。 ## 代码库结构 ``` collector/ Core Swift collector graph/ Neo4j import, analysis, reports, API, and viewer modules/cve-scan/ Optional scoped CVE evidence module packages/RootstockMacFacts Shared read-only macOS vocabulary rootstock-red/ Assessment and gated lab Swift packages rootstock-blue/ DFIR and incident-response Swift packages examples/ Synthetic contract fixtures tests/browser/ Playwright end-to-end tests tests/integration/ Cross-component integration tests tests/scripts/ Repository script contract tests tests/viewer/ Viewer unit, bundle, and performance contracts tests/fixtures/ Generators for cross-package test fixtures docs/ Maintained public documentation scripts/ Validation, operational, release, and screenshot tools ``` ## 故障排除 - `package ... is using Swift tools version 6.3.0`:在构建收集器之前选择 Swift 6.3 工具链。CI 使用 Xcode 26.6。 - 在最近的 macOS 版本上 TCC 结果为空:授予运行收集器的终端完全磁盘访问权限,然后重新扫描。 - Neo4j 连接失败:确认容器健康,Bolt endpoint 是回环地址,并且配置的用户和密码匹配。设置 `NEO4J_PASSWORD` 后,运行 `uv run --project graph --locked python scripts/check-neo4j-connection.py`。 - 查看器返回 `401`:创建一个新的 `ROOTSTOCK_API_TOKEN` 并在查看器会话中输入相同的值。 - 图测试被跳过:将 `ROOTSTOCK_REQUIRE_NEO4J=1` 设置为可访问的 Neo4j 实例,以将必需的集成流程转换为硬失败。 更多案例记录在 [FAQ](docs/FAQ.md) 中。 ## 许可证 此代码库包含多个许可范围: - 核心收集器、图、查看器和根文档使用 [LICENSE](LICENSE) 下的 GPL-3.0; - `modules/cve-scan/` 使用其自身的 [license](modules/cve-scan/LICENSE) 下的 MIT; - `rootstock-red/` 和 `rootstock-blue/` 使用其自身许可文件下的 Apache-2.0。 共享的 `packages/RootstockMacFacts/` 许可范围尚未明确。在发布包含该共享包的公开源代码之前,必须解决此歧义。 核心候选版本的引用元数据位于 [CITATION.cff](CITATION.cff) 中。
标签:MITM代理, 反取证, 命令控制, 安全评估, 库, 应急响应, 数据采集, 暗色界面, 特征检测, 请求拦截, 逆向工具