
📝 TLDR:AI agent 的核心安全问题不是模型是否足够聪明,而是它在犯错、被诱导或误判时到底能碰到什么、能改什么、能影响谁。个人开发者要把 agent 当成会操作后台的员工来设计权限,用工具权限、数据权限、环境权限、读写分离、确认、审计和回滚来限制事故半径。MCP 和外部工具接入会让变现更近,但只有把权限边界做成产品结构的一部分,商业闭环才不会变成事故闭环。
以前 prompt 错了只是难看,现在 agent 错了会动钱
过去讨论 AI 生成内容,常见风险是回答不准确、代码风格不好、页面不够美观,或者 prompt 没写清楚导致结果需要返工。这类问题通常停留在文本和代码层面,损失主要是时间、体验和可信度。
现在的 agent 已经不只是“生成一段内容”。它可以读取代码库、调用命令行、连接数据库、访问支付系统、发送邮件、创建工单、打开浏览器测试页面,甚至在 CI/CD 中完成部署。也就是说,错误不再只表现为“说错了”,而可能表现为“执行错了”。
风险性质因此发生了变化。一个普通聊天模型误解需求,最多生成一段不可用的文案;一个接入生产数据库和支付后台的 agent 误解需求,可能会改错数据、误发通知、错误退款,或者把测试操作带到真实用户环境。模型能力越强,能完成的任务越复杂,对权限边界的要求也越高。
所以,AI 项目的安全问题不应只围绕“模型会不会胡说”展开。更关键的问题是:当模型胡说、误判或被间接提示注入影响时,它到底被允许做什么、能接触哪些数据、能否直接写入生产系统,以及每一步是否可审计、可确认、可回滚。
Claude Code、Copilot Agent、Codex:编程工具正在变成后台员工

2025 年以来,编程工具的形态出现了明显转向。2025 年 2 月,Anthropic 发布 Claude Code,把它定义为命令行里的 agentic coding 工具;到 2025 年 5 月 22 日,Claude Code 从 research preview 进入 GA,并加入 GitHub Actions 后台任务、VS Code 与 JetBrains 原生集成。相关 API 也同时增加了 code execution、MCP connector、Files API 和更长时间的 prompt caching。
GitHub 的路线也类似。2025 年 2 月,Copilot Agent Mode 让 Copilot 不再只是补全代码,而是能理解任务、修改项目并执行多步操作。2025 年 5 月,Copilot Coding Agent 进一步支持在 GitHub 中接收 issue、运行于 GitHub Actions、起草 PR,并通过 MCP 访问外部能力。到 2025 年 7 月,GitHub 又为 coding agent 增加了基于 Playwright MCP 的默认浏览器能力。
OpenAI 的 Codex 路线则体现了另一种双栈形态:一边是本地终端中的 Codex CLI,强调开源、可读改跑代码;另一边是云端 Codex app,面向异步任务和更长工作流。再往后,ChatGPT agent 将浏览器、终端、API 和连接器合并进统一代理模式,说明编程 agent 与通用工作 agent 正在靠近。
这些变化共同指向一个事实:AI 编程工具正在从“编辑器里的助手”变成“可以在后台工作的员工”。它们不只回答问题,而是在接管任务流:理解需求、找上下文、改文件、运行测试、开 PR、看页面、接外部系统。对开发者来说,这提高了产能;对安全设计来说,这也意味着必须像管理一个真实员工一样管理 agent 的权限、岗位边界和操作记录。
真正的安全边界不是 OAuth,而是最小权限的三层设计

