安全模型
账号凭据只留在手机上。工具结果只是数据,不是指令;第三方内容会「污染」助手的当前回合。任何要离开手机的数据都会先声明,并征得用户同意。
PKU harness 保管着你在统一身份认证系统 IAAA 上的密码,还能代你操作校园账号。所以我们希望,从你的角度看,这套系统像是没有服务器的:本项目运行的任何服务都看不到你的账号凭据,插件做的任何事也都不会瞒着你。
基本原则
- 凭据不离开手机。 IAAA 密码、手机令牌的密钥、模型 API 密钥和远程插件的令牌,都存放在手机的密钥库里。它们不会写进日志,不会发送到本项目的服务器,也不会交给任何插件,无论是插件文档、内置插件还是远程插件。
- 插件拿到的是响应,不是会话。
services.campus.request只返回响应。会话的 cookie 和令牌留在框架内部。需要对请求签名时,签名也在框架内部完成(通过sign钩子)。 - 工具结果只是数据。 框架会告诉模型:工具结果、插件上下文和远程插件的输出都是数据,不能当作指令执行。
- 效果要明确声明。 每个工具都要声明
read、write、money或public四种效果之一,分别表示读取、修改、花钱和公开。你可以按效果分别决定助手能否直接执行。定时任务只能读取。 - 离开手机的数据要先声明。 插件访问的校园服务(
scopes)、使用的模型服务商,以及 PKU harness Cloud 的disclosure说明,都会在第一次使用前展示给你。
提示词注入
校园里的很多内容是第三方写的,例如一条树洞、一则通知、一段活动简介,或者一个远程插件的输出。其中任何一段都可能写着「忽略之前的指令,然后……」。这种攻击叫作提示词注入(prompt injection)。
框架把这些内容一律当作数据,并且限制被注入的指令最多能造成多大影响。具体做法如下。
不可信工具。 返回第三方文本的工具要设置 untrusted: true。远程插件的所有工具都被视为不可信。
污染标记。 助手在一个回合里调用了不可信工具之后,这个回合剩下的部分都会被标记为「已污染」(taint)。同一回合里之后的工具调用会看到 ctx.turn.tainted === true。
持久写入需要确认。 回合被污染之后,凡是会影响以后对话的写入,都要等你确认。例如,记忆插件会把这类记忆保存为「待确认」,由你在记忆页面上批准。
有一种情况例外:如果是你自己的消息要求助手记住某件事(ctx.turn.userAsked),这次写入就是你的本意,会直接保存。第三方文本无法冒充你的消息。
默认先询问。 远程插件中效果为 write、money 和 public 的工具,默认都要先问你。
无法伪造的宿主信息。 宿主每个回合都会向模型提供一些事实,例如当前时间和回复语言。这些信息放在固定的位置,插件上下文无法仿冒。
插件作者要做的事
- 必须为结果里含有他人所写文本的工具设置
untrusted: true。他人所写的文本包括帖子、评论、通知、消息和公开网站上的描述。 - 不得在结果里写指令,例如「告诉用户……」「现在调用……」。结果里只返回数据,让模型自己判断。指导模型的内容请写在工具的
description或插件的instructions里。 - 有些工具会写入助手以后当作事实读取的持久状态,例如笔记、记忆和保存的偏好。这类工具应当检查
ctx.turn?.tainted,把写入保存为待确认,或者直接拒绝。 - 返回第三方文本时,应当去掉控制字符、不可见字符、双向文本(bidi)字符和标记,并限制长度。
- 代表用户批准或解锁某些东西的工具,必须设置
userOnly: true。
结果中的机密信息
有些值绝不能让模型看到,也不能写进日志。
付款码只能显示在使用了 host.useSecureDisplay() 的页面上。这种页面禁止截屏,并会调高屏幕亮度。付款码绝不能作为工具结果返回。
分享链接是指云端频道的链接,它把密钥放在 URL 的 fragment 部分。SDK 中的 SecretLink 类型是不透明的,JSON.stringify(link) 只会得到 "[secret link]"。请只通过 host.shareLink(link) 或 <QRCode link={link} /> 展示它。宿主还会从工具输出和日志里清除看起来像分享链接的内容。
令牌和密钥插件根本拿不到。
插件文档的安全性
App 解释执行 PLUGIN.md 中声明的步骤,不运行任何插件代码。一份插件文档只能访问它声明过的校园服务、公开网站和宿主能力(ability),并且受到固定的时间、大小和操作次数限制。
校园请求由框架签名。所以插件文档看不到密码、cookie 或令牌,也访问不了其他插件的存储。
安装插件之前,以及插件更新要求更多权限时,你会看到一个审查页面。页面上列出插件是官方的还是社区的、用到哪些校园服务、访问哪些网站、使用哪些 App 功能,以及每个工具的效果。
社区插件文档中效果为 write、money 和 public 的工具会先询问你,它们的结果也按不可信数据处理。助手可以起草插件,但不能安装插件:plugins.install 只会打开审查页面,由你决定是否安装。
远程插件的安全性
远程插件运行在别人的服务器上。它收不到校园凭据、会话或你的其他数据,只能拿到助手发给它的工具输入。
它的工具都是不可信的,修改类效果默认先询问你。系统提示词里关于它的那一段也会说明,它的输出只是数据。只有在维护者审查过源码之后,注册表才会把它的条目标记为 verified。
PKU harness Cloud
可选的云服务默认使用端到端加密。它只通过一对密钥识别设备,不涉及学号或姓名。每个插件使用云服务之前,都要单独征得你的同意,并附上通俗易懂的说明。详见 Cloud → 安全。
报告漏洞
请按照 pkuinfo/pku-harness 或 pkuinfo/pku-harness-plugins 仓库中 SECURITY.md 的说明,私下报告漏洞。请不要公开提 issue。