Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/bkuan001/halo-record
取证分析供应链安全事件响应AI 安全
GitHubbkuan001/halo-record

halo-record

面向AI智能体的防篡改审计追踪:哈希链式运行时记录,零依赖,任何人可验证。

查看仓库网站
6366619小时13分前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

halo-record

防篡改的 AI 代理审计追踪 —— 哈希链式运行时记录,渲染为运行时报告,你的客户可以自行核验。

你的代理所采取的每一个操作(工具调用、模型调用、数据访问、审批)都会成为仅追加、哈希链式日志中的一条 运行时记录;运行时报告 就是将该链渲染为一个可自验证的 HTML 页面。任何持有该链检查点的一方都可以验证其背后的记录从未被篡改,而无需信任生成这些记录的人——该检查点是承重部件:仅凭链本身,除了运行记录器的一方之外,对所有人都是防篡改的(LIMITS.md §1)。当客户的安全团队问“你的代理对我们的数据做了什么?”时,你递给他们一个链接,而不是一段文字。安全审查已经在 SOC 2 检查清单旁边提出 AI 相关问题——而且这些问题越来越多地来自 ISO 42001、欧盟 AI 法案的记录保存条款,以及客户自己的问卷。如今,一份书面保证仍然能通过。这个项目背后的赌注是,这种情况不会持续太久。

被 Help Net Security 专题报道(2026 年 8 月)。

记录格式是开放的,可自由实现。本包是参考实现:记录器、验证器、见证客户端和报告服务器。

正在使用 halo-record,或者正在考虑? 告诉我你是谁、用来做什么 → 谁在使用 halo-record?

自行核验

有人要求你在代理中放入一个记录器。你不应盲目相信:

  • 零运行时依赖。 仅使用标准库。pip install halo-record 只安装一个包。
  • 无网络调用,除了三个可选启用的调用——锚定到见证方(发送主体 ID、记录数量和两个链指纹——头部和链根)、读回见证方的检查点(发送主体 ID),以及 RFC 3161 时间戳(仅将检查点的状态哈希发送给时间戳机构)。除非你主动调用,否则全部关闭;记录内容永远不会离开你的基础设施。
  • 原始工具参数会被哈希,并附带一份脱敏摘要。 参数以规范哈希加摘要的形式存储:参数文本中已知的密钥和 PII 模式会被掩码,上限为 200 个字符。不匹配任何模式的短输入会完整出现在摘要中;仅哈希模式(summaries=False)完全不保留摘要。脱敏是尽力而为(对常见密钥和 PII 格式的正则表达式,外加一个熵兜底):将其视为纵深防御,而非保证。你提供的 summary 之外的结果字段按原样封存(LIMITS §13)。
  • 小到足以审计。 约 5,300 行 Python(代码行,不计空行和注释)。一个下午就能读完。
  • Apache-2.0。
  • 文档是一等公民。 LIMITS.md(链无法证明什么)、PRIVACY.md(记录包含什么以及什么会离开你的机器)、RETENTION.md(在保留策略下运行),以及 REVIEWERS.md——四命令独立检查,外加审查发现的引用格式。

每一层证明什么——本项目中的承重区分(LIMITS.md §1):你自己持有的链证明记录未被编辑,相对于某人已持有的头部;只有操作者外部持有的检查点才能证明没有记录被移除;而没有任何哈希能证明每一个操作都被捕获。

安装前先看一个: 一个示例运行时报告——虚构数据、真实链,并且它会在你的浏览器中当着你的面重新验证自身。

60 秒演示

无需代理。使用 uv,无需安装任何东西:``` uvx --from halo-record halo demo --serve

root@kitploit:~
或经典方式:```
pip install halo-record
halo demo --serve

要么搭建一个虚构的支持代理供应商,包含两个客户,见证这些链(用一个本地见证文件代表操作者之外的一方——参见 LIMITS.md §1),提供它们受门控的 Runtime Reports,并在你的浏览器中打开操作者控制台。然后尝试篡改测试:从其中一个 .jsonl 文件中删除一行并重新加载。报告会捕获它。