很多产品接入外部系统时,会首先想到 OAuth。OAuth 解决的是授权连接问题:用户是谁、是否同意某个应用访问某个服务、访问令牌如何发放和撤销。它很重要,但它不是完整的 agent 安全边界。
原因在于,agent 的风险不只来自“有没有登录”,还来自“登录之后能做什么”。一个用户授权了 Stripe 或 Supabase,并不等于 agent 应该默认拥有所有支付、退款、订阅、SQL、migration 和生产数据权限。身份认证只回答“你是谁”,权限设计还必须继续回答“你在这个任务里能访问什么、能写入什么、能影响哪个环境”。
对个人开发者来说,可以把最小权限拆成三层:工具权限、数据权限和环境权限。工具权限决定 agent 能调用哪些工具,例如读文件、跑测试、查日志、发邮件、退款、部署;数据权限决定它能访问哪些表、字段、文件、客户记录或业务对象;环境权限决定它只能操作本地、预览、测试环境,还是可以触达生产环境。
这三层应当按任务临时授予,而不是按用户一次性全开。例如,一个修复前端样式的 agent 可能需要读代码、改 CSS、运行本地构建,但不需要访问客户邮箱、支付后台和生产数据库。一个分析订单异常的 agent 可能需要读取部分订单状态和日志,但不一定需要执行退款。权限越贴近任务本身,事故半径越小。
读权限和写权限必须分开:让 agent 先看懂,再决定能不能动手

