权限、沙箱与危险命令

建议用时:25 分钟(含练习)

学习目标

能够为任务设置最小文件、命令、网络和外部系统权限,并识别不可逆操作。

本节产出

一份任务权限预算

核心知识:能力、授权与隔离分别回答不同问题

一个 Agent 技术上能够运行命令,不代表它被授权运行所有命令;一项动作被用户允许,也不代表它可以越过系统安全边界;一个环境叫作沙箱,更不代表任何操作都没有后果。使用编码工具时,要把“能做什么”“允许做什么”“实际被限制在哪里”分开理解。

权限配置

权限配置通常控制工具、路径、网络目标或特定操作是否可以执行。

沙箱

沙箱则通过操作系统、容器或其他机制限制执行环境的访问范围。

提示词中的约束有助于模型选择正确动作,但不应被当作唯一强制控制。具体产品如何组合权限与沙箱,需要查看当前实现和设置。

隔离也有不同维度。文件系统限制可能阻止访问项目外目录,网络限制可能阻止外发请求,凭证范围决定某个远程 API 能修改什么。Git worktree 主要隔离工作文件与暂存状态,不自动隔离网络、数据库和账号。不要因为开了新分支,就把生产密钥带进实验任务。

用户任务确定授权范围,工具权限和执行沙箱共同限制动作,再通过结果检查确认实际影响

图中的边界应通过实际配置和可观察结果确认。一个命令被允许后,还要知道它调用的脚本会做什么;只审查命令名称而不看参数、工作目录和脚本内容,容易漏掉真正的副作用。

危险往往来自组合与作用范围

读取文件通常比删除文件影响小,但读取秘密并发到外部同样可能造成严重问题。安装依赖看起来像准备环境,却可能执行包脚本;运行测试也可能连接真实数据库或发送通知。因此应先确认项目脚本和环境,不能给某个熟悉命令贴一个永久“安全”的标签。

审查动作可以问四个问题:它读什么,写什么,连接哪里,失败后怎样恢复。对涉及共享服务或不可逆后果的操作,再核对是否在明确授权范围内。对于已获准且可逆的小范围编辑,不需要把每次保存都变成重复确认;边界清楚比弹窗数量多更重要。

案例:测试脚本实际上指向生产数据库

虚构项目有一个 test:integration 脚本,启动时读取数据库环境变量。开发者在新 worktree 里运行它,以为工作区独立就不会影响生产;但环境变量仍指向共享数据库。若测试会清理表数据,新目录并不能提供保护。

正确做法是在执行前核对测试的数据库要求、连接目标和数据初始化逻辑,使用专用测试环境与虚构数据。测试配置应拒绝明显的生产目标,凭证本身也不应拥有生产写权限。不要通过关闭保护检查来让测试“终于能跑”。

如果环境不满足要求,可以先运行纯函数测试或静态检查,继续完成不依赖数据库的工作,并准确记录集成测试未运行的原因。最终是否可以交付取决于改动性质与项目门禁,而不是把缺失验证悄悄省略。

检查点不是万能撤销键

文件检查点可能恢复某些编辑,却无法自动撤回已发送邮件、数据库写入或远程发布。Git 提交也主要记录仓库中的版本,不记录所有外部状态。设计恢复方案时,应列清每个状态的恢复方式,而不是笼统写“出错就回滚”。

状态变化可考虑的恢复证据需要注意
代码文件Git 提交或文件快照未跟踪文件可能未覆盖
数据库经验证的备份与迁移方案恢复可能覆盖后续业务写入
外部消息发送记录与补救流程通常不能真正撤回影响
公网部署发布版本与切换记录配置、数据和镜像可能不同步

动手练习

  1. 为一个只修改文档的练习任务列出必要能力,说明哪些文件和网络访问并不需要。
  2. 阅读一个虚构测试脚本说明,识别它可能读取的环境变量和产生的外部副作用,不实际连接任何服务。
  3. 写出文件编辑、数据库写入和消息发送的恢复差异,再为高影响动作设置明确的停止条件。

参考答案与推演

完成检查

  • 能区分模型能力、用户授权、工具权限和运行隔离。
  • 知道 worktree 不隔离网络与生产数据。
  • 检查命令的实际脚本、参数和环境,不只看名字。
  • 恢复方案覆盖真实副作用,未承诺万能回滚。

参考与来源

权限、沙箱与危险命令

3 道题 · 及格分 60 分

开始测验