记录你自己的代理

在边界处一行:```python from halo_record import trace

agent = trace(run_my_agent, profile="my-agent", log="audit.jsonl") # wraps your entrypoint; records the run boundary to ./audit.jsonl — add record_call() or a framework adapter at each tool boundary to capture individual calls

root@kitploit:~
一个 `from halo import ...` 的便捷 shim 也会随附发布——但 PyPI 上的 `halo` 名称属于一个无关的终端 spinner 包,如果该包已安装,它会在导入时胜出。`halo_record` 没有歧义,因此示例使用它。

在没有 `log=` 的情况下,记录会写入 `~/.halo/my-agent.jsonl`(每个 agent 一条链)。wrapper 封存运行边界;证据存在于每次调用的记录中。使用框架适配器(见下方矩阵)捕获这些记录——或者显式捕获,这同时展示了委托链接是如何建立的:```python
from halo_record import Recorder, record_call

rec = Recorder("audit.jsonl")

with record_call(rec, "crm.lookup", {"account": "acct-9"}) as call:            # one sealed record per tool call
    call.result = crm.lookup("acct-9")

with record_call(rec, "payments.refund", {"amount": 120},
                 parent_id=rec.last_record_id()) as call:                      # child links to the action that spawned it
    call.result = payments.refund(120)

然后渲染报告:``` halo report audit.jsonl -o report.html # one chain -> self-verifying HTML halo serve ./records --port 8721 # all tenants, gated per customer

root@kitploit:~
快速入门结束时,你会在浏览器中看到自己 agent 的 Runtime Report。如果你拿到的是 JSONL 文件而没有报告,说明出了问题:请提交 issue。

### 验证块

如果某个 guardrail 或策略层检查了该操作,其裁决结果可以附加在记录上——这是一个可选块,记录 gate 做出了什么决定,并像其他所有字段一样被封入哈希链:```python
from halo_record import build

build("tool_call", "security", tool="payments.refund",
      verification={"status": "allowed", "verifier": "gate/1.2",
                    "policy_ref": "sha256:1f3a...",
                    "checked_at": "2026-08-01T12:00:00Z"})

其封存到记录中如下:```json "verification": {"status": "allowed", "verifier": "gate/1.2", "policy_ref": "sha256:1f3a...", "checked_at": "2026-08-01T12:00:00Z"}

root@kitploit:~
`record_call(...)` 接受相同的 `verification=` 关键字参数。`status` 在块内是必需的;`verifier`、`policy_ref` 和 `checked_at` 是可选的。每个状态的含义如下:

| 状态 | 门禁报告的内容 | 操作是否执行? |
|---|---|---|
| `allowed` | 它允许了该操作 | 是——操作继续进行 |
| `blocked` | 它拒绝了该操作 | 由集成决定,而非此字段——记录仍可能携带结果,且阻止本身并不能证明未执行 |
| `modified` | 它在执行前修改了该操作——`action.input` 描述的是**已执行**的操作,即修改后的状态 | 是,以修改后的形式 |
| `unverified` | 它运行了(或被咨询了)但未做出判定——与缺失的块不同,后者意味着根本没有做出验证声明 | 是——操作在没有裁决的情况下继续进行 |

该块由操作者的集成代码提供,并记录其报告的门禁所述内容——与 `principal` 相同的信任姿态(参见 [LIMITS](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md#11-verification-status-is-the-gates-report-not-halos-finding))。密封证明状态在事后未被编辑;它并不证明检查确实发生、裁决正确,或已阻止的操作未执行。这不是独立验证。

要使 `policy_ref` 可用作证据,请使用规则集的内容哈希并保留规则集工件——无法解析的标签会使该字段沦为装饰。

## 连接到您已运行的内容

| 在边界处捕获 | 从现有遥测中摄取 |
|---|---|
| 原生记录器(`from halo_record import trace`) | OpenTelemetry GenAI spans |
| MCP 拦截器 | LiteLLM 回调 |
| LangChain / LangGraph 回调 | Langfuse 导出 |
| OpenAI Agents SDK 钩子 | 任何网关 / 反向代理日志 |
| Claude Agent SDK 钩子 | Claude Code 和 Codex CLI 的 `PostToolUse` 钩子(在工具运行后触发) |

框架适配器和摄取路径会为每条记录打上 `source` 标签,因此报告会披露每条证据的收集方式。捕获的记录和摄取的记录位于同一条链中。

对于 LangChain / LangGraph,它是一个回调处理器:```python
from halo_record import Recorder
from halo_record.integrations.langchain import HaloCallbackHandler

