ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Munder Difflin Hire Manifest 安全:如何防御不可信输入劫持 Agent 角色

Munder Difflin Hire Manifest 安全:如何防御不可信输入劫持 Agent 角色 Munder Difflin Hire Manifest 安全如何防御不可信输入劫持 Agent 角色【免费下载链接】munder-difflinA local multi-agent harness that works with your existing Claude Code, Codex subscriptions, allows you to run an office of agents项目地址: https://gitcode.com/GitHub_Trending/mu/munder-difflinMunder Difflin 是一款本地多 Agent 编排工具local multi-agent harness能基于你已有的 Claude Code 或 Codex 订阅运行一整间Agent 办公室。它的 Shareable Hire可分享雇佣功能可以导入一个 JSON 的 Hire Manifest 文件一键生成配置好的 Agent 角色——但这份清单来自别人本质上是不可信输入。本文用通俗语言拆解它的五道安全防线看 Munder Difflin 如何防止恶意清单劫持你的 Agent。️什么是 Hire Manifest一键导入 Agent 角色一个hire就是一份带版本标签munder-difflin/hire1的 JSON 文件描述一个配置好的 Agent 角色名字、用哪个模型、执行什么目标、带哪些命令行参数、Token 预算上限等。社区画廊里就有现成例子比如这位自动 PR 审查员 Jim清单示例jim-pr-reviewer.hire.json清单规范HIRE_SPEC.md清单进入应用的只有两条路munderdifflin://hire?srchttps-url深链接由主进程联网获取以及本地文件导入。两条路最终汇入同一个校验器src/shared/hire.ts并终结在同一个地方——添加 Agent弹窗只做预填充展示所有字段供你检查。为什么它是危险入口一份清单等于一次点击链接没人会在打开.dmg安装包前逐字节审计同样也没人会逐字段审查一份别人发来的 JSON。所以这份清单和你点击的任意网页链接属于同一类东西攻击者可控的输入。只要清单里的某个字段能影响运行什么程序、传什么参数、请求什么 URL它就不再是数据而是攻击者在你机器上触发的一次动作。Munder Difflin 的导入流水线因此被设计成一道安全边界逐字段证明清单里的任何内容都无法变成机器上的操作。防线一导入永不自动启动 Agent整条设计里最重要的一条属性清单只是数据永远不是动作。导入一个 hire 只做一件事——在添加 Agent弹窗后预填充字段并显示imported横幅提醒你这些值来自外部。它不会启动任何东西。Agent 只在你逐字段检查完、亲手点击提交时才被创建。深链接、文件导入、畸形但巧妙的构造都没有任何一条代码路径能导入即启动。这意味着人是启动闸门而且是结构性的即使某个字段意外漏过人类确认之前什么都不会运行。防线二清单里没有可执行文件字段第二道结构性防御是一个缺失Hire 的 schema 里根本没有command或executable字段。清单不能指定要运行什么程序。二进制永远来自你本地已配置的 provider 预设claude、antigravity、codex等provider: custom会被校验器直接拒绝——因为自定义 provider 是让用户能指名任意本地二进制的逃生门绝不能让一个下载的文件伸进来。所以清单在运行什么这个维度上最坏只能在你已经信任的provider 之间做选择永远无法引入curl或/bin/sh。攻击面因此被压缩到传给已安装程序的参数——而那正是下一道防线守的地方。防线三默认拒绝的 Flag 白名单 ⚠️commandFlags是最明显能搞事情的字段它的第一版用了黑名单——列举危险参数然后拒绝。结果漏了而且是在三轮安全评审里各漏一次每轮都发现一个 CLI 新出的危险参数没被拦下比如把后端地址重定向走、从而外传凭据的参数。原因很简单清单的provider是攻击者选的而各 CLI 每个版本都在加参数。黑名单赌的是你枚举了所有坏值可坏值列表永远在增长白名单赌的是你枚举了所有安全值而安全集很小、很稳定。于是 Munder Difflin 翻转成了默认拒绝的白名单见 src/shared/hire.ts 中的SAFE_FLAG_NAMES每个 flag 必须同时过两道门——字符集校验无空格、无 shell 元字符、无%环境变量展开 名称必须在极小的安全集合内目前只有--model、--max-turns、--output-format、--verbose。一切涉及权限、沙箱、配置、MCP、系统提示词、后端地址的参数永远不可能进白名单。校验通过的参数也以 argv 数组形式交给node-pty从不拼进 shell 字符串。防线四防 SSRF 的有界远程获取深链接会把一个 URL 交给 Electron 主进程去抓取而主进程手握网络和操作系统权限。天真的实现就是一个经典的SSRF服务端请求伪造原语远程页面指挥你的应用向你本不想访问的地址发请求。传输层 src/main/hire.ts 在三个维度做了加固攻击面加固方式明文降级只允许 httpshttp 仅限回环地址本地画廊开发用远程页面永远无法把应用指向明文内部服务重定向绕路手动接管重定向上限 5 跳每一跳的Location都按同一套 https 公网地址白名单重新校验私网/回环/链路本地地址含云元数据端点169.254.169.254一律拒绝IPv6 方括号[::1]也绕不过内存耗尽流式读取响应体累计超过64 KB立即中止外加 10 秒超时绝不信任content-length头一份清单通常只有几百字节 JSON声称有几兆的按定义就不是 hire。这个设计背后的真 bugWindows 命令注入以上不是纸上谈兵。第一轮评审就发现了一个HIGH 级漏洞model字段只做了长度限制、没做形状校验而它会以--model value的形式流入启动命令行且只含空格才加引号。于是清单里写一个不含空格的xcalc在 macOS/Linux 上无害argv 直连node-pty不经过 shell但在Windows上npm 安装的claude/codex默认是.cmd包装脚本启动会经过cmd.exe而当时没有被转义——命令行变成claude --model x calc点击一个链接就实现任意代码执行。修复刻意做成双层边界处校验model限定为不含 | ^ ; $ %等元字符的字符集并且在出口处加固 Windows 参数引号器对含元字符的 token 一律加引号保护应用内所有启动路径。两层防的是不同的失误校验器懂model 该长什么样引号器懂任何来源的参数都不该逃出命令行位置。缺任何一层都可能复发两层同时在场一个被遗忘的字段检查就不再单独构成代码执行漏洞。把这条清单交给人之前还剩什么风险诚实地说还有两个自由文本字段——goal和description它们会预填充 Agent 实际运行的提示词这是一个提示注入面清单可以建议一个任务措辞受攻击者影响。v1 版本接受这一点基于两点人在启动前会审查弹窗里的每一个字段而真正能把中毒提示变成实际破坏的东西二进制、参数、设置覆写都已在上游锁死。清单永远不能当启动闸门人才能。可迁移的 5 条规则防御导入不可信配置剥掉细节这套 Hire 流水线就是任何导入外部配置功能都该抄的作业让导入保持惰性——导入数据永远不该是动作预填充由人类提交别让数据指名可执行文件——配置只能在你已信任的程序间选择边界校验 出口引号两层都要——它们拦的是不同的失误对敌意输入用白名单不用黑名单——白名单赌的是小而稳定的安全集不会腐烂每一跳重定向都重新校验永远别信content-length——SSRF 藏在最后一跳和无界响应体里快速上手安全地导入一个 Hiregit clone https://gitcode.com/GitHub_Trending/mu/munder-difflin安装并启动 Munder Difflin 后从 社区画廊 下载一份.hire.json清单在应用里打开Add agent → import hire…选择该文件逐字段检查预填充的弹窗goal、model、flags、token 预算确认无误后由你点击 spawn —— 记住人是闸门 ✅想更深入可以看画廊自带的前端校验器 validator.js 与 JSON Schema hire.schema.json——它们与应用内校验器执行同一套规则四处副本保持一致没有哪一份比另一份更宽松。一句话总结可分享的 hire 就是你点击的一个链接整条导入流水线的目标就是让这次点击看起来有多无聊就有多无聊。【免费下载链接】munder-difflinA local multi-agent harness that works with your existing Claude Code, Codex subscriptions, allows you to run an office of agents项目地址: https://gitcode.com/GitHub_Trending/mu/munder-difflin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表