Noma Security 新发的《Lethal by Design》白皮书,把开发者过去基本当作「差不多一样东西」对待的两种 AI Agent 扩展机制 —— MCP 服务器,和 Skills(Claude Skills 这一套,如今正在向其它 agent 平面扩散)—— 在架构上画出了一条更清楚的分界线。被引用最多的是那个头条数字:在被分析的 MCP 服务器中,大约每四个就有一个、在八种「能力分类」的某一档上,暴露出代码执行风险。方法论在公开的摘要里没完全披露(样本量、所覆盖的 registry、八种「代码执行风险」分别如何定义,都不清晰),所以把这个比例当成方向性信号,不要把它当成同行评议过的审计结果。底下那一句更承重的架构观察才是重点。

那一句观察:MCP 工具和 Skills 在「写 agent 的人」眼里长得很像,但其实活在「可观测性边界」的两边。当一个 agent 调用 MCP 工具时,防御方看得见参数出去、响应回来 —— 这一切是结构化的、可记录的、像源代码那样可以枚举的。Skills 不一样:agent 把一段文本指令集加载进自己的推理上下文,接下来发生的事就在「模型推理内部」展开,可观测性工具跟不进去。你能审计交付这份 Skill 的文件;但一旦这份 Skill 已经进入上下文,模型在 runtime 的判断,你审计不到。这不是「换一套更好的 SIEM 就能补上」的工具差,这是 Skills 工作方式上结构性的事。

白皮书举了五个真实事故模式给这个抽象做锚。**ContextCrush**:文档被投毒,导致本地文件外泄。**ForcedLeak**:CRM 数据被投毒,触发对敏感记录的查询。**DockerDash**:Docker 镜像元数据被投毒,触发命令执行。**Replit 和 Amazon Q 那两起已经发生的事故** —— agent 幻觉直接把生产环境删了。**记忆篡改** —— 反复触发欺诈性的金融转账。这些不是猜想;它们映射到的是当下生产环境里 agent 部署中实际存在的、特定形态的架构暴露面。每一个都是同一句话的不同变体:「这个 agent 被允许做了它不该做的事,而周围的安全栈没抓到,因为相关那一步判断,发生在一个不发出可观测信号的层。」

Noma 的防御框架叫 “No Excessive CAP”:**Capabilities(能力)** —— 用窄白名单挑工具,固定 MCP 版本;**Autonomy(自主度)** —— 对不可逆动作设审批门;**Permissions(权限)** —— 用「按用户、有过期时间」的凭据,不要用静态服务账号。对开发者而言,落地解读是:agent 的安全栈,正在沿着可观测性问题这条线分叉。原本对 MCP 有用的那一类工具 —— 进程外防火墙(比如 Pipelock)、网关式 enforcement —— 对 Skills 没用,因为 Skills 不会发出代理可以拦截的外部调用,它们是从模型内部塑形模型行为的。如果你的 agent 部署同时用 MCP 和 Skills,你需要两套不同的安全姿态:对 MCP 走「网络边界 enforcement」,对 Skills 则要在它进入模型上下文之前,先做「内容审阅」(content review)的纪律。白皮书在 go.noma.security/lethal-by-design。