recorder = Recorder("audit.jsonl")
result = my_chain.invoke(inputs, config={"callbacks": [HaloCallbackHandler(recorder)]})   # every tool call becomes a record

对于 MCP,一次调用即可包装客户端会话——随后任何使用 MCP 的 agent 都会为每次工具调用发出记录,无论由哪个框架驱动:```python from halo_record.integrations.mcp import instrument_client_session

instrument_client_session(session, Recorder("audit.jsonl"), server="stripe") # every session.call_tool() is now recorded

root@kitploit:~
对于网关或代理日志(Cloudflare AI Gateway、Portkey、模型前方的 nginx),将日志行映射到链中——明确标记为已摄取,而非边界捕获:```python
from halo_record.integrations.gateway import record_log

record_log(Recorder("audit.jsonl"), {"tool": "gen_ai:gpt-4o", "model": "gpt-4o", "status": 200, "subject": "acme-corp"})

任何发出 OpenTelemetry GenAI span 的内容(CrewAI、LlamaIndex,以及大多数带有 OTel 插桩的 agent 框架)都会通过 OTel 适配器进入链中,而 TypeScript 包 为 Vercel AI SDK 和 JS agent 生态系统提供了原生适配器。缺少适用于你的技术栈的适配器?提交一个 issue。大多数适配器大约只有一百行代码。

记录你的编码 agent(Claude Code 或 Codex)

Claude Code 在每次工具调用后触发 PostToolUse 钩子。将其指向 halo hook,每个操作——文件写入、shell 命令、MCP 连接器调用——都会成为本地链中的一条记录。无需修改代码;只需一项设置条目:```json { "hooks": { "PostToolUse": [ {"matcher": "*", "hooks": [{"type": "command", "command": "halo hook"}]} ] } }

root@kitploit:~
将其添加到 `~/.claude/settings.json`,记录会写入 `~/.halo/audit.jsonl`(可通过 `$HALO_LOG` 覆盖)。不接触任何数据、网络或外部状态的纯编排工具会被跳过——该链记录的是信任边界操作,而非思考过程。设置 `HALO_HASH_ONLY=1` 可仅记录内容哈希而不记录摘要。设置 `HALO_AGENT_VERSION`(以及可选的 `HALO_AGENT_MODEL`)可将每条记录绑定到产生它的 agent 构建版本——当审计人员询问某个时间窗口内运行的是哪个版本时,导出结果会按列给出答案,而不是靠回忆。

Codex CLI 提供相同的生命周期钩子,事件结构也相同(钩子默认开启)。将其添加到 `~/.codex/hooks.json`,Codex 的 shell 命令、`apply_patch` 编辑和 MCP 调用就会写入同一条链:```json
{
  "hooks": {
    "PostToolUse": [
      {"matcher": ".*", "hooks": [{"type": "command", "command": "halo hook"}]}
    ]
  }
}

钩子通过事件本身区分两者(Codex 会添加 turn_id 和 model),并将每条记录标记为 claude-code 或 codex;设置 HALO_HOOK_AGENT 可强制指定其一。两者都属于摄取层:PostToolUse 钩子在工具运行后触发,因此记录是根据 harness 所报告的内容构建的。

