跳转到内容

06 审批模式与安全控制

学习目标

本章要解决什么问题:Cline 如何在安全和效率之间平衡?命令权限控制器如何防止命令注入?

前置知识

本章涉及安全沙箱的通用原理,建议先阅读:

下文假设你已理解多层防御架构和命令策略引擎,直接聚焦 Cline 的具体实现。


项目实践

三级自动审批

autoApprove.ts 实现三级自动审批:

Yolo Mode:所有工具自动执行,适合本地开发、信任度高的场景。

Auto-approve All:除浏览器操作和 MCP 工具外的工具自动执行。这两个被排除是因为它们涉及外部系统和第三方服务。

细粒度控制:每个工具可独立配置:

  • alwaysAllow:是否自动批准
  • 路径限制:是否包括外部路径(如只允许读写项目目录)

CommandPermissionController

execute_command 工具的额外验证层:

# 伪代码:验证流程
function validateCommand(cmd: string): Decision {
// 1. 按 && ; | 分段
segments = splitByOperators(cmd)
// 2. 每段独立匹配允许模式
for seg in segments:
if !matchesAllowedPattern(seg):
return Prompt
// 3. 子 shell 递归验证
subshell = extractSubshell(cmd)
if subshell:
return validateCommand(subshell)
// 4. 重定向操作符检查
if hasRedirection(cmd) && targetsProtectedPath(cmd):
return Forbidden
return Allow
}

通配符模式匹配["git", "*"] 允许所有 git 子命令,但 ["rm", "*"] 需要谨慎配置。

子 shell 递归验证:防止 $(rm -rf /) 等注入攻击,递归验证子 shell 内容。

.clineignore 文件访问控制

类似 .gitignore 的机制,限制代理访问:

  • 在所有文件列表、搜索、读取操作中自动过滤
  • 支持 glob 模式:node_modules/***.env.git/**
  • 即使工具被批准执行,也无法访问被屏蔽的文件

任务锁定

TaskLockUtils 使用 SQLite 锁防止同一任务被多个实例同时操作,避免并发执行导致状态不一致。


问题与规避

陷阱场景对策
Yolo Mode 风险不受信的代码仓库仅在本地可信项目中使用
命令注入绕过复杂命令链绕过模式匹配分段验证 + 子 shell 递归验证
.clineignore 被绕过Agent 通过 execute_command 调用 find需要与 CommandPermissionController 联合使用

设计取舍

前置审批 vs 后置审计

方案优势代价
前置审批阻止危险操作执行增加延迟
后置审计不阻塞执行损害已发生

Cline 选择前置审批为主,后置日志为辅:审批在 Coordinator 路由之前完成,同时记录所有工具调用日志供审计。

应用层审批 vs 内核沙箱

方案优势代价
应用层审批灵活、可配置可被绕过
内核沙箱强制执行平台依赖、性能开销

Cline 主要依赖应用层审批,因为作为 VS Code 扩展运行在用户本地环境,不需要跨租户隔离。内核沙箱更适合多租户场景。


参考来源

  • Cline 源码:apps/vscode/src/core/task/tools/autoApprove.ts
  • Cline 源码:apps/vscode/src/core/permissions/CommandPermissionController.ts
  • Cline 源码:apps/vscode/src/core/task/tools/utils/taskLockUtils.ts