安全

先有许可, 才有能力。

一个能读你的文件、在你的机器上运行命令、写入你的数据库并向互联网发布内容的智能体,只有在由你决定它能碰什么时才是安全的。每项工具都属于某个权限类别;决定向你发问的是类别,而不是工具本身。而有三种行为,在任何模式下都无法被提前授权。

8 个类别靠许可,不靠信任
3 种行为每次都问,哪怕是完全访问
1 把签名密钥完全不放在公开 API 上
是什么限制了智能体

在指令与你的数据之间,
隔着四样东西。

它们没有一样是模型的良好判断。一个一百次里对九十九次的模型,不是权限系统。

四种模式

询问、自动、计划、完全。计划模式只读,并且干脆拒绝:它把计划交给你,然后告诉你若要执行就请切换模式。模式是上限,不是建议。

八个类别

读取、写入、运行命令、改动数据库或存储桶、写入 DNS 记录、发送消息、发布到互联网、花费积分。读取从不发问。而改动数据库或 DNS,即使在自动模式下也要问。

三种无法提前授权

给某人发送消息、在公共互联网上发布,以及把积分花在模型调用以外的事情上。每一次都要问,包括完全访问——这三种都没有「始终允许」,因为它们都收不回来。

每次作答都有上限

每一次运行都带着积分预算。到达上限它就停下,而不是让你事后才发现花了多少——而会花钱的工具无论预算还剩多少,都要先问过你。

它如何构建

九项机制,
以及每一项的理由。

依据实现它们的代码写成。某项措施若有局限,局限就写在本页更下方,而不是略去不提。

会话
你的 API 密钥会换成一个用椭圆曲线密钥签名的短期会话。公开 API 只持有公钥那一半:它能验证会话,却无法创建会话。即便被攻破,它也无法给自己造一个身份。
你的凭据
你交出的连接串或访问密钥,会以 AES-256-GCM 静态加密,并且绝不离开服务器。智能体看到的是集合、表和前缀——绝不是你的密钥。加密密钥通过一个重新加密的脚本轮换,而不是靠改一个配置文件。
对外请求
服务器抓取的每个 URL 都会在请求之前完成解析,一旦落到私有、回环、链路本地或保留地址就会被拒绝——首当其冲的是会派发身份令牌的云元数据端点。非 HTTP 协议会被拒绝,基础设施端口会被封锁,重定向则由代码逐跳手动跟随并重新检查,否则一次重定向就能绕开整道检查。这一点对那个会跟随提示词文本中 URL 的工具尤其要紧。
错误
意外故障只回一条通用消息和一个引用编号;完整细节以同一编号写进我们的日志。而确实会到你手上的消息——一次失败的转换、一个加载不出的页面——都已剥去数据库 URI、凭据、可识别的密钥、内部地址、云项目标识和服务器路径。
上传
来自请求的文件名绝不会变成路径。它被截取到最后一段,保留字符被剔除,解析后的路径还必须落在上传目录之内,否则写入被拒。双保险,因为这道检查的第一版并不够用。
速率限制
按访客自己的地址计数,而转发头只有来自本地中继时才被采信——把服务器配置成相信任何客户端的说法,会在启动时被直接拒绝。在这项修复之前,所有访客都算作同一个地址,于是任何人输错二十次密码,就会把所有人的登录一起锁住。
部署
环境变量文件、Git 目录和依赖目录绝不随之上传,被略去的内容会连同原因一并返回给你。路径无法越出根目录。应用的服务端代码会被从公开文件中取出,而不是作为其中之一对外提供——若留在里面,它会把应用的源码发布在应用自己的站点上。
你的邮件
你域名的 DKIM 私钥经过加密,绝不离开服务器,而且是被保留而非重新生成——换一把新密钥,会让你已经寄出的邮件签名全部失效。消息以你的域名签名,而不是我们的。而发件人的 HTML 在阅读器里从不渲染:它被削成纯文本,否则任何给你写信的人都能在你的会话里执行脚本。
机密
没有任何机密带有硬编码的兜底值——缺失的机密会让启动停下,而不是悄悄用上一个到处都一样的默认值。公开 API 若持有本不该由它持有的密钥,就会拒绝启动:签名密钥正是这样留在它该在的地方。
我们不作何种声称

