philcantcode/go-forensic-artifacts
GitHub: philcantcode/go-forensic-artifacts
一个本地优先的 Go 取证制品管理库,通过 SHA-256 内容存储与 SQLite 溯源目录实现不可变的证据保全、完整溯源链与可复现的研究工作流。
Stars: 0 | Forks: 0
# Go 取证制品存储
[](https://github.com/philcantcode/go-forensic-artifacts/actions/workflows/ci.yml)
[](https://pkg.go.dev/github.com/philcantcode/go-forensic-artifacts)
[](LICENSE)
`forensic` 是一个本地优先的 Go 库,用于不可变的取证证据和漏洞研究制品。
一个 repository 配置即可管理持久且独立的 case。每个 case 结合了 SHA-256 内容存储和事务性的 SQLite 溯源目录。
该实现涵盖了设计的版本 1 基准以及完整的第一个垂直切片:
- repository 和 case 的创建、发现、重新打开以及并发访问;
- 分阶段的、原子化的文件与源码树导入,具有独立的 evidence/object occurrence ID 以及惰性的 symlink 元数据;
- agent、session、不可变的 activity、封装的 input、output 和审计链;
- 类型化的 artifact、source locator、断言以及版本化的 finding;
- 类型化的结构化查询、精确的冻结选择以及溯源追踪;
- 确定性的仅复制目录 projection,具有安全路径和清单;
- FTS5 元数据搜索,以及有界的流式字面量/正则表达式字节搜索;
- 确定性的 Markdown 和 JSONL 导出,以及经过验证的 BagIt 交付物;
- 快速、原始、完整以及 projection 的完整性验证;
- 签名的外部 checkpoint;以及
- 可通过稳定 ID 进行验证和恢复的实时 SQLite 快照。
## 快速开始
```
repo, err := forensic.Open(ctx, forensic.Config{
Root: "/srv/forensics",
DefaultAgent: forensic.AgentSpec{
Kind: forensic.AgentSoftware,
Name: "research-agent-7",
},
})
if err != nil { return err }
defer repo.Close()
c, err := repo.CreateCase(ctx, forensic.CaseSpec{Name: "router-firmware"})
if err != nil { return err }
defer c.Close()
evidence, err := c.ImportEvidenceFile(ctx, "firmware.bin", forensic.EvidenceSpec{
Label: "Vendor firmware 3.2.1",
Acquisition: forensic.AcquisitionSpec{Method: "vendor-download"},
})
if err != nil { return err }
session, err := c.StartSession(ctx, forensic.SessionSpec{Label: "config review"})
if err != nil { return err }
defer session.Close(ctx)
run, err := session.BeginActivity(ctx, forensic.ActivitySpec{
Type: forensic.ActivityExtract,
Label: "Extract configuration",
})
if err != nil { return err }
if err := run.Use(ctx, evidence.RootObject, "firmware-image"); err != nil { return err }
config, err := run.CaptureFile(ctx, "config.json", forensic.ObjectSpec{
Role: "extracted-file",
Source: forensic.PathLocator{Display: "etc/config.json", Separator: "/"},
})
if err != nil { return err }
if err := run.Finish(ctx, forensic.OutcomeSucceeded()); err != nil { return err }
selection, err := session.Freeze(ctx, forensic.FreezeSpec{
Name: "JSON configuration",
Query: forensic.And(
forensic.KindIs(forensic.EntityObject),
forensic.PathGlob("**/*.json"),
),
})
```
每个选定的 artifact 都可以通过其生成 activity 和具名 input 进行追踪,
并使用 `Case.Trace` 回溯到原始的受管字节。`Case.Verify`
会检查 catalog、外键、审计链、blob 引用、摘要或物化的 projection,且不会修改 case。
## 存储与安全
实时布局记录在[设计文档](docs/design.md)中。受管 blob 会在
catalog 引用提交之前发布。物化操作始终复制字节;
它们绝不会硬链接到内容存储。导入操作会拒绝 symlink,生成的 path 组件会被净化,并且 projection/package 的目标位置必须位于
权威的 case 目录之外。
支持在单个主机上的跨 goroutine 和协作进程的并发。在 NFS/SMB 上打开 case、分布式写入、实时获取、
物理删除已提交的 evidence,以及对恶意解析器进行沙盒处理,均不在
核心库的范围内。
## 架构决策
简短的决策记录位于 [`docs/adr`](docs/adr) 中:
1. 本地文件系统和 SQLite;
2. 每个 case 独立的 SHA-256 内容存储;
3. 不可变的 activity 溯源;
4. 类型化的 UUIDv7 标识符和规范的审计事件;
5. projection 前冻结;以及
6. Go/SQLite 实现基准。
## 开发
需要 Go 1.25.8 或更高版本。此基准版本包含了 repository、checkpoint 和导出路径所使用的标准库安全修复。
```
go test ./...
go test -race ./...
go vet ./...
```
测试涵盖了在 race detector 下运行的 100 个并发混合 worker、
多进程的导入/查询/标记/冻结、在持久化边界处的强制进程终止、导出故障注入、确定性 projection、可移植恢复、
path/manifest 模糊测试种子,以及故意的 blob/catalog/package 损坏。
验收证据映射在
[docs/implementation-status.md](docs/implementation-status.md) 中。
## 发布与安全
发布使用语义化版本控制,并在完整测试套件通过后从签名或带注释的
`v*` 标签发布。请参阅 [RELEASING.md](RELEASING.md)
和 [CHANGELOG.md](CHANGELOG.md)。在版本 1.0 之前,次要版本可能包含
破坏性的 API 更改。
请使用 GitHub 的安全公告表单私下报告疑似漏洞,
如 [SECURITY.md](SECURITY.md) 中所述。
## 许可证
本项目基于 [MIT 许可证](LICENSE) 提供。
标签:EVTX分析, Go, Ruby工具, SQLite, Zenmap, 审计日志, 情报收集, 数字取证, 数据完整性, 日志审计, 漏洞研究, 自动化脚本