【免费下载链接】nanoMuse
nanoMuse: an open-source personal agent for every device you own. One agent with a name and a look of its own that does things, keeps working while the app is closed, remembers you, and asks before anything you cannot undo. On Android, iPhone and iPad, Windows / macOS / Linux and in the browser; your phone's screen and your computer as its hands.
nanoMuse 是一个开源的私人 AI Agent(智能体),它能帮你发消息、操作手机和电脑屏幕、读邮件、管理目标——而这些"动手"的能力正是安全风险的来源。为此,nanoMuse 内置了Sentinel 安全哨兵:它像一道闸门坐在模型与所有工具之间,将每个操作按safe / moderate / sensitive三级风险分类,删文件、转账、付款这类不可撤销的动作必须先向你审批;在 Linux 上还会用 bubblewrap 沙箱把 shell 命令关进"笼子"。本文将带你完整看懂 nanoMuse 的三级审批机制与沙箱防护,搞明白它到底拦得住什么。
Sentinel 是什么?AI Agent 与工具之间的"安检门"
nanoMuse 的设计理念来自 Meta 的 Muse:智能体从不直接执行工具,而是把每次调用交给Sentinel.guard(),走一条固定链路:
agent ──► Sentinel.guard() ──► policy ──► 审批(如需)──► 保险库替换密钥 ──► 执行 agent ◄── 脱敏结果 ◄── 污点记账 ◄────────────────┘也就是说,无论模型"想"做什么,最终落到硬盘、网络或手机屏幕上的每一步,都要先过哨兵的策略检查。核心代码就三处:
- 关口:nanomuse/sentinel/gate.py
- 决策:nanomuse/sentinel/policy.py
- 审计日志:nanomuse/sentinel/audit.py
想深入阅读,官方文档在 docs/sentinel.md(中文版见 docs/zh/sentinel.md),行为测试在 tests/test_sentinel.py。
三级风险分级:safe、moderate、sensitive 分别管什么
每个工具都声明一个静态风险级别,哨兵据此决定放行还是询问:
| 级别 | 含义 | 典型工具 |
|---|---|---|
safe | 可逆、本地操作 | 工作区内读写文件、web_search、记忆、目标、提醒 |
moderate | 触及外部或改变状态 | web_fetch、python_execute、读邮件、浏览器、手机操作 |
sensitive | 难以撤销或外部可见 | shell、send_email、保存/删除技能 |
更关键的是动态提级:哨兵会为具体这一次调用单独"加警"——
- 🗑️ shell 命令出现
rm -rf、sudo、curl | sh模式时自动附警告; - 🐍
python_execute的代码一旦碰网络、读环境变量、删文件或触及工作区外的路径,立刻升为sensitive,原因直接写在审批卡片上; - 📱 操作手机点击时,如果点击描述(label)里含有确认支付、转账、提交订单、发送、删除等敏感词,一律按
sensitive处理并询问——这就是标题里"转账、付款前必先问你"的实现。
审批卡片:一次、本次对话、24 小时……6 种授权粒度
当决定是"询问"时,App 或控制台会弹出审批卡片,上面写清楚:用的是什么工具、为什么要执行(你的原始请求)、精确参数、风险级别和原因。你可以拒绝,也可以带范围地允许:
| 你的回答 | 效果 |
|---|---|
| 拒绝 | 不执行,模型收到 "Sentinel blocked",并被叮嘱不要重试同一调用 |
| 一次(Once) | 仅本次,什么都不记 |
| 本次对话 | 该聊天存续期间有效,删除聊天即失效 |
| 直到重启 | 进程退出为止 |
| 24 小时 | 带过期时间持久化在approvals.json |
| 总是(Always) | 持久化,直到你手动撤销 |
授权是绑定到具体目标的,而不是一刀切的开关:允许shell:git不等于允许curl,允许给alice@example.com发信不等于能给别人发。带警告的危险命令(rm -rf、sudo、curl | sh)永远只能逐次审批,任何长期许可都覆盖不了它。
App 里无人应答的卡片默认 1 小时后超时并算作拒绝;而所有已授予的权限都列在头像下方的"权限"面板中,每项都有独立撤销按钮(授权逻辑见 nanomuse/sentinel/grants.py):
bubblewrap 沙箱:给 shell 命令上的一间"隔离房"
审批解决"做不做",沙箱解决"做了能碰到什么"。Meta Muse 给每个用户配一台云端 VM,nanoMuse 跑在你的机器上,于是在 Linux 上用 [bubblewrap](Flatpak 背后的同款工具,apt install bubblewrap即可)为每一次shell和python_execute调用创建独立命名空间:
- ✍️只有工作区可写:
/usr、/etc、/opt、/var全部只读,/tmp是本次调用私有的; - 🚪家目录不存在:保险库、数据目录、ssh 密钥、云凭据、浏览器配置统统看不见;
- 🌐默认断网:只有被评估为需要网络的命令(含
curl、pip、URL 或network=true)才获得外网,否则只带回环接口。因缺网失败的命令会收到说明,模型可带network=true重试——而那时它就要按外发调用再走一遍审批; - 🔐环境变量清洗:名字含
*KEY*、*TOKEN*、*SECRET*等变量全部移除,模型写的脚本连 API key 都读不到。
沙箱在 config/config.example.toml 的[sandbox]段配置,mode = "auto"时检测到 bubblewrap 可用就自动启用;macOS、Windows 和大多数 Docker 容器跑不了沙箱时降级为"清洗环境 + 工作区为工作目录",并在 设置 → Safety 中如实告知。配置示例可对照 config/config.example.toml。
污点追踪:防"提示注入"偷走你的隐私
这是 Sentinel 对提示注入攻击的实际防线。一旦某段对话读取过私密数据(read_emails、联系人、工作区外的文件等),这段对话就被标记为"已污染"(tainted):
- 此后该对话中任何把数据发往白名单外主机的调用,无论风险级别、无论模式(连
auto也不例外),都先弹审批卡片,且卡片上写明目的地; - 污点按对话隔离:读过邮件的聊天不会"传染"旁边的聊天,清除对话即清除污点;
web_fetch每一跳重定向都会检查,私有地址、回环地址、Tailscale 网段(100.64.0.0/10)、云元数据地址一律直接拒绝。
效果是:一个恶意网页就算"指使"Agent 把你的收件箱发到某处,你也一定会先看到目的地再点头。白名单默认覆盖搜索、维基百科、GitHub 和 PyPI,可在 config/config.example.toml 的egress_allowlist中调整。
保险库 + 审计日志:密钥模型看不见,行为处处留痕
凭据保险库让密钥与模型彻底隔离(实现见 nanomuse/vault/vault.py):
nanomuse vault set EMAIL_PASSWORD # 加密存入 <data_dir>/vault.enc nanomuse vault list # 只列名字配置里用{{vault:NAME}}占位符引用密钥——模型看到的永远只是占位符,真实值在审批通过后的执行前一刻才替换;若任何工具输出里意外出现密钥,模型读到前已被替换成[REDACTED:NAME]。
审计日志则保证"不知道发生了什么"不再可能:每条消息、每轮决策、每次审批和工具调用都带 UTC 时间戳追加到audit.jsonl:
nanomuse audit -n 50 # 表格查看最近 50 条App 里点头像打开的活动面板读的是同一个文件。
三种安全模式怎么选:ask、strict、auto
sentinel 的mode决定"风险 × 模式"的最终裁定:
| 模式 | safe | moderate | sensitive | 适合场景 |
|---|---|---|---|---|
ask(默认) | 允许 | 允许 | 询问 | 日常交互使用 |
strict | 允许 | 询问 | 询问 | 高敏感环境 |
auto | 允许 | 允许 | 允许 | nanomuse daemon等无人值守运行 |
注意auto不是"全放行":它仍遵守deny_tools、拒绝规则、污点规则和警告检查——无人值守时遇到仍要审批的步骤,会被记为拒绝并留在动态 Feed 里,而不是偷偷执行。你还可以在[sentinel]段用[[sentinel.rules]]写细粒度规则,比如默认配置里就有一条"拒绝所有含rm -rf的 shell 命令"。
诚实的边界:Sentinel 防得住什么、防不住什么
nanoMuse 跑在你的机器上、以你的用户身份,哨兵是同进程中的一个模块,而非云端 VM 外层的独立防线。官方在 docs/sentinel.md 里给了一份不含糖衣的总结:
✅ 防得住
- 模型做超出你要求的事:所有调用过策略,权限绑定工具与目标、可随时撤销;
- 提示注入外泄:私密数据读后,白名单外主机先审批;
- 模型看到你的密钥:保险库 + 占位符 + 脱敏 + 环境变量清洗;
- "不知道发生了什么":审计日志全覆盖。
⚠️ 防不住(运行前须知)
- 沙箱跑不起来时(macOS/Windows/多数容器),
shell以你的身份运行,你批准的命令能做你能做的一切——重要数据建议放进容器或专用账号运行(官方 Docker 镜像即是); - 保险库密钥默认与数据同目录,能读数据目录的人可解密,重视可用
NANOMUSE_VAULT_KEY指向外部密钥管理; - "总是允许
shell:curl"这类宽泛授权,强度就和你授权的那一刻一样; - 别把服务端口直接暴露到公网;
- 审批疲劳:卡片不看就批,以上全部失效。
安全细节与漏洞报告见 SECURITY.md。
写在最后
nanoMuse 的 Sentinel 把"AI Agent 安全"拆成了四件普通人能检查的事:分级审批(删文件、转账、付款前必须点头)、授权粒度(批到哪个工具、哪个目标,可一键撤销)、沙箱隔离(命令碰不到家目录、默认断网)、全程审计(audit.jsonl有迹可循)。对新手来说,记住一条就够:在 nanoMuse 里,Agent 的手再快,也快不过你屏幕上的那张审批卡片。
【免费下载链接】nanoMuse
nanoMuse: an open-source personal agent for every device you own. One agent with a name and a look of its own that does things, keeps working while the app is closed, remembers you, and asks before anything you cannot undo. On Android, iPhone and iPad, Windows / macOS / Linux and in the browser; your phone's screen and your computer as its hands.
相关推荐
免费快速上手 Chat2DB:自然语言转 SQL 的 AI 数据库管理工具指南
免费快速上手 Chat2DB:自然语言转 SQL 的 AI 数据库管理工具指南 接手一个表名全是英文缩写的陌生库,光查字段就耗掉半天?Chat2DB 是一款免费
即时通讯后端Redis 哨兵模式实战部署:基于 db-tutorial 的一主两从三哨兵配置全解析
Redis 哨兵模式实战部署:基于 db tutorial 的一主两从三哨兵配置全解析 本篇文章以 db tutorial 仓库中 sentinel3 配置目录
文档教程数据库eve 负责任使用指南:上线前的审批、沙箱与数据安全管控实践
eve 负责任使用指南:上线前的审批、沙箱与数据安全管控实践 本指南以 docs/responsible use.md https://link.gitcode
人工智能AI AgentAgent 框架后端工具调用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考