如果你需要报告回答“这次运行是在什么规则下发生的?”,请将 HALO_AUTHORITY_FILE 设置为该会话有效权限的 JSON 快照。保持隐私安全:使用哈希和引用,而非原始提示、私有策略文本、机密或完整工具 schema——已知的机密格式会在封存时被遮蔽,但哈希和引用会原样通过,自由格式文本不会被检测(见 LIMITS §6)。仅当底层权限未发生变化时才复用 snapshot_id;具有相同 id 且内容未变的连续记录会被压缩——若复用的 id 对应已更改的内容,则会完整存储,并附带一条通知。```json { "snapshot_id": "auth_2026_07_08T1100Z", "captured_at": "2026-07-08T11:00:00Z", "scope": "session", "workspace": {"path_hash": "sha256:...", "git_commit": "abc1234"}, "refs": [ {"kind": "project_rules", "id": "CLAUDE.md", "hash": "sha256:...", "loaded": true, "truncated": false}, {"kind": "mcp_tool_registry", "id": "filesystem", "hash": "sha256:..."} ], "omissions": [{"kind": "private_policy", "reason": "customer_secret", "hash": "sha256:..."}], "stale_if": ["project_rules_hash_changed", "mcp_tool_registry_hash_changed"] }

root@kitploit:~
## 使用示例

### 基本用法

```bash
# 扫描单个目标
python3 cve_2025_55182.py -t https://target.example.com

# 使用代理扫描
python3 cve_2025_55182.py -t https://target.example.com -p http://127.0.0.1:8080

# 从文件扫描多个目标
python3 cve_2025_55182.py -f targets.txt

# 使用自定义超时和线程数扫描
python3 cve_2025_55182.py -f targets.txt -T 15 -c 20

# 使用自定义载荷扫描
python3 cve_2025_55182.py -t https://target.example.com -P "custom_payload_here"

# 详细输出
python3 cve_2025_55182.py -t https://target.example.com -v

高级用法

root@kitploit:~
# 使用自定义 User-Agent 扫描
python3 cve_2025_55182.py -t https://target.example.com -A "Mozilla/5.0 (Custom)"

# 使用自定义请求头扫描
python3 cve_2025_55182.py -t https://target.example.com -H "X-Custom-Header: value"

# 将结果保存到文件
python3 cve_2025_55182.py -f targets.txt -o results.txt

# 组合多个选项
python3 cve_2025_55182.py -f targets.txt -p http://127.0.0.1:8080 -T 15 -c 20 -v -o results.txt

命令行选项

工作原理

该工具利用了 CVE-2025-55182 中的漏洞,这是一个影响特定 Web 应用程序的远程代码执行(RCE)漏洞。该漏洞存在于应用程序处理用户输入的方式中,允许攻击者通过特制的请求执行任意代码。

漏洞详情

  • CVE ID: CVE-2025-55182
  • 漏洞类型: 远程代码执行(RCE)
  • 受影响组件: Web 应用程序输入处理
  • 严重程度: 严重
  • CVSS 评分: 9.8

利用机制

  1. 侦察: 该工具首先验证目标是否可访问,并识别潜在的漏洞端点。
  2. 载荷投递: 构造并发送包含恶意载荷的特制 HTTP 请求。
  3. 漏洞触发: 应用程序处理载荷,导致代码执行。
  4. 验证: 该工具检查响应以确认利用是否成功。

输出示例

root@kitploit:~
[+] 正在扫描目标: https://target.example.com
[+] 目标可访问
[+] 正在测试漏洞...
[!] 目标易受攻击: https://target.example.com
[+] 利用成功
[+] 命令输出: uid=33(www-data) gid=33(www-data) groups=33(www-data)

免责声明

本工具仅供教育和道德安全测试目的使用。未经授权访问计算机系统是非法的,并可能违反当地、州、国家和国际法律。请始终确保您拥有测试目标系统的明确许可。

作者对因使用或滥用本工具而造成的任何损害或损失不承担责任。用户对自己的行为以及由此产生的任何后果承担全部责任。

参考资料

  • CVE-2025-55182 详情
  • NVD 条目
  • 安全公告

许可证

本项目采用 MIT 许可证 - 详情请参阅 LICENSE 文件。

贡献

欢迎贡献!请随时提交 Pull Request。

  1. Fork 本仓库
  2. 创建您的功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交您的更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开一个 Pull Request

