安全与健壮性机制
安全与健壮性机制
本文解读 Grok Bot 的「防护层」:隐私分级(redaction)、工具执行前的安全检查(Auto-review)、防模型循环(loop detection)、以及文件并发锁。
面向对象:想理解「它为什么敢在用户电脑上跑 Shell、又为什么不会失控」的读者。文中路径均为仓库内相对路径。
1. 隐私分级(redaction)体系
1.1 三个核心维度
source/packages/redaction/:
PrivacyMode(privacy-mode.ts)—— 用户对数据用途的授权级别:
UNSPECIFIED / NO_STORAGE / NO_TRAINING /
USAGE_DATA_TRAINING_ALLOWED / USAGE_CODEBASE_TRAINING_ALLOWED
DataClassification(classification.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.ts 的 allowedPurpose(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 protos:
source/packages/redacted-protos/generated/有专门的*_redacted.js消息定义,与正常 protobuf 消息一一对应。 - 贯穿到每个环节:你会在
agent/index.ts、interaction-handler.ts、state.ts看到大量PrivacyCapability.UNSAFE_ALWAYS_ALLOWED(仅在明确安全边界内使用)与DataClassification标注。
一句话:隐私不是事后脱敏,而是每个数据结构从建模起就带着「分类 + 授权级别 + 用途」三元组,跨进程传递时始终走 redacted 形态。
2. Auto-review 安全检查
2.1 模型:三态 × 多表面
source/host/runner/sand-auto-review.ts:
- 三种模式:
off/shadow(只记录不拦截)/enforce(拦截)。 - 七个检查表面:
hostShell、boxShell、mcp、computer、automationWrite、cloudAgent、subagentLaunch。 resolveSandAutoReviewModes根据 settings 开关 + enforce 开关决定整体模式。
2.2 审批流程
SandAutoReviewController:
- 每个待审动作生成
SandAutoReviewApproval:fingerprint(动作指纹)、summary、reason、command、proposedRule(可提议的规则)、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.ts:createAutoReviewGate检查当前模式,assertNoPendingApproval(有待审时不允许开新副作用)。- per-surface 分类器:
sand-shell-auto-review-enrichment.ts、sand-browser-auto-review.ts、sand-computer-auto-review.ts、sand-cloud-agent-auto-review.ts、sand-subagent-auto-review.ts、sand-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、重复次数repetitions、p×k阈值)检测单字符/子串的重复,如aaaa...。 - 多行循环:维护环形行队列,检测「整行序列」的周期性重复。
- 细节处理:
- 代码块感知(
insideCodeFence):代码块内阈值更高(避免把正常代码误判为循环); - box 边框排除(
isBoxBorderLine):由─│┌┐└┘等字符组成的表格边框行不算循环; - 时间预算:
MAX_CHECK_TIME_MS = 500,超时则放弃检测(fail-open)。
- 代码块感知(
3.2 AgentLoopError 与重试
source/packages/agent/loop-detection/agent-loop-detector.ts:
AgentLoopError(loopType: "assistantMessage" | "singleMessage")携带repetitions/period/loopKind。- 在
abstract-user-message-action-handler.ts的runWithMaxTokensRetry里捕获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.signalabort,从队列移除并抛ToolCallAbortedError。 - RAII 释放:锁对象带
Symbol.dispose,用using语法自动释放(如index.ts里的using span)。
这套锁保证多 step / 并行 subagent 同时改文件时不会互相踩踏。
5. 一句话总结
- 隐私:
PrivacyMode × DataClassification × PrivacyCapability三元裁决,redacted 双态贯穿全程。 - 安全:Auto-review 三态 × 七表面,拦截后「适配或原样升级审批」,绝不改写绕过。
- 防循环:流式文本的周期检测(代码块感知 + 边框排除 + 时间预算),检测到即注入提醒重试或终止。
- 并发:路径锁 + 排他锁 + FIFO 队列 + abort/RAII。
相关文档: