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。