联系方式

  • 作者: Security Researcher
  • GitHub: @username
  • Twitter: @username

致谢

  • 感谢所有为漏洞研究做出贡献的安全研究人员
  • 特别感谢开源社区

⭐ 如果您觉得这个工具对您有帮助,请给这个仓库点个星!```sh HALO_AUTHORITY_FILE=./authority.json halo hook

root@kitploit:~
快照被密封在与操作记录相同的哈希链中。一个良好的默认设置是在开始时生成一个会话级快照,并在规则、Skills、hooks、MCP 工具注册表或压缩策略发生变化时生成新快照。为保持长会话精简,具有相同 `authority.snapshot_id` 的连续记录在第一个完整快照之后会被压缩:后续记录仅保留 `{"snapshot_id": "...", "same_as_previous": true}`。指针仍保持哈希链式连接,但庞大的 refs/omissions/stale-if 块不会在每个操作上重复。(压缩是按记录器进程进行的:hook 式捕获为每次工具调用生成一个进程,当上一个完整快照不是尾部记录时,会重新存储完整主体,因此短生命周期进程以链大小为代价换取复用保护。)

SDK 用户直接附加相同的块——`build(..., authority={...})` 或 `record_call(..., authority={...})`;仅哈希捕获是相同的接口(在任意一个上设置 `summaries=False`):```python
from halo_record import Recorder, record_call

rec = Recorder("audit.jsonl")
with record_call(rec, "crm.lookup", {"account": "acct-9"},
                 authority={"snapshot_id": "auth_1", "rules_hash": "sha256:..."},
                 summaries=False) as call:              # hash-only: no summaries, no excerpts
    call.result = crm.lookup("acct-9")

然后,照常:``` halo verify ~/.halo/audit.jsonl halo report ~/.halo/audit.jsonl -o report.html

root@kitploit:~
任何暴露 post-action hook 的 agent 运行时都可以喂入同一条命令——该 hook 从 stdin 读取一个 JSON 事件并追加一条记录。

一条链,同一时间只有一个写入者。链是一个链表:两个写入者读取同一个 head 并都进行追加,就会使其分叉(两条记录声称拥有同一个前驱),验证过程会指出受影响的记录。`Recorder` 通过 sidecar 锁(此处为 POSIX `flock`;TypeScript 包中为锁目录)串行化自身的追加操作,而 `halo hook` 通过 `Recorder` 进行追加,因此上述 hook 设置已被覆盖。任何直接写入链文件的操作——手写的 hook、并行 worker、日志转发器——都必须在“读取 head 然后追加”这一序列期间持有等效的排他锁,或者写入按进程划分的链。[LIMITS.md 第 9 节](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md#9-single-writer-chains)完整涵盖了这一点,包括跨语言边界。

## 当记录失败时

两种集成方式会以相反的方向失败,这是有意为之——选择那种其失败方式你可以承受的:

- **框架适配器(LangChain,通过 callback manager 实现的 hooks)失败时保持开放。** 如果记录无法写入(磁盘已满、权限不足),agent 的操作会正常完成,而记录则丢失。LangChain handler 会向 stderr 打印一条醒目的警告并统计丢失数量(`handler.lost_records`),但链本身无法显示一条从未被写入的记录——停滞的链仍然能通过验证。按固定节奏设置的 witness checkpoint 才是让停滞的链变得可见的关键:一个预期到达却从未到达的 checkpoint 就是警报。
- **原生 `trace()` 包装器失败时保持关闭。** 如果记录无法写入,异常会传播到 agent 的操作中——没有证据,就没有操作。更严格,但它可能会中断你的 agent。

两种默认行为都不适合所有人;要清楚你正在运行的是哪一种。

## 完整性 vs. 完备性(请阅读这一部分)

要精确理解每一层所证明的内容——因为它们是不同的主张,而这些差异正是关键所在:

自持链证明的是**相对于已确立 head 的完整性**:给定某人已经持有的链 head,其背后记录中的任何编辑、重排序或删除都会变得可检测。就其本身而言——在操作者之外的任何人看到 head 之前——链证明的是内部一致性,而非历史:操作者可以丢弃一条记录并重新密封,而新文件仍能通过验证。链在其 head 离开操作者控制的那一刻就变得**具有历史承诺性**。

这就是 witness:操作者之外的一方持有链的周期性 checkpoint——subject id、记录数量,以及两个链指纹(head 和链根);确切的有效载荷,仅此而已。Checkpoint 使重写已承诺的历史变得可检测,而错过的 checkpoint 本身就是一个可见事件:```
halo anchor audit.jsonl witness.jsonl           # anchor a checkpoint to a local witness
halo anchor audit.jsonl witness.jsonl --check   # completeness verdict against it

