为什么敢让AI智能体执行系统命令?mercury-agent多层权限系统完整解析
【免费下载链接】mercury-agentSoul-driven AI agent with permission-hardened tools, token budgets, and multi-channel access. Runs 24/7 from CLI, Telegram or More.项目地址: https://gitcode.com/gh_mirrors/me/mercury-agent
你有没有想过:一个 7×24 小时运行的 AI 智能体,凭什么敢直接在你的服务器上执行系统命令?mercury-agent 给出的答案是一套多层权限系统——从命令黑名单、安全读白名单、命令段拆分防注入,到文件系统目录范围管控和符号链接逃逸防护,层层设卡,让 AI 智能体既能干活,又"作不了大恶"。本文带你从零看懂这套设计的每一层防护。
第一层:命令黑名单——永远不执行的"红线"
任何 AI 智能体跑命令,第一步都得先划红线。mercury-agent 内置了一份硬性黑名单(blocklist),命中即拒绝,无论处于什么模式、用户是否点了"总是允许":
sudo *、rm -rf /、rm -rf ~—— 提权与灾难级删除mkfs *、dd if=*、format *—— 磁盘格式化与覆写shutdown *、reboot *、halt *—— 关机重启:(){ :|:& };:—— 经典的 Fork 炸弹del /s /q C:\*、reg delete *等 Windows 侧危险命令
Blocked command: matches "sudo *"这份清单定义在 blocklist.ts,并同步内置到权限清单默认值中(permissions.ts)。关键点在于:黑名单检查发生在一切放行逻辑之前,连"Allow All 全自动模式"也无法绕过。
第二层:安全读命令——白名单自动放行
如果每条命令都要用户确认,AI 智能体会被弹窗淹死。mercury-agent 为此维护了一份安全只读命令白名单:
ls、cat、head、tail、grep、rg、find、wc、git status、git diff、git log……
这些命令只读不写,在任何模式下都自动放行。而npm publish、git push、docker *、rm -rf *、curl * | sh这类有实际副作用的命令则始终需要用户确认。内置工具全景可以参考官方文档:内置工具清单。
第三层:命令段拆分——防注入的关键一招
这一层是最容易被忽略、也最见功力的设计。
假设echo *在自动放行名单里,那么echo hi; rm -rf ~会不会被当成"echo 命令"放行?mercury-agent 的答案是绝不。splitShellSegments函数会把整条命令按;、&&、||、|、&切分成独立段落,还会把$(...)、反引号、子 shell()、花括号块{}单独拆出来逐段检查(permissions.ts):
echo $(rm -rf ~)—— 命令替换被拆出,单独命中黑名单,拒绝 ✅ls; reboot—— 拆成两段,reboot命中黑名单,拒绝 ✅cat foo; rm -rf ~—— 全段必须都是安全读命令才放行,此处失败,转人工确认 ✅
甚至连双引号内部的$(...)都会被挖出来检查——因为 bash 在双引号里同样会执行命令替换。这是一种"宁可误杀、不可漏放"的保守策略。
第四层:文件系统范围管控 + 符号链接防护
命令之外,文件读写走的是目录范围(scope)机制:
| 访问类型 | 规则 |
|---|---|
| 读 | 在已批准范围内直接放行 |
| 写 | Ask Me 模式下每次都询问,即使范围已批准 |
| 范围外路径 | 触发approve_scope工具请求,用户选 Allow(本次)/ Always(永久保存)/ Deny |
其中有一个隐蔽攻击面:符号链接逃逸。一个路径在文字上位于工作目录内,但通过 symlink 实际指向了范围外的敏感文件。mercury-agent 会在写入前对路径做realpath规范化,若最终落点不在任何可写范围内,直接拒绝(permissions.ts)。相关测试用例覆盖在 permissions.test.ts。
第五层:Ask Me 与 Allow All 双模式
会话启动时,mercury-agent 会让你选择权限模式(CLI 用方向键菜单,Telegram 用内联按钮):
- 🔒 Ask Me(默认):文件写入、shell 命令、范围变更都要确认,选项为 Yes / No /Always(选 Always 即切换为自动放行,且按命令精确记忆)
- ✅ Allow All:本次会话全自动批准,重启后重置
值得注意的是远程安全隔离:本地 CLI 的"全部允许"永远不会悄悄抬高来自 Telegram/云端会话的远程请求(permissions.ts)——你在家点了 Allow All,不代表远程消息也能免确认执行命令。权限交互的完整行为见官方文档:Permissions。
动手试试:权限如何落地
所有权限规则持久化在~/.mercury/permissions.yaml,随时可编辑,mercury-agent 不会绕过手工修改。执行链路很直白:AI 调用run_command工具 → 权限管理器checkShellCommand逐层检查 → 通过才交给子进程执行,且带 120 秒默认超时保护(run-command.ts)。Telegram 里随时可用/permissions切换模式。
总结
mercury-agent 的多层权限系统回答了一个核心问题:信任不是靠"管住 AI",而是靠设计。黑名单兜底、白名单提效、段拆分防注入、scope 管文件、符号链接防逃逸、远程通道隔离——五层防线各司其职,才让"让 AI 直接跑系统命令"从一句豪言变成了可以 7×24 放心运行的工程现实。
【免费下载链接】mercury-agentSoul-driven AI agent with permission-hardened tools, token budgets, and multi-channel access. Runs 24/7 from CLI, Telegram or More.项目地址: https://gitcode.com/gh_mirrors/me/mercury-agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考