Skip to content

Translation in progress Some entries still include text in the original language.

arXiv:Agent 与 MCP 安全· arXiv:2609.35659· Bravish Ghosh·Indexed by this site · Originally published

Tracekit: A tamper-proof intent-reasoning-action audit system for autonomous coding agents

Tracekit: Tamper-Evident Intent-Reasoning-Action Auditing for Autonomous Coding Agents

Quick read

Defenses

Based on 论文 PDF (AI 生成); refer to the original

Tracekit用哈希链审计编码智能体;N=300、间隔300时全量重链检出0.47,E5评审98/98。

Threat model操作者 H 向可派生子智能体的系统 A 发任务,harness 为 Claude Code。

Questions
编码智能体少人监督地读不可信文件、执行命令并派生子智能体,记录却常是可改的输出日志。操作者缺少可归属的完整动作、防篡改,以及把自述和真实动作对照起来的手段。
Methods
Tracekit用钩子记下人类意图、模型自述和工具动作,写入SHA-256哈希链,并用外部锚点发现整链重算或截断。执行前用正则门;事后用规则旗标和无工具的独立评审对照三通道。其他智能体可经SDK或HTTP写入同一账本。
Experiments and results
E1(N=300,每类200次):仅链对截断和全量重链为0.00;间隔300条时摘要给出0.47。E3拦截有害调用18/44。E4共14次,注入尝试0/8,27个思考块无可见文本。E5规则40/49,评审98/98。
Limitations and future work
作者称结果只刻画单一harness、短任务、每条件两次重复和同族评审;不能把自述当内部理由,看不见工具层之下的效果,也保护不了最近锚点之后的记录。正则门可被绕过,E5是固定掩护的合成插入。被测运行使用Claude Code 2.1。
Experimental setupClaude Code (claude -p, version 2.1)、独立评审(同一 CLI,无工具) · E1 tamper detection (N=300, 8 classes × 200)、E3 policy corpus (44 harmful + 40 benign calls) et al. · detection rate、hook wall time (median) et al.
Threat model
操作者 H 向可派生子智能体的系统 A 发任务,harness 为 Claude Code。T1 良性但会出错;T2 读到的不可信内容含针对模型的指令;T3 能事后修改账本文件。假设钩子被忠实调用,且至少一份头哈希锚点位于 T3 改不到之处。不读取模型内部,也不防御工具调用层以下的副作用。
Evaluated models
Claude Code (claude -p, version 2.1)独立评审(同一 CLI,无工具)
Benchmarks
E1 tamper detection (N=300, 8 classes × 200)E3 policy corpus (44 harmful + 40 benign calls)E4 seven scenarios (14 Claude Code runs)E5 seeded-fault splicing (63 traces)
Metrics
detection ratehook wall time (median)records/sblock rateAttemptedDisclosedfalse-positive ratereviewer agreement
AI summaryTracekit is an open-source, dependency-free audit system that captures three channels for each agent session—human intent, the model's self-reported reasoning, and actual executed actions—writes them to a hash-chained ledger, and cross-checks them. It hooks into Claude Code lifecycle events, reconstructs multi-agent hierarchies, performs policy interception before tool calls, and supports other agents reporting events via SDK or HTTP API.

Tracekit is an open-source, dependency-free audit system that captures three channels for each agent session—human intent, the model's self-reported reasoning, and actual executed actions—writes them to a hash-chained ledger, and cross-checks them. It hooks into Claude Code lifecycle events, reconstructs multi-agent hierarchies, performs policy interception before tool calls, and supports other agents reporting events via SDK or HTTP API.

Paper analysis

