安全与健壮性机制

安全与健壮性机制

本文解读 Grok Bot 的「防护层」:隐私分级(redaction)、工具执行前的安全检查(Auto-review)、防模型循环(loop detection)、以及文件并发锁。

面向对象:想理解「它为什么敢在用户电脑上跑 Shell、又为什么不会失控」的读者。文中路径均为仓库内相对路径。

1. 隐私分级(redaction)体系

1.1 三个核心维度

source/packages/redaction/

PrivacyModeprivacy-mode.ts)—— 用户对数据用途的授权级别:

UNSPECIFIED / NO_STORAGE / NO_TRAINING /
USAGE_DATA_TRAINING_ALLOWED / USAGE_CODEBASE_TRAINING_ALLOWED

DataClassificationclassification.ts)—— 数据的敏感度分类:

SAFE / CODE / CREDENTIALS / PATH / PROVIDER_INFO / UNSPECIFIED

PrivacyCapability(用途)—— 数据要被拿去干什么:

STORAGE_FOR_TRAINING / STORAGE_FOR_LOGGING / STORAGE_FOR_USAGE / UNSAFE_ALWAYS_ALLOWED

1.2 决策矩阵 allowedPurpose()

classification.tsallowedPurpose(privacyMode, purpose, classification) 是核心裁决函数:

  • SAFE 数据 → 永远允许;
  • CREDENTIALS / UNSPECIFIED → 永远拒绝(除非 UNSAFE_ALWAYS_ALLOWED);
  • 其余按 mode × purpose 查表:例如 NO_TRAINING 下「日志用途」只放行 PATH/PROVIDER_INFO,「训练用途」一律拒绝,「用量统计」放行。

1.3 它如何贯穿整个系统

  • redacted / unredacted 双态:消息、状态、交互更新都有「redacted 版本」。source/packages/agent/tool-stream-executor.ts 里的 RedactedPromptToolExecutor 在把消息交给模型前按 privacy mode 做 redact;fromRedactedCoreMessages / toRedactedCoreMessages 在两边转换。
  • redacted protossource/packages/redacted-protos/generated/ 有专门的 *_redacted.js 消息定义,与正常 protobuf 消息一一对应。
  • 贯穿到每个环节:你会在 agent/index.tsinteraction-handler.tsstate.ts 看到大量 PrivacyCapability.UNSAFE_ALWAYS_ALLOWED(仅在明确安全边界内使用)与 DataClassification 标注。

一句话:隐私不是事后脱敏,而是每个数据结构从建模起就带着「分类 + 授权级别 + 用途」三元组,跨进程传递时始终走 redacted 形态

2. Auto-review 安全检查

2.1 模型:三态 × 多表面

source/host/runner/sand-auto-review.ts

  • 三种模式off / shadow(只记录不拦截)/ enforce(拦截)。
  • 七个检查表面hostShellboxShellmcpcomputerautomationWritecloudAgentsubagentLaunch
  • resolveSandAutoReviewModes 根据 settings 开关 + enforce 开关决定整体模式。

2.2 审批流程

SandAutoReviewController

  • 每个待审动作生成 SandAutoReviewApprovalfingerprint(动作指纹)、summaryreasoncommandproposedRule(可提议的规则)、TTL(默认 10 分钟)、userMessageEpoch(用户消息纪元,用于失效)。
  • 限制:每个 agent 最多 4 个待审(SAND_AUTO_REVIEW_MAX_PENDING_PER_AGENT)。
  • 结果:approved / denied / expired(TTL 或 host 更新打断)。

2.3 拦截后的协议(与 prompt 呼应)

formatSandAutoReviewDeniedReason

“Auto-review blocked this action: … Do not retry the same action, and do not switch to another anonymous public file host, pastebin, disposable transfer link, or similar courier — that is the same unauthorized data-exposure crossing.”

formatSandAutoReviewInterruptedForUpdateReason 区分「用户拒绝」和「host 更新打断」(后者可以重新升级审批)。

2.4 门(gate)与分类器

  • auto-review-gate.tscreateAutoReviewGate 检查当前模式,assertNoPendingApproval(有待审时不允许开新副作用)。
  • per-surface 分类器:sand-shell-auto-review-enrichment.tssand-browser-auto-review.tssand-computer-auto-review.tssand-cloud-agent-auto-review.tssand-subagent-auto-review.tssand-automation-auto-review.ts

这套机制是系统 prompt 里「When your own action needs approval / 不绕过安全边界」的代码落点:升级审批 = 同一动作原样重试 + 审批参数,而非改写命令绕过。

3. 防循环(loop detection)

3.1 单消息循环检测器

source/packages/agent/loop-detection/single-message-loop-detector.ts

  • 单行循环:在流式文本到达时,用「周期匹配」(period p、重复次数 repetitionsp×k 阈值)检测单字符/子串的重复,如 aaaa...
  • 多行循环:维护环形行队列,检测「整行序列」的周期性重复。
  • 细节处理:
    • 代码块感知insideCodeFence):代码块内阈值更高(避免把正常代码误判为循环);
    • box 边框排除isBoxBorderLine):由 ─│┌┐└┘ 等字符组成的表格边框行不算循环;
    • 时间预算MAX_CHECK_TIME_MS = 500,超时则放弃检测(fail-open)。

3.2 AgentLoopError 与重试

source/packages/agent/loop-detection/agent-loop-detector.ts

  • AgentLoopErrorloopType: "assistantMessage" | "singleMessage")携带 repetitions / period / loopKind
  • abstract-user-message-action-handler.tsrunWithMaxTokensRetry 里捕获 singleMessage 循环,注入一条 <system_reminder> 提醒后重试一次;再次循环则抛出错误终止 turn(isRetryable: false)。

4. 文件并发锁

source/packages/agent/tools/core/file-operation-lock-manager.ts

  • 两类锁
    • waitForLock(path) —— 按路径的文件锁(同一文件互斥);
    • waitForExclusiveLock() —— 排他锁(与所有文件锁互斥,用于「独占」类操作)。
  • 公平等待队列waitQueue 按 FIFO,排他 waiter 会阻塞后续文件锁(hasExclusiveWaiterAhead)。
  • abort 处理:等待中若 ctx.signal abort,从队列移除并抛 ToolCallAbortedError
  • RAII 释放:锁对象带 Symbol.dispose,用 using 语法自动释放(如 index.ts 里的 using span)。

这套锁保证多 step / 并行 subagent 同时改文件时不会互相踩踏。

5. 一句话总结

  • 隐私PrivacyMode × DataClassification × PrivacyCapability 三元裁决,redacted 双态贯穿全程。
  • 安全:Auto-review 三态 × 七表面,拦截后「适配或原样升级审批」,绝不改写绕过。
  • 防循环:流式文本的周期检测(代码块感知 + 边框排除 + 时间预算),检测到即注入提醒重试或终止。
  • 并发:路径锁 + 排他锁 + FIFO 队列 + abort/RAII。

相关文档: