orlyjamie/youshallnotpass
GitHub: orlyjamie/youshallnotpass
为 Hermes 代理设计的按工具和平台粒度的策略网关,将 prompt-injection 引发的危险工具调用转化为可见且可否决的人工审批。
Stars: 1 | Forks: 0
# youshallnotpass
一个可配置的**基于工具和平台的策略网关**,专为 [Hermes](https://github.com/NousResearch/Hermes) 代理设计。它将一次成功的 prompt-injection 从隐秘操作转变为一次**可见且可否决的审批** —— 或者直接予以拦截。
## 核心理念
大多数针对 prompt-injection 的防御措施只是降低了注入成功的*概率*。但在注入依然生效时,能够降低其*影响*的防御措施却寥寥无几。youshallnotpass 正是一款影响缩减器:它假设模型可能会被欺骗,并针对每个工具和每个交互界面(surface),决定一个受骗的代理被允许执行哪些操作。
对于每一次工具调用,它会解析以下一项操作:
```
resolution order: platforms[platform][tool] > rules[tool] > default
allow run it
ask stop for operator approval (Telegram ✅/❌, CLI, or dashboard); fail closed
deny hard-block, always
```
这是对 Hermes 基于命令行/模式匹配的内置审批功能的**补充**。基础网关无法对像 `web_fetch` 这样的原生工具(接收 URL 参数,而非 shell 命令字符串)进行逻辑判断。youshallnotpass 直接基于**工具标识本身**进行拦截,因此你可以设定“`web_fetch` 在 Telegram 上需要审批,但在 CLI 上可直接运行”—— 这是模式匹配网关所无法表达的逻辑。
## 通过聊天实时管理:`/ynp`
`/ynp` **仅限操作员输入,模型绝对无法调用**,因此被注入的电子邮件无法放宽或解除此网关。
```
/ynp list tool catalog SCOPED to the current platform + each tool's state
/ynp config raw policy (rules / platforms)
/ynp allow|ask|deny [platform]
/ynp set [platform]
/ynp on (arm) /ynp off (disarm)
/ynp reload
```
`/ynp list` 会读取 Hermes 的**实时工具注册表**以及平台的 `platform_toolsets`,因此它只会显示在你当前输入端实际启用的工具:
```
🛡 youshallnotpass · ARMED · platform: telegram
enabled on telegram: 8 tool(s) · 64 more exist but are capped off this surface
hardcal
cal_create 🟢 allow 🔒 (hardcal asks before creating)
cal_delete 🟢 allow 🔒 (hardcal asks before deleting)
cal_freebusy 🟢 allow
cal_list 🟢 allow
hardmail
mail_get 🟢 allow
mail_get_attachment 🟢 allow
mail_search 🟢 allow
mail_send 🟢 allow 🔒 (hardmail asks before sending)
default: allow
Toggle: /ynp deny|allow|ask [platform] (🔒 = plugin self-gates)
```
`🔒` 标记用于指示**自我拦截**的工具(其插件会在执行危险写入操作前主动询问,例如 hardmail/hardcal)。为了避免重复弹窗,它们在此处默认设为 `allow` —— 这个锁图标标明了这一点。如果要彻底移除某个工具(而不是对其进行拦截),请使用 Hermes 自带的 `hermes tools`。
## 安装
```
mkdir -p "$HERMES_HOME/plugins"
cp -r youshallnotpass "$HERMES_HOME/plugins/youshallnotpass"
```
在 `$HERMES_HOME/config.yaml` 中启用它,并设置为手动审批模式:
```
plugins:
enabled:
- youshallnotpass
approvals:
mode: manual # REQUIRED. Never "smart" (auto-approves) or "off".
cron_mode: deny
```
策略从 `$HERMES_HOME/youshallnotpass.json` 中读取(文件更改时会自动热重载),并且完全可以通过 `/ynp` 进行编辑。示例:
```
{
"default": "allow",
"rules": { "send_email": "ask", "post_webhook": "ask" },
"platforms": { "telegram": { "terminal": "deny", "web_fetch": "ask" } }
}
```
## 硬性要求(否则将无法提供保护)
- `approvals.mode: manual` —— `smart` 模式会让辅助 LLM 自动批准(注入内容可能会被判定为“低风险”);`off`/YOLO 模式会跳过一切拦截。
- 不得开启 `HERMES_YOLO_MODE` / `--yolo` / `/yolo`。
- 已配置网关**配对/白名单**,确保只有*你自己的*账户能接收并回复审批提示(适配器会在失败时自动执行拒绝拦截)。
- 不得在会绕过危险命令拦截层的沙箱执行器下运行。
## 审批的展现形式
- **网关(Telegram/Discord/……):** 显示为内联键盘;代理会阻塞,直到你点击按钮。
- **CLI:** 同样的拦截机制,表现为终端提示。
它复用了 Hermes 自带的审批流程(`tools/approval.py`);该插件只是在原有基础上增加了针对单个工具/单个平台的解析逻辑。
## 注意事项
- **仅使用标准库** —— 无任何第三方依赖。
- 针对技能/终端命令的可选命令模式拦截具有优雅降级特性:如果宿主环境缺乏公开的 `register_dangerous_pattern` hook,它会退回到扩充已编译模式列表的方式(若上游发生重命名,此方式可能会失效)。
- 仅限操作员使用的 `/ynp`:启用/解除拦截以及策略编辑操作,模型永远无法触及。
## 推荐搭配
- **[hardmail](../hardmail)** / **[hardcal](../hardcal)** —— 原生、无需 shell 命令的邮件和日历工具,其写入操作均带有自我拦截机制。
## 许可证
MIT © 2026 Jamieson O'Reilly (theonejvo)
标签:AI安全, Chat Copilot, Homebrew安装, Streamlit, 人工智能, 大模型智能体, 提示词注入防护, 用户模式Hook绕过, 策略网关, 访问控制, 逆向工具