对于时间而言,外部 RFC 3161 时间戳用来自操作者无法控制的时间戳机构的证明,取代检查点自我声明的时间——“此链最迟在 T 时刻达到此头部”,可由第三方在无需托管基础设施的情况下验证。默认 TSA 是免费的 freetsa.org(适合评估);生产环境请使用 --tsa 指向商业 TSA(DigiCert / Sectigo / 自建):``` halo anchor audit.jsonl witness.jsonl --timestamp # attach a TSA time proof to the checkpoint halo anchor audit.jsonl witness.jsonl --check # reads the token's claimed time

root@kitploit:~
`--check` 确认令牌绑定此链状态并读取其经证实的时间,但**不会**验证 TSA 的签名——这是有意留给标准工具处理,以便审查者无需信任我们的任何代码。要独立验证时间(这正是你交给安全审查者的内容):```
# tsa.token_b64 lives in the witness log; decode the latest one to a standard .tsr file
python3 -c 'import json,base64; cps=[json.loads(l) for l in open("witness.jsonl") if l.strip()]; t=[c["tsa"] for c in cps if c.get("tsa")][-1]; open("token.tsr","wb").write(base64.b64decode(t["token_b64"])); print(t["digest"])'
curl -s -o tsa-ca.pem https://freetsa.org/files/cacert.pem     # CA for the default TSA (a commercial TSA publishes its own)
openssl ts -verify -digest <the digest printed above> -in token.tsr -CAfile tsa-ca.pem   # → "Verification: OK"

还有一个边界,直白地说:链和见证者都不能证明每一个现实世界的操作都经过了记录器。那是捕获完整性——取决于记录器在技术栈中的位置(原生插桩、钩子、网关摄取),而不是任何哈希。记录中带有 source 标签正是出于这个原因。本页顶部“自己检查”下的声明表就是这三层的总结。

任何人都可以运行一个见证者。你自己运行的见证者将历史提交给你;将其提交给你的客户则需要一个他们有理由信任的见证者。无论哪种方式,协议都是开放的。

一个托管的、被认可的见证者是这个项目维持自身的方式。早期访问:[email protected]。

链中的个人数据

链是仅追加的:任何被封入记录的内容都会留在那里,因为移除它会破坏其后所有内容的验证。工具参数已经处理好了——存储为哈希加上一个被脱敏的摘要,上限为 200 个字符(仅哈希模式不保留摘要)。

注意那句话中的限制:脱敏,而非移除。LIMITS.md 第 6 节明确指出,姓名或邮寄地址没有可靠的模式,因此两者都不会被检测到,也都不会被掩码。而且 subject 并不是唯一携带你提供的文本的字段——principal、approver、session_id、agent、authority、data 以及所有摘要都携带。

有效的模式是:在链中放入一个稳定的假名 id,并将与任何个人的映射保存在一个你可以从中删除的系统中。这样,删除映射即可满足擦除请求。让 subject 指向租户组织,而不是个人:```python from halo_record import build

build("tool_call", "privacy", subject={"id": "acme", "name": "Acme Corp"})

root@kitploit:~
没有任何设置强制这一点——这是你调用记录器时的一种纪律。
它使擦除变得可行;它不是匿名化,而且目前还没有内置的
保留或清理机制。
[LIMITS.md 第 13 节](https://github.com/bkuan001/halo-record/blob/main/LIMITS.md#13-personal-data-and-erasure) 列出了完整的字段
清单,解释了为什么即使映射已不存在,存储的输入指纹仍能确认一个可猜测的值,
并以审查者应当提出的问题作为结尾。

记录一次模型调用(买方的第一个问题:“哪个模型看到了我的数据?”):```python
from halo_record import record_model_call