这个页面没有告诉你的
四件事。

一个只罗列长处的安全页面,不过是一本宣传册。以下是我们已知的局限。

我们没有任何认证
没有 SOC 2,没有 ISO 27001,也没有第三方渗透测试报告。我们是一家小公司,不会用一枚徽章去暗示相反的事。我们能拿出来的是机制本身——这也正是本页描述事情如何运作、而不是谁审计过它们的原因。
URL 守卫做解析,不做固定
地址是在请求之前检查的,而不是在整个请求期间被握住,因此一个片刻之后给出不同答案的域名并没有被挡住。要关上这扇门,就得在建立连接的那一刻固定住已验证的地址,而我们使用的 HTTP 客户端和浏览器引擎都没有简单地提供这一点。我们宁愿在这里点明,也不愿让这道守卫显得滴水不漏。
终端不是沙箱
在你自己的电脑上,智能体以你的权限运行,而权限询问就是那道保护——不是牢笼。正因如此,计划模式才是只读的;正因如此,一条命令的批准才只算作那条命令、不扩大半分;也正因如此,这一切的云端版本是关着而不是开着的。
已接收不等于已送达
我们的中继在消息进入队列的那一刻就交还控制权;收件人的服务商之后如何处理,从不会回报给我们。我们会告诉你一封邮件究竟从哪个地址寄出,也会拒绝用一个你没有选择的地址去寄——但没有人能向你承诺一个收件箱。
报告

发现了什么?
告诉我们。

写信到 contact@iagenify.com,并在主题行开头加上「Security」。请写明你做了什么、看到了什么,以及平台若给过你引用编号也一并附上。如果概念验证触及了数据,请说明是谁的数据——包括那是你自己的。

我们会读

是人,不是队列。如果问题属实,你会知道我们正在怎么处理。

我们没有赏金

没有报酬,我们也不会假装有。事先说清楚,比让你在做完之后才发现要公道。

请不要走得比必要更远

不要拒绝服务攻击,不要碰第三方的数据,不要动不属于你的账户。足以说明问题,然后就停下。

常见问题

安全, 细节说明。

智能体有哪些事不问我就能做?

读取、委派给子智能体,以及写它自己的笔记。其余一切都取决于类别和模式:在自动模式下写文件是自由的,而改动数据库或 DNS 即使在那里也要问,至于发送、发布与花费,无论模式怎么说都每次都要问。

智能体的工具结果存在哪里?

存在运行该智能体的设备上。我们的数据库只保留这一步本身——哪个工具、一个简短的目标、是否成功、花了多少、用了多久——而绝不保留结果的内容。这种切分是刻意的:发生了什么的记录对你有用,而你文件里的内容并不归我们保管。

智能体能触及你们的内部服务吗?

不能。地址检查即使在开发环境下也默认开启,而唯一一处本可以把工作流指向私有地址的地方,那个后门默认是关的——这个 API 是公开的,在那里图一时开发方便,就等于让任何账户都能读到来自我们自己网络的响应。

如果我的 API 密钥泄露了会怎样?

换掉它。密钥以哈希形式存储,而不是密钥本身,所以我们无法再把它显示给你——只能签发新的并停用旧的。由密钥派生出的会话是短期的,并且绑定在一个我们可以终止的会话族上。

你们有漏洞赏金计划吗?

没有。但还是请写信给我们,主题行开头加上「Security」。我们非常希望是从你这里听到。

这些有经过审计吗?

没有第三方审计。这些检查都是我们自己的:不联网的单元测试套件,一个从容器内部回读每一项容器限额的脚本,一个创建一次性账户、部署一个真实站点、然后把自己造出来的一切删干净的脚本,以及一个把登录流程从头跑到尾的脚本。我们宁愿告诉你这些检查是谁做的,也不愿让「已验证」这个词替我们完成工作。