安全检查清单
你的卡片会在别人的电脑上运行,旁边就是能修改他们代码、运行命令的智能体。应用做了大量工作来约束它—— 但你申请什么、用它做什么,责任在你。本页是分享卡片之前、以及每次发布之前都要过一遍的检查清单。
应用已经保证的事
这些你不需要(也无法)削弱:
- 卡片运行在单独的沙箱进程中,无法访问应用、Node.js、其他卡片、Cookie 或
localStorage,不能打开窗口、不能让应用跳转,也不能在自己的方框之外绘制。 - 除了通过 SDK,它什么都访问不到——网络、文件、智能体都不行——而应用会把每个请求与用户的授权核对。
- 它的页面只加载自己卡片包中的文件:没有远程脚本、没有内联脚本、没有
eval。 - 卡片页面中禁用了 WebRTC 和 DNS 预取,因此不存在通往网络的旁路。表单永远不会跳转页面,嵌套的框架会被移除,页面也无法写入剪贴板。
- 决定和密钥由应用在它自己覆盖整个窗口的对话框中询问,卡片无法模仿;你的文字在那里只会以引用的形式出现。
- 即使有
fs.write,.git、智能体和编辑器的设置、CI 工作流以及包管理器设置也无法被修改;当工作区是主文件夹或磁盘根目录时,卡片根本得不到文件访问权限。 - 无论以何种方式发送,每张卡片的提示词和命令都有上限(每分钟 6 条和 30 条),而当箭头或权限消失时,排队中的提示词会被丢弃。
- 数据只能沿用户画出的箭头到达另一张卡片或智能体。
- 输入到
secret设置中的密钥永远不会到达卡片。 - 卡片的每份副本都有自己的存储;不同卡片包之间无法读取彼此的数据。
发布之前
权限
- 每项权限都确实用到了。删掉残留的——每一项都是安装对话框中的一行,也是用户拒绝的一个理由。
- 每项权限都有通俗易懂的
reason。 - 很少用到的强权限设为
optional,在使用时再申请。 -
network列出的是具体主机。不要用包罗万象的域名、粘贴板服务、短链接服务,或你并不需要的*.通配符。 - 除非卡片本身就是关于本地服务器的,否则不要使用
network.local。
提示词、工具和命令——高风险部分
- 来自网页、文件、端口或智能体输出的任何内容,都不会在用户看到之前被转发进
agents.prompt或terminals.run/write。 否则,一个恶意网页或文件就能接管用户的智能体(提示词注入)。 - 由不可信文本构造的提示词使用
submit: false,由用户检查后发送。 - 命令是固定字符串,或由用户自己输入的设置拼成——绝不来自抓取的数据。拼接进去的内容都要加引号转义。
- 智能体能调用的工具在没有先
card.ui.confirm的情况下,不做任何破坏性操作(写文件、运行命令、发送提示词、花钱)。 - 包含外部内容的工具结果会注明来源,并保持简短。
- 绝不在循环中发送提示词。上限是每分钟 6 条,而且预算照样计入。
密钥
- API 密钥是
secret设置,并以{{secret:key}}的形式用在请求头中——绝不是卡片内的文本输入框,绝不放在存储里,绝不出现在代码或仓库中。 - 你的卡片不会在正文中索要密码或密钥。用户已被告知 NeuroSquad 从不这样做,而且真正的询问会让整个窗口变暗。
- 你的卡片不需要在
localhost上使用密钥——它们永远不会被发送到那里。
文件
- 确实需要
fs.write。如果只是生成一份报告,可以考虑改为发送到一篇笔记。 - 只写入用户预期的位置(比如在设置中指定的文件夹),绝不覆盖配置文件、锁文件、CI 文件或在构建时会运行的脚本。
- 重写用户可能正在编辑的文件时使用
ifMtimeMs。 - 除非这就是卡片声明的用途,否则不读取
.env或其他机密文件。
你展示和发送的数据
- 来自外部的文本以文本形式渲染(
textContent),而不是 HTML(innerHTML)。沙箱能挡住最坏的情况,但你的卡片仍然可能被篡改或误导。 - 端口只发送它的描述所说的内容。
- 你不根据
window的message事件行事:任何卡片都能向你的框架发送消息。SDK 的通道是唯一可信的通道。
打包与更新
-
pack --dry-run只列出你想发布的内容——没有.env、密钥、私人笔记、node_modules,或含真实数据的测试夹具。 (除非你传入--allow-secret-files,否则pack会拒绝看起来像凭据的文件。) - 你的名称和作者没有自称 NeuroSquad、official 或 verified。
- 你的 GitHub 账号开启了双重验证。任何能推送到你仓库的人,都能给你的用户推送更新。
- 依赖已锁定(有锁文件),发布前从干净的安装重新构建。
- 新增权限的变更单独发布,并附上说明。
行为
- 卡片不可见时暂停轮询和动画,并在
onSuspend中保存。 - 网络轮询频率合理(上限是每分钟 120 个请求——请远低于此)。
- 某项权限被撤销时,卡片仍能工作——降级处理,并解释原因。
发现了卡片突破方框、访问未授权内容,或骗过应用自身对话框的办法?那是 NeuroSquad 的安全漏洞,而不是你卡片的问题—— 请通过 Discord 服务器私下告知团队,而不要发在公开讨论中。
用户会被告知什么
安装对话框会用下面这些话告诉用户:这张卡片是未经 NeuroSquad 审核的社区代码;每项权限在最坏情况下意味着什么 (例如有网络权限时,“anything the card can see may be sent there”——卡片能看到的任何内容都可能被发送到那里); 以及“anything inside the card is the card’s own”——卡片内部的一切都属于卡片本身。 写描述和理由时,要让一个谨慎的用户在读到这些话之后,仍然愿意点同意。