安全设计
每一次调用都守得住的边界
StudioCat 让模型在你的机器上执行操作。我们假定模型可能出错、可能糊涂,也可能被它读到的内容引导——所以边界由 StudioCat 在每一次调用时强制执行,而不是写给模型的建议。本页描述当前版本的设计。
威胁模型
- 在范围内:模型调用了错误的工具、指向了错误的路径或项目、重复写入,或者听从了埋在文件、网页或工具输出里的指令。
- 在范围内:你的 Mac 暴露在网络上,以及凭据通过日志、参数或诊断信息泄露。
- 不在范围内:已经控制了你的 macOS 账户或 ChatGPT 账号的人。任何能使用你 ChatGPT 账号的人都能使用你批准的项目——请为它开启多重身份验证。
传输:只出站
StudioCat 内置 OpenAI 的隧道客户端。它通过 HTTPS 向 OpenAI 长轮询工具调用,并把结果发回去。没有本地服务器,没有监听端口,也没有端口转发;诊断功能同样不会开启监听。调用只会来自你在 ChatGPT 中为自己的隧道添加的 MCP Server。
每一次调用都授权
- 由同一个策略存储判定每一次调用,顺序为:工具 → 命令 → 路径。工具注解只是提示,从不代表权限。
- 路径会先被规范化(符号链接、
..)再检查;别名无法绕过规则,禁止规则优先。 - 只有你在应用里批准过的项目才算数。权限来自你在应用里的操作——从不来自模型,也不来自它传入的路径。
- 终端和提交对每个项目都默认关闭,且从不会被自动开启。
- 输入严格校验:未知字段和错误类型会被拒绝,而不会被强行转换成另一种调用。
- 每个会话都绑定在自己的项目上,一个会话无法悄悄地在另一个项目里操作。
确认
匹配危险模式的命令,会在策略放行之后、真正执行之前,在 Mac 上请你确认。拒绝或超时都意味着什么都没有发生,模型也会被如实告知。确认永远不会放宽边界:被策略拒绝的调用会直接拒绝,不会再问你。命令列表是防手滑的辅助,而不是边界——边界是这个项目到底有没有终端权限。
改动与恢复
- 补丁按项目作为一个整体应用:如果其中一部分失败,已完成的部分会被补偿,失败也会如实报告。
- 每次编辑都可以在“变更审查”中查看和回滚;过期的卡片会拒绝回滚,而不是覆盖更新的工作。
- 检查点使用隐藏的引用和临时暂存区——你的分支、HEAD、暂存区和 stash 都不受影响。
- 命令按进程组停止,取消的命令不会留下仍在运行的子进程。
如实的结果
工具错误会带着稳定的错误码返回(not_authorized、user_denied、冲突……)。如果一次调用在可能已经执行之后超时,模型收到的是 outcome_unknown,并被建议先查看状态再重试——绝不是一句错误的“什么都没发生”。过大的结果会被明确截断,而不是悄悄丢弃。
凭据与数据
- 隧道凭据只保存在你的 macOS 钥匙串中(或你自己设置的环境变量里)。它们从不出现在参数、日志、状态文件或诊断输出中。
- StudioCat 从不上传你的仓库。模型通过工具调用读到的内容会成为你 ChatGPT 对话的一部分,并按 OpenAI 的条款处理。
- 本地审计日志会记录每一次允许和拒绝的决定。不会向我们发送任何内容;除非未来的版本请你主动开启,否则没有遥测。
限制
- 策略不是操作系统级沙盒。开启了终端的项目可以运行你的用户账户能运行的任何东西——只在你自己也会在那里运行命令的项目中开启它。
- 检查点和回滚不是备份,也不覆盖被 git 忽略的文件。
- 补丁回滚在 Mac 崩溃的情况下不保证原子性。
- StudioCat 目前不开源;在此之前,签名并经过公证的版本和这份文档是我们赢得信任的方式。
报告问题
发现了安全问题?请发邮件到 [email protected],主题写“Security report”。请不要附上 API Key 或私有代码。