record_model_call(rec, provider="anthropic", model="claude-sonnet-4-6",
                  zdr=True, purpose="draft support reply",
                  subject="acme")   # tool=model.generate, scope=model:anthropic

它在合规体系中的位置

halo-record 是一个证据层,而非认证。它产出的正是评估框架用不同措辞反复索要的工件。有一条范围说明贯穿以下每一条:这些是关于记录完整性的声明;针对运营方的完整性需要由持有检查点的外部见证方来验证(LIMITS.md §1)。

  • 安全问卷和 SOC 2 审查: 用可验证的 Runtime Report 回答 AI 相关部分,而不是截图和文字描述。
  • AIUC-1: 产出防篡改日志证据(E015.4)以及带授权事件的执行链记录(E015.2 —— 存在一个已声明的缺口:不捕获推理轨迹),这正是该标准中 Accountability 控制项 E015 所要求的。E015 本身是强制性的;E015.2 和 E015.4 是其补充层级:并非通过所必需,而是当客户或监管机构要求时供应商所采用的。一旦链被锚定到依赖方有理由信任的见证方——运营方自己运行的见证方不提供这一点——那就是一条持续被见证的链,而非在审计时才重建的链(进入链的内容仍受捕获面所限)。逐控制项的证据映射,包括有意排除在范围之外的内容,见 AIUC.md。
  • OWASP Top 10 for Agentic Applications 2026: 十项威胁中有八项映射到针对记录的确定性策略规则,两项被标记为超出范围并附有理由,且该包可直接运行。这是社区近似映射,并非 OWASP 官方工件。见 OWASP.md。
  • AARM (CSA): 产出 AARM 所规定的防篡改操作回执——R5,以及 R6 的密封部分(身份被密封进哈希,而非经过密码学认证)。halo-record 是回执层;将其与执行网关配对以构成完整的 AARM 系统。见 AARM.md。
  • Agentic Trust Controls: ATC 证据控制项背后的运行时记录——防篡改操作日志(RBM-03)以及权限证明的记录部分(AID-05;执行部分属于网关)——合并在一条链式记录中。见 ATC.md。
  • CSA AI Controls Matrix (AICM) / STAR for AI: LOG 域证据——生成的审计记录、密封以防未检测到的修改、输入和输出事件被记录——逐控制项映射于 AICM.md。CSA 自己的 v1.1 对照表将该域与 AIUC-1 E015 关联。
  • MITRE ATLAS: 以 ATLAS 本身并未要求的完整性属性实现的代理遥测缓解措施(AML.M0024)——日志可由运营方之外的某人验证。见 ATLAS.md。
  • EU AI Act / ISO 42001 / NIST AI RMF: 这些框架所描述的记录保存和日志义务属于同一类工件——在 、 和 中做了保守映射。

这一切本身并不认证任何东西。它给你的评估者提供了可验证的查看对象。边界——halo-record 有意不做的事,以及当审查者提问时该说什么——记录在 LIMITS.md 中。

将证据导入你的 GRC 平台