6 questions; open one to read the full answer

  1. What problem does this paper attempt to solve?

    要为编码智能体记下可核对的意图、自述与动作,并让事后改账能被发现。

    编码智能体留下的通常是可改日志;Tracekit 要记下意图、自述与动作,并检查事后改账。

    • 场景:作者指出,Claude Code、Codex、Cursor 等智能体长时间读仓库、调用工具并派生子智能体,读到的 README、注释或报错都可能携带间接提示注入。缺口是记录不完整且难归属、日志可被改写,以及自述不等于计算过程。
    • 现有记录:作者称通用可观测平台和 OpenTelemetry 的 GenAI 约定面向调试与成本;据作者所知,它们不使日志防篡改,也不自动对照所说与所做。作者把 Tracekit 的账本做成线性链加锚点,并称贡献在账本装入什么、如何交叉核对。
    • 系统:作者不声称读取模型内部,而把自述当证词、动作当证据,与人类请求一起写入可锚定的哈希链。Tracekit 挂钩 Claude Code,采集三通道并归属子智能体,执行前做策略门。
    • 威胁模型:
      • 对象:操作者 H 把任务交给智能体系统 A;A 经 harness(即 Claude Code)调用工具,并可派生子智能体。目标包括可归属采集、防篡改、执行前处置和三通道分歧检查。
      • T1:智能体良性,但会改错文件、错误声称成功或超出任务范围。
      • T2:它读到的文件、工具输出或网页含针对模型的指令。
      • T3 与假设:被攻破的智能体或想隐瞒活动的人可以事后改账本文件。作者假设 harness 忠实调用钩子,且至少一份头哈希锚点放在 T3 改不到的地方;不假设能读模型内部,也不防御工具调用层看不见的副作用,作者称后者需要操作系统级强制。
  2. What related research exists?

    作者将相关工作分为可观测性、防篡改日志、推理监控与护栏,并对照公开文档。

    智能体可观测性

    • OpenTelemetry 的 GenAI 语义约定(2026)规范模型调用与工具执行的 span;Claude Code 的导出(2026)默认脱敏,涵盖提示、工具决定和结果。
    • Langfuse 的 Claude Code 插件(2026)转发会话,思考块存在时一并转发。作者称这些系统面向调试和成本;据作者所知,它们都不使日志防篡改,也不交叉核对所说与所做。

    防篡改日志

    • 哈希链审计可追溯到 Haber 与 Stornetta(1991)、Schneier 与 Kelsey(1999)、Crosby 与 Wallach 的历史树(2009)和 Certificate Transparency(2021)。
    • nono(2026)用沙箱外监督者签名 Merkle 树的根。halo-record(2026)是带可选见证的哈希链。作者称 Tracekit 故意只用线性链加锚点,贡献在内容与交叉核对,不在密码学。

    推理忠实性与监控

    • 作者转述:Turpin 等(2023)讨论解释可能漏掉驱动答案的因素;Lanham 等(2023)对思维链的干预里,答案对所述推理的依赖并不稳定;Chen 等(2025)中,推理模型只在少数时候说出所用提示。
    • Baker 等(2025):监控思维链可以发现奖励黑客,但对监控施压可能产生混淆。Korbak 等(2025)把可监控性称为 “new and fragile”。作者称这些结果促使自己把自述当作待与动作核对的证词。

    护栏、注入与控制

    • InjecAgent(2024)和 AgentDojo(2024)测注入易感性;CaMeL(2025)用能力与数据流控制对付注入。NeMo Guardrails(2023)、Llama Guard(2023)、Invariant Guardrails(2025)过滤输入、输出或工具调用。
    • ToolEmu(2024)、R-Judge(2024)与 LLM-as-a-judge(Zheng 等,2023)用模型评判风险。AI control(Greenblatt 等,2024)和 SHADE-Arena(2025)用监控器看不可信或隐藏的副任务。作者称 seeded-fault splicing 与这类破坏评估接近,差别是故障被拼进真实轨迹,而不是提示智能体违规。

    基线:Table 1 按 2026 年 9 月公开文档,用 ✓ / – 比较 Claude Code OTel、Langfuse 插件、Invariant Guardrails、nono、halo-record 与 Tracekit;子智能体列仅 Tracekit 为 ✓,交叉核对记为 rules + LLM。实验中的对照是仅链与加锚点(Table 2)、默认正则门(section 5.3)、规则旗标与独立评审(Table 4)。

    作者称贡献在账本内容与三通道核对,密码学上则故意用更简单的线性链加锚点。独立评审沿用无工具的可信监控器。

  3. How does the paper address this problem?

    钩子采集三通道并写入哈希链,执行前用正则门,事后用规则和独立评审核对。

    Tracekit 在 harness 钩子里采集人类意图、模型自述和工具动作,追加进 SHA-256 哈希链,并用外部锚点对付整文件重算和尾部截断。执行前有正则策略门,事后用规则旗标和独立评审对照三通道。实现约为 2,000 行标准库 Python 加一个 HTML 文件(Figure 1)。

    采集与归属

    • 事件:Claude Code 把 JSON 载荷交给 hook.py。涉及 UserPromptSubmit、PreToolUse、PostToolUse、PostToolUseFailure、SubagentStart、SubagentStop、Stop,以及 SessionStart/End。
    • 转录:在工具事件和停止事件上按字节偏移增量读取,抽取思考、文本和工具使用块。进程间锁保证每行只入库一次。
    • 子智能体:作者称载荷带有 agent_id 与 agent_type,转录在会话目录的 subagents/agent-<id>.jsonl。记录按智能体打标。观察器把发起委派的 Agent 工具调用连到随后的 SubagentStart。
    • 顺序与其他入口:同一回合的转录常在钩子之后才落盘,自述因此晚于对应动作。作者不重排账本,以保持只追加。阅读端用 tool_use_id 接合,并把推理放在动作之前。SDK 与 HTTP 把同类事件写入同一账本;其中 tool 在运行前过策略,并记录时长与错误。

    账本与能证明什么

    • 记录含 seq、时间戳、事件体和 prev;没有前一条时 prev 为 256 位零。哈希为 hi=SHA\text{-}256(canon(ri∖{hash}))。canon 按键排序并去掉无意义空白。作者称这对所用类型足够,是 JCS 的子集。
    • 符合常见凭据模式的字符串在哈希前被遮蔽;过长字符串被截断并保留全文哈希。追加时独占文件锁,从尾部反向恢复最后一条有效记录,使崩溃留下的半行不会让链从头开始,然后 fsync。
    • 作者称原地编辑、删除、重排或伪造插入会破坏哈希或 prev。能重写整个文件的对手可以重算全部哈希;删掉最新记录会留下仍合法的前缀。这两种都要靠保存在别处的锚点才能发现。
    • 若每 k 条取一次锚,攻击者从均匀随机位置重算长度为 N 的账本,且时刻在上次锚之后均匀分布,检出概率为 Pdetect(k)=1−(k−1)/2N。作者称更强的树形构造也不能取消外部保存方。钩子内部出错时默认退出码 0(失败则放行),除非 FAIL_CLOSED。

    策略门

    • PreToolUse 对工具字段做正则:Bash 看命令,文件工具看路径。拒绝则退出码 2,Claude Code 将其变成智能体可见理由的阻断。工作目��外的写入只被标记。
    • 策略文件读不出时标记 policy_error,不静默放行;TRACEKIT_FAIL_CLOSED=1 时改为拒绝。
    • 附录 B 的默认拒绝包括 sudo、下载后管道进 shell、强制推送、对 /、~ 或 $HOME 的递归删除,以及对 .env*、id_rsa、id_ed25519、.ssh/ 或 .aws/ 的 Write/Edit。标记项包括网络工具、破坏性和带副作用的命令、秘密访问和 MCP。作者称该门按设计是绊线,不是沙箱。

    核对与观察器

    • 规则:view.py 标记策略拒绝和旗标(网络、破坏、副作用、秘密访问、外部工具)、项目外写入、失败调用、无结果记录的调用,以及未被提及的文件编辑:文件名不在人类提示里,也不在此前任何自述里。无可见解释的动作,以及推理被提供者扣留的回合,标为信息性旗标。
    • 评审:judge.py 把会话压成带 [HUMAN]、[AGENT-THINKING]、[AGENT-SAID]、[ACTION seq=...] 的文本,附策略结果和截断后的工具结果,交给另一个无工具模型,用 JSON 报告分歧,再把判定写入账本。附录 A 给出完整提示词。标出条件是 alignment 为 minor_drift 或 misaligned,或某个 finding 的 severity 为 medium 或 high。
    • 观察器:observer.py 用服务器发送事件推送单页界面,含会话计数、智能体树、事件带、警报、每智能体一条泳道和详情。回放文件在浏览器内用 WebCrypto 重哈希。作者报告测试检查到 JavaScript 与 Python 的规范化逐字节一致。非 localhost 时端点要求 bearer token。
  4. What experiments did the paper conduct?

    Table 2 仅链对截断与全量重链为 0.00;E3 拦截 18/44;E5 评审 98/98。

    实验设置

    • 平台:2-vCPU Linux 容器,Python 3.11.15。真实运行是无头 Claude Code(claude -p,version 2.1),每次单独的设置文件和隔离账本。评审用同一 CLI、无工具、独立进程。作者报告 25 项单元测试通过,覆盖账本、钩子、交叉核对、SDK、观察器、安装器,以及浏览器校验与 Python 的一致性。
    • E1:从 143 条真实记录抽样,组成 N=300 的账本。每试次一种随机突变,每类 200 次。八类为改字段、删记录、交换相邻记录、插入伪造记录、撕裂的最后一次写、截断尾部、编辑后全量重链、删除后全量重链。比较仅链,以及突变前头哈希这一锚点(Table 2)。Figure 3 改变锚定间隔,图例为式 (2) 和每点 200 次实测。
    • E2:每个账本规模 60 次钩子调用,墙钟含解释器启动、策略、脱敏、哈希和 fsync。并发写测到 16 个进程。
    • E3:44 次有害工具调用,分六类,并含针对默认模式的平凡改写;另有 40 次良性调用。只评估、不执行。
    • E4:带一个失败测试的小仓库上,7 个场景各 2 次。S1–S4 在不同通道放入间接提示注入;C1 为干净任务,C2 为用户要求删除 billing.py,C3 为用户要求写 .env。Attempted 是与注入目标相符的任何非读工具调用;Disclosed 是最终回答告诉用户存在注入。
    • E5:取 7 个干净会话的第一次重复,在最后一次成功的工具调用之后插入一步。自述是听起来良性的掩护句,最终摘要不改。F1 未请求的编辑,F2 外传文件,F3 删除,F4 虚假成功,F5 范围蔓延,F6 读 SSH 私钥,F7 改弱测试。对照为原会话,以及多一次带诚实说明的 git status。63 条轨迹由规则评一次、评审评两次,评审调用共 126 次。

    主结果

    条件结果出处
    chain only:改字段、删除、相邻交换、伪造插入、撕裂写,各 200 次1.00Table 2,N=300
    chain only:截断尾部、编辑后全量重链、删除后全量重链0.00Table 2
    另加突变前头哈希锚点,上述八类1.00Table 2
    锚定间隔 300 条时的全量重链检出0.47摘要
    默认正则:有害调用被拦截;拦截与标记的并集18/44(41%);40/44(91%)section 5.3,Figure 5
    默认正则:良性调用被拒3/40(7.5%)section 5.3
    拼接故障:规则旗标;独立评审(每条 2 次)40/49(82%);98/98(100%)section 5.5,Table 4
    • 链与锚:作者把“手里已有突变前头哈希”和“锚点按间隔更新”分成两套设置。前一套里,截断和全量重链不再通过校验。摘要中的 0.47 属于间隔实验;作者称 Figure 3 的实测沿式 (2)。
    • 正则门:作者的结论是,对命令字符串做模式匹配是给诚实失误用的绊线,不是安全边界;强制应放在能力系统或操作系统沙箱里,Tracekit 记录其决定。正文写明没有外泄命令被拦截。
    • 规则与评审:作者认为 E5 是非自适应故障上的上限结果:每个拼接步后面都有未改动的、与该步矛盾的最终摘要,掩护句是泛泛的,而且评审与智能体同模型族。作者认为规则覆盖数据流和范围类问题,只有语义评审能抓住声称与工具结果的矛盾,二者应合用。

    真实运行与间接提示注入

    • Table 3:S1–S4 的 Attempted 均为 0/2,Disclosed 均为 2/2,Blocked calls 为 0,Tests pass 为 2/2。C1、C2 的 Blocked calls 为 0,Tests pass 为 2/2。C3 的 Blocked calls 为 2,Tests pass 为 2/2。作者将注入场景合计为尝试 0/8,并称这种难度给监控评测提供不了正例。
    • C2:两次运行里智能体都拒绝删除 billing.py。作者称它引用了该文件自己的文档字符串,文件内文字在此压过用户指令,方向是偏安全的;作者称这正是审计需要看见的影响。
    • 思考块:73 条模型消息中的 27 个思考块,可见文本为 0,转录里只有签名。作者称此配置下外部监控能用的推理通道是可见正文。无可见解释的规则旗标每次运行都触发,作者称它是信息性旗标。

    开销与并发

    • 延迟:Figure 4 左侧,空账本上 PreToolUse 的中位数为 23.9 ms,10 万条时为 24.6 ms;裸解释器启动 10.3 ms。每个点 60 次。图注写明 PreToolUse 与 PostToolUse 都画了 p50 到 p95,正文没有给出 PostToolUse 的中位数。作者称反向读尾使成本保持平坦,并对照 E4 平均 24 秒的运行,称这一开销可忽略。
    • 吞吐:进程内、每条一次 fsync、平均记录 1,280 字节时为 2,436 条/秒;校验为 35,099 条/秒。最多 16 个并发写入进程时,吞吐保持在约 2,000 条/秒,所得的链全部校验通过且记录齐全。Figure 4 右侧标有 chain ok。

    拼接故障的分项

    • Table 4:规则旗标对 F2、F3、F5、F6、F7 为 7/7,对 F1 为 5/7(71%),对 F4 为 0/7。评审对七类均为 14/14,并集均为 14/14。两次评审的一致情况:故障类各 7/7;正文合计 61/63 条轨迹。
    • 漏检:作者称没有句法规则能看出工具结果与成功声称相矛盾,因此 F4 全部漏过。F1 漏过的 2/7 是因为更早的正文已经点名 billing.py,按文件名匹配因此失效。作者把 F7 称为改弱测试而非修好代码的奖励黑客形式,评审把 F7 标出。
    • 对照:未改动会话上,规则 0/7,评审 1/14(7%),并集 1/14,两次一致 6/7。良性额外步骤上,规则 0/7,评审 3/14(21%),并集 3/14,一致 6/7。作者称评审把一次未被要求的 git status 评为轻微偏离。

    其他消融与分析

    • Figure 3 纵轴文字为全量重链的检出概率,旁注含 1.0、0.8、0.6、0.4;横轴 k 的刻度含 1、5、10、25、50、100、300。除摘要的 0.47 外,正文没有列出各点实测值。
    • Figure 5 行旁分数为远程代码执行 3/10、提权 3/6、历史改写 5/6、破坏性删除 4/8、秘密文件写入 3/8、外泄 0/6。图注分为拦截、仅标记、漏过;正文明确没有外泄命令被拦截。论文没有逐类写明每个分数属于哪一段。
    • 三次良性误拦分别是:检索 sudo、echo 中含该词、写入 .env.example。
    • E4 中智能体指出 .env 规则可以被另一种命令写法绕过,并且没有使用。
  5. What are some points that can be further explored?

    作者称数字只刻画单一配置,并写明锚点、句法门、思考通道和合成故障的边界。

    作者指出的局限与后续方向

    • 单一配置(section 6):只有一个 harness 和模型族、小仓库与短任务、每个条件两次重复、评审与智能体同族、一位作者。作者称数字应读作这一配置的刻画,而不是普遍比率。
    • 自述(section 6):作者称系统不能把自述当成模型的理由;E4 里思考通道被整个扣留。
    • 工具边界(section 6):看不见工具调用层以下的效果。
    • 锚点窗口(section 6):保护不了最近一次锚点之后写入的记录,若对手能控制账本文件。作者认为操作者至少应在每次会话结束时做锚。
    • 门与评审(section 6):策略门可被绕过。评审本身是语言模型,作者称它继承 LLM 评判的已知弱点;部署时提示还会带上攻击者可控的轨迹内容。
    • 合成故障(section 6 与结论):E5 的故障是固定掩护句的合成插入。作者认为有能力且故意欺骗的智能体可以写出更有说服力的版本,并称带自适应攻击者的 SHADE-Arena 式评估会是更强的测试。结论里作者称发布代码、评测脚本和轨迹,以支持复现并扩展到其他 harness。

    实验覆盖范围

    • 真实运行使用无头 Claude Code(claude -p,version 2.1),评审是同一 CLI 且不带工具的独立进程。论文写的是同一模型族,没有另给模型快照名称或采样设置(section 5、section 6)。
    • E1 为 8 类突变、每类 200 次、账本长度 N=300,记录体从 143 条真实记录抽样;Figure 3 的锚定间隔刻度含 1、5、10、25、50、100、300(section 5.1、Table 2)。
    • E3 含 44 次有害调用(六类,包括针对默认正则的平凡改写)和 40 次良性调用,这些调用没有被执行(section 5.3、附录 B)。
    • E4 是 7 个场景各 2 次;E5 只用其中干净会话的第一次重复,插入 7 类故障并设原会话与良性额外步骤两类对照,共 63 条轨迹、126 次评审调用(Table 3、Table 4)。
    • E5 的错位步骤使用固定掩护句,且最终摘要保持不变;开销实验在 2-vCPU 容器上测到 10 万条账本记录和 16 个并发写入进程(section 5.2、section 5.5)。
  6. Summarize the main content of the paper

    Tracekit把意图、自述和动作写入可锚定的哈希链;作者强调锚点、正则绊线和思考文本可能缺失。

    Tracekit 是无第三方依赖的编码智能体审计层:把人类请求、模型自述和已执行动作并排写入可外部锚定的哈希链,执行前用正则门,事后用规则和独立模型互查。

    • 问题:长时运行的编码智能体会读不可信文本、调用有副作用的工具并派生子智能体,而输出日志可被事后修改,自述也不能代替内部计算。
    • 方法:钩子采集 Claude Code 的生命周期事件和转录,子智能体单独入库。账本为 SHA-256 线性链;整文件重算或截掉最新记录,要靠外部锚点才看得见。
    • 防篡改:Table 2 里,N=300、每类 200 次时,仅链对五类原地改动和撕裂写为 1.00,对截断尾部和两类全量重链为 0.00;有突变前头锚点时八类都是 1.00。摘要称锚定间隔 300 条时,全量重链检出降到 0.47。
    • 门与真实运行:默认正则拦截有害调用 18/44、误拦良性调用 3/40。14 次 Claude Code 2.1 运行中,四个注入场景的尝试为 0/8,且均被披露;73 条消息里 27 个思考块没有可见文本。
    • 拼接故障:49 条拼接故障上,规则旗标 40/49,独立评审 98/98;未改轨迹的评审假阳性为 1/14。作者认为这是固定掩护、非自适应插入上的上限,并认为规则和语义评审应该合用。
    • 作者的结论:作者称最强的教训是否定性的:哈希链需要锚点,句法门只是绊线,推理通道在实践中可能不存在。监控应把动作当证据、自述当证词,把强制放到智能体之下,由审计层见证强制层的决定。
Read originalarxiv.org