在 agent 工作流里,读取上下文是必要步骤。它需要查看代码、schema、日志、文档、错误堆栈、issue 描述和历史提交,才能形成合理判断。没有足够上下文,模型更容易猜测;上下文越完整,任务成功率通常越高。
但读取权限和写入权限不应混在一起。读取代码库、数据库结构、只读日志和 API 文档,属于理解任务所需的低风险权限;执行 SQL、修改生产数据、发送邮件、发起退款、创建订阅、部署服务,则属于高风险写操作。后者一旦出错,影响会直接进入业务系统。
比较稳妥的做法是让 agent 先以只读身份完成诊断:说明它看到了什么、判断依据是什么、准备执行哪些步骤、每一步会影响哪些对象。只有当计划被确认后,再按步骤授予有限写权限。写权限也应尽量细分,例如只允许更新某一张测试表、只允许发送到内部邮箱、只允许创建草稿 PR,而不是直接拥有全局管理员权限。
写操作还需要配套确认、审计和回滚。确认用于阻止模型误判直接落地;审计用于在事故后知道谁在什么时候触发了哪个工具、参数是什么、返回结果是什么;回滚用于把错误影响控制在可恢复范围内。对于个人项目,这不一定意味着复杂的企业级权限系统,但至少应有操作日志、环境隔离、人工确认和明确的撤销路径。
MCP 让变现更近,也让事故半径更大
MCP 的价值在于把外部系统以统一协议暴露给模型和 agent。随着官方 MCP Registry 上线,以及 Stripe、Supabase 等服务提供官方 MCP server,个人开发者可以更快地把支付、数据库、文档、内部工具接入 agent 工作流。上下文工程也从“写好 prompt”扩展成“如何装配、隔离、缓存、授权和验证工具链”。
这为产品化带来了新机会。Stripe 已经提供面向 MCP app 的变现文档,也支持与 ChatGPT 中 Instant Checkout 相关的商业链路。独立开发者不再只能卖 SaaS 页面或传统 API,也可以把一个能完成具体业务任务的 agent/MCP app 做成收费产品,例如自动整理订单、生成运营报告、辅助客服处理退款申请,或为某类垂直工作流提供智能后台。
但同一条链路也会放大风险。Stripe MCP 涉及 OAuth、支付、订阅、退款等工具;Supabase MCP 可以让 agent 读取 schema、执行 SQL、处理 migration。它们让 agent 离真实业务更近,也让一次错误操作更容易进入收入、客户、数据和合规流程。
因此,商业闭环必须同时设计风险闭环。收费产品需要考虑的不只是“用户能不能完成任务”,还包括用户是否清楚授权范围、每个工具是否有默认限额、是否区分测试和生产、是否记录高风险调用、是否允许用户撤销连接、是否能在异常成本或异常操作出现时自动停止。对个人开发者而言,这些设计会直接影响毛利率、客服成本和长期可信度。
给个人开发者的上线前权限清单
发布 AI 工具、MCP server 或自动化工作流前,可以把权限检查当成和支付、部署、监控一样的上线步骤。它不需要一开始就非常复杂,但要避免“一个密钥通吃所有系统”“一个 agent 直连生产环境”“所有工具默认可写”这类基础问题。
下面这份清单适合个人开发者在上线前逐项检查,也适合在产品迭代中持续复盘。核心原则是:先让 agent 看懂任务,再让它在受限范围内行动;先从低风险读权限开始,再对高风险写权限增加确认、限额和审计。
- 密钥边界
:不要把全权限主密钥交给 agent。为不同工具、不同环境、不同客户创建独立 token,并设置过期、撤销和轮换机制。 - 环境边界
:默认连接本地、沙盒或测试环境。生产环境必须单独授权,高风险操作应要求人工确认或二次审批。 - 读写分离
:读取代码、schema、日志和文档可以作为默认能力;执行 SQL、发邮件、退款、部署、删除数据等写操作应单独列入高风险工具。 - 工具白名单
:不要让 agent 自动发现并调用所有工具。按具体任务开放最少工具,并为每个工具写清楚用途、参数范围和禁止事项。 - 数据最小化
:只给 agent 当前任务需要的数据字段。能脱敏就脱敏,能聚合就不要暴露明细,能按租户隔离就不要跨租户查询。 - 确认机制
:凡是会影响用户、资金、生产数据和线上服务的动作,都应先输出计划,再由用户确认后执行。 - 审计日志
:记录 agent 调用了什么工具、传入什么参数、影响什么对象、返回什么结果。日志本身也要避免泄露密钥和隐私。 - 回滚方案
:上线前明确错误执行后的恢复路径,例如数据库备份、退款撤销规则、邮件补救流程、部署回滚和任务重放。 - 成本限额
:为模型调用、工具调用、浏览器任务、数据库查询和第三方 API 设置预算上限,防止重度用户或循环任务造成亏损。 - 用户授权说明
:用清晰语言说明 agent 会访问哪些服务、能做哪些操作、哪些操作需要确认,以及用户如何断开连接。
AI agent 的产品价值来自“能行动”,主要风险也来自“能行动”。模型能力会继续提升,工具链会继续标准化,个人开发者能接入的系统也会越来越多。越是在这种情况下,越需要把权限边界作为产品结构的一部分,而不是上线前临时补一层提示词。
(以上为译文,以下为AI反思)
主流叙事喜欢把 AI agent 的风险包装成“模型还不够强”“需要更好的对齐”“需要更聪明的推理”。更深的真相是,很多严重事故从来不是因为系统不聪明,而是因为系统在错误状态下仍然拥有过大的行动权。1975 年 Saltzer 和 Schroeder 总结操作系统安全原则时就已经提出最小权限思想,1988 年 Norm Hardy 提出的“confused deputy”问题也说明,真正危险的不是坏人直接拿到权限,而是一个被信任的程序在错误上下文里替别人行使了不该行使的权力。AI agent 只是把这个老问题套上了自然语言界面和自动执行能力。
另一个被弱化的事实是,自动化系统一旦连上资金、生产环境和客户触点,失败速度会比人类组织的反应速度快得多。Knight Capital 在 2012 年因为交易系统部署和控制缺陷,在约 45 分钟内造成约 4.4 亿美元损失;这不是“算法不会写作文”的问题,而是自动化执行、生产开关、回滚机制和权限隔离同时失守。把这个案例放到 AI agent 时代看,一个能退款、发邮件、改数据库、部署代码的 agent,本质上就是一个会说话的自动化交易员、运维员和客服主管的混合体。
为什么这种真相不常被公开讨论?因为它和增长叙事相冲突。AI 平台、云厂商、支付公司、SaaS 工具和集成市场更愿意展示“一个 prompt 完成工作流”“一键连接所有工具”“agent 替你跑业务”,因为这有利于获客、融资、生态绑定和交易抽成。更常反对这种叙事的是安全工程师、SRE、合规负责人、数据库管理员和经历过生产事故的老开发者;他们的动机不是阻碍创新,而是知道真正的系统风险往往发生在 demo 之后、用户授权之后、工具链默认全开之后。
还有一个不舒服的真相是,OAuth、同意弹窗和漂亮的授权页经常给用户一种“我已经安全授权了”的错觉。现实里,用户很少理解 scope 的业务含义,更不会逐项推演“这个 agent 在被提示注入时能不能读客户邮箱、能不能导出订单、能不能触发退款”。主流产品设计会刻意降低这种摩擦,因为每多一个确认页、每多一次权限解释,转化率都可能下降;但被省略掉的摩擦,最后往往会以客服成本、合规风险和用户信任损失的形式回来。
这类作者或安全型思考者看问题的第一秒,不会先问“模型能不能完成任务”,而会先问“如果它以错误方式完成任务,最坏会伤到哪里”。他们看到的不是 prompt、工具和炫酷 demo,而是行动链路里的主体、权限、资源、环境、可逆性和审计点。一个普通用户看到“AI 自动处理退款”会觉得省时间;他们第一反应是“它能退多少钱、退给谁、能不能批量退、谁确认、日志在哪里、错了能不能追回”。
他们会把问题切成几层,而不是把“授权”当成一个整体。第一层是身份:谁在请求。第二层是任务:这次到底要完成什么。第三层是工具:需要哪些动作。第四层是数据:能看哪些字段、哪些租户、哪些客户。第五层是环境:本地、测试、预览还是生产。第六层是后果:这个动作是否影响资金、用户、隐私、线上服务或法律义务。这样切片之后,很多“给 agent 一个 API key 就好了”的方案会立刻显得粗糙。
他们会主动丢掉几个常人保留的假设。第一个假设是“用户授权了就代表 agent 应该拥有全部能力”;他们会认为授权只是起点,不是边界。第二个假设是“读权限没事,写权限才危险”;他们知道只读客户数据、日志、环境变量和商业指标也可能造成泄露和合规事故。第三个假设是“模型越来越强,犯错会越来越少,所以权限可以放宽”;他们反而认为能力越强,能够制造的事故越复杂,越需要把可执行范围缩小。
今天用 30 分钟给三个高风险动作写一张事故卡片。每张卡片只回答四个问题:如果这个动作被错误执行,最坏损失是什么;我多久能发现;我在哪里能看到完整日志;我如何撤销或补救。比如错误退款、误发邮件、误删数据、错误部署都可以这样写。写完之后,如果你发现某个动作“发现不了、查不到、撤不回”,它就不应该被 agent 直接执行。
今天用 10 分钟检查你的密钥命名和存放方式。凡是叫 ADMIN_KEY、SERVICE_ROLE、MASTER_TOKEN、PROD_SECRET 的东西,都默认当成不能交给 agent 的高危对象。为本地开发、测试环境、只读查询、单一客户或单一工具分别设计更窄的 token,哪怕只是先在文档里列出计划,也比继续让一个全权限密钥通吃所有系统更接近安全。
🚨友情提醒:这篇文章强调权限边界是对的,但它可能低估了过度权限设计对早期产品速度的伤害。个人开发者如果一开始就做企业级 RBAC、复杂审批流、细粒度审计和多层策略引擎,可能会把一个本来两周能验证的产品拖成三个月的基础设施项目。更现实的边界是按风险分层:影响资金、用户、生产数据和外部发送的动作必须严控;只影响本地草稿、测试数据和可丢弃环境的动作可以先保持轻量。 文章把读取权限描述为相对低风险,这在工程实践上有道理,但在隐私和商业场景里需要补一句:读权限本身也可能是事故。只读日志可能包含 token、邮箱、IP、订单号、错误堆栈和用户输入;只读数据库可能暴露客户名单、收入结构和敏感字段;只读代码库可能暴露未发布功能和安全漏洞。对于某些产品,数据泄露比误写一次测试表更严重。 文章默认个人开发者能够把工具权限、数据权限和环境权限拆得足够细,但现实中的第三方平台 scope 经常并不理想。有些 API 只有粗粒度权限,有些 MCP server 默认暴露过多工具,有些 SaaS 的测试环境和生产环境隔离并不彻底。也就是说,最小权限不仅是开发者自己的产品设计问题,还受制于上游平台的权限模型、SDK 默认行为和生态成熟度。 权限边界也不能替代产品判断、测试和业务规则。一个 agent 即使被限制在正确工具内,也可能因为理解错需求而生成错误方案;即使需要人工确认,用户也可能因为确认疲劳一路点同意;即使有审计日志,事故也可能已经影响客户关系。更完整的方案应该把权限边界、任务评估、测试用例、异常检测、成本限额和人类责任链放在一起,而不是把所有希望都压在“最小权限”一个原则上。
夜雨聆风