大多数 GRC 平台(Vanta、Drata 及类似平台)接受上传文件作为针对某控制项的自定义证据。halo-record 的导出正是为融入该流程而构建的:```bash halo export audit.jsonl --from 2026-06-01 --to 2026-06-30 -o evidence.csv

scope the export to the actions a control covers

halo export audit.jsonl --from 2026-06-01 --to 2026-06-30 --tool email.send --tool db.query -o evidence.csv

root@kitploit:~
这会为审计窗口写入两个文件:CSV(每个记录的操作一行,从左到右分组为*何时 → 发生了什么 → 谁 → 依据什么授权 → 标记了什么 → 来源 → 如何验证*,包括对调用及其结果的脱敏通俗语言摘要、产生每次调用的 agent 构建和模型、其代表运行的身份、导致该调用的记录、其授权决策和范围,以及任何个人数据类别或摄入的威胁标记)和一个清单(`evidence.csv.manifest.json`),该清单将 CSV 与其来源关联起来——链的头哈希将其链接到它所来自的可验证日志,而 `csv_sha256` 是导出文件自身的哈希,因此导出后被编辑的 CSV 将不再与其清单匹配。当某个控制仅覆盖特定操作时,使用 `--tool` 缩小范围;清单会记录该过滤器,因此限定范围的导出会披露它是一个子集,而不会被读作整个总体。将两者上传到你的日志记录或监控控制项;当审查者想要自行验证链时,附上 Runtime Report HTML。该导出会拒绝在验证失败的链上运行。

原生推送集成——证据自动落入你的平台——已在路线图中。上述文件路径目前适用于任何接受上传证据的平台。

## CLI```
halo verify   validate schema + hash chain (exit 1 broken, 3 empty chain; CI-friendly)
halo report   render a chain as a self-verifying HTML Runtime Report
              (--from/--to: a date-windowed report covering only the review period)
halo policy   corroborate a chain against a declarative policy pack
              (per-rule pass / violation / evidence-gap; exit 1 violated, 3 nothing in scope)
halo serve    serve per-tenant reports over HTTP, access-scoped per customer
halo grant    designate a report recipient (email or domain)
halo viewers  list who has unlocked a gated report
halo anchor   witness a chain head, or --check completeness (exit 1 incomplete, 3 unwitnessed)
halo witness-serve  run a witness over HTTP: vendors anchor chain heads, viewers fetch checkpoints
halo demo     scaffold the full vendor demo (record -> witness -> gated report)
halo export   date-bounded evidence export: CSV + manifest tied to the chain head
halo sample   emit a valid example log
halo hash     canonical sha256 of a JSON value
halo hook     Claude Code PostToolUse hook

完整性模型

计算记录的哈希:取该记录(排除 integrity.hash),并将 integrity.prev_hash 设为前一条记录的哈希;使用 RFC 8785(JSON 规范化方案)进行规范化;对字节进行 SHA-256 哈希。第一条记录的 prev_hash 为 64 个零。验证过程会重新计算每个哈希并检查每一条链接。无需密钥;这正是其意义所在。

你认为可以在验证器毫无察觉的情况下篡改链吗?尝试与结果在此。

完整字段参考:halo-record.schema.json。

TypeScript

同一记录器也提供 Node 版本:halo-record-ts。相同的链格式,相同的见证协议。以任一语言写入的记录均可由任一验证器验证。

社区示例

trail-halo-poc — 社区概念验证,将 Halo 记录的主体权限绑定到 TRAIL 凭证:将组织与代理的相互绑定以及组织签名的范围授权记录到 Halo 链中,并附带对抗性验证套件。

贡献

欢迎提交问题、参与讨论和发起拉取请求 — 请参阅 CONTRIBUTING.md 了解基本规则(简版:必须包含测试、小规模 PR、模式变更需先讨论)。

许可证

Apache-2.0

下载工具
主张自持链+ 外部检查点+ 可信捕获
检测对已建立产物的编辑✔✔✔
检测对已提交历史的改写—✔✔
检测缺失/延迟的检查点—✔(约定节奏)✔
证明每个操作都被记录——取决于捕获边界
选项描述默认值
-t, --target单个目标 URL-
-f, --file包含目标 URL 的文件-
-p, --proxy用于请求的代理 URL-
-T, --timeout请求超时时间(秒)10
-c, --threads并发线程数10
-P, --payload自定义漏洞利用载荷默认载荷
-A, --user-agent自定义 User-Agent 字符串默认 UA
-H, --header自定义请求头(可多次使用)-
-o, --output输出文件路径-
-v, --verbose启用详细输出False
-h, --help显示帮助信息并退出-
EU-AI-ACT.md
ISO42001.md
NIST-